2013-05-23 Richard Biener <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 23 May 2013 12:23:59 +0000 (12:23 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 23 May 2013 12:23:59 +0000 (12:23 +0000)
PR tree-optimization/57380
* tree-ssa-phiprop.c (propagate_with_phi): Do not require at
least one invariant or re-used load.
* passes.c (init_optimization_passes): Move pass_phiprop before
pass_forwprop.

* g++.dg/tree-ssa/pr57380.C: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199246 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/passes.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr57380.C [new file with mode: 0644]
gcc/tree-ssa-phiprop.c

index fdfa20c..0c46d03 100644 (file)
@@ -1,3 +1,11 @@
+2013-05-23  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/57380
+       * tree-ssa-phiprop.c (propagate_with_phi): Do not require at
+       least one invariant or re-used load.
+       * passes.c (init_optimization_passes): Move pass_phiprop before
+       pass_forwprop.
+
 2013-05-23  James Greenhalgh  <james.greenhalgh@arm.com>
 
        * config/aarch64/aarch64-simd.md
index 0f1d214..02f2022 100644 (file)
@@ -1402,12 +1402,12 @@ init_optimization_passes (void)
       NEXT_PASS (pass_ccp);
       /* After CCP we rewrite no longer addressed locals into SSA
         form if possible.  */
+      NEXT_PASS (pass_phiprop);
       NEXT_PASS (pass_forwprop);
       /* pass_build_alias is a dummy pass that ensures that we
         execute TODO_rebuild_alias at this point.  */
       NEXT_PASS (pass_build_alias);
       NEXT_PASS (pass_return_slot);
-      NEXT_PASS (pass_phiprop);
       NEXT_PASS (pass_fre);
       NEXT_PASS (pass_copy_prop);
       NEXT_PASS (pass_merge_phi);
index db6e9fa..0a22b4a 100644 (file)
@@ -1,5 +1,10 @@
 2013-05-23  Richard Biener  <rguenther@suse.de>
 
+       PR tree-optimization/57380
+       * g++.dg/tree-ssa/pr57380.C: New testcase.
+
+2013-05-23  Richard Biener  <rguenther@suse.de>
+
        PR middle-end/57381
        * gcc.dg/torture/pr57381.c: New testcase.
 
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr57380.C b/gcc/testsuite/g++.dg/tree-ssa/pr57380.C
new file mode 100644 (file)
index 0000000..0a2b2ad
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-phiopt1" } */
+
+struct my_array {
+    int data[4];
+};
+
+const int& my_max(const int& a, const int& b) {
+    return a < b ? b : a;
+}
+
+int f(my_array a, my_array b) {
+    int res = 0;
+    for (int i = 0; i < 4; ++i) {
+       res += my_max(a.data[i], b.data[i]);
+    }
+    return res;
+}
+
+/* { dg-final { scan-tree-dump "MAX_EXPR" "phiopt1" } } */
+/* { dg-final { cleanup-tree-dump "phiopt1" } } */
index 6555ae3..96d7ba6 100644 (file)
@@ -247,7 +247,6 @@ propagate_with_phi (basic_block bb, gimple phi, struct phiprop_d *phivn,
   ssa_op_iter i;
   bool phi_inserted;
   tree type = NULL_TREE;
-  bool one_invariant = false;
 
   if (!POINTER_TYPE_P (TREE_TYPE (ptr))
       || !is_gimple_reg_type (TREE_TYPE (TREE_TYPE (ptr))))
@@ -282,17 +281,8 @@ propagate_with_phi (basic_block bb, gimple phi, struct phiprop_d *phivn,
       if (!type
          && TREE_CODE (arg) == SSA_NAME)
        type = TREE_TYPE (phivn[SSA_NAME_VERSION (arg)].value);
-      if (TREE_CODE (arg) == ADDR_EXPR
-         && is_gimple_min_invariant (arg))
-       one_invariant = true;
     }
 
-  /* If we neither have an address of a decl nor can reuse a previously
-     inserted load, do not hoist anything.  */
-  if (!one_invariant
-      && !type)
-    return false;
-
   /* Find a dereferencing use.  First follow (single use) ssa
      copy chains for ptr.  */
   while (single_imm_use (ptr, &use, &use_stmt)