Another small phiprop improvement, in some cases
we could have a vop defining statement be a phi which might
be the same bb as the load happens. This is ok since the phi
here is not a store so we can just accept it.
Bootstrapped and tested on x86_64-linux-gnu.
PR tree-optimization/116824
gcc/ChangeLog:
* tree-ssa-phiprop.cc (propagate_with_phi): Don't
reject if the bb of the def_stmt is the same as load
and if the def_stmt was a phi.
gcc/testsuite/ChangeLog:
* gcc.dg/tree-ssa/phiprop-3.c: New test.
Signed-off-by: Andrew Pinski <[email protected]>
---
gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c | 30 +++++++++++++++++++++++
gcc/tree-ssa-phiprop.cc | 3 ++-
2 files changed, 32 insertions(+), 1 deletion(-)
create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c
b/gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c
new file mode 100644
index 00000000000..a0d5891dc60
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-phiprop1-details -fdump-tree-cselim-details
-fdump-tree-phiopt2" } */
+
+/* PR tree-optimization/116824 */
+/* phiprop should be able to handle the case where the vops defining
+ statement was a phi in the same bb as the deference. */
+
+int g(int i, int *tt)
+{
+ const int t = 10;
+ const int *a;
+ {
+ if (t < i)
+ {
+ *tt = 1;
+ a = &t;
+ }
+ else
+ {
+ *tt = 1;
+ a = &i;
+ }
+ }
+ return *a;
+}
+
+/* { dg-final { scan-tree-dump-times "Inserting PHI for result of load" 1
"phiprop1"} } */
+/* { dg-final { scan-tree-dump-times "factoring out stores" 1 "cselim"} } */
+/* { dg-final { scan-tree-dump-times "MIN_EXPR" 1 "phiopt2"} } */
+
diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc
index f04990e8cb4..4d1df7d351e 100644
--- a/gcc/tree-ssa-phiprop.cc
+++ b/gcc/tree-ssa-phiprop.cc
@@ -401,7 +401,8 @@ propagate_with_phi (basic_block bb, gphi *phi, struct
phiprop_d *phivn,
def_stmt = SSA_NAME_DEF_STMT (vuse);
}
if (!SSA_NAME_IS_DEFAULT_DEF (vuse)
- && (gimple_bb (def_stmt) == bb
+ && ((gimple_bb (def_stmt) == bb
+ && !is_a<gphi *>(def_stmt))
|| (gimple_bb (def_stmt)
&& !dominated_by_p (CDI_DOMINATORS,
bb, gimple_bb (def_stmt)))))
--
2.43.0