OSDN Git Service

2012-02-21 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 Feb 2012 12:37:33 +0000 (12:37 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 21 Feb 2012 12:37:33 +0000 (12:37 +0000)
PR tree-optimization/52324
* gimplify.c (gimplify_expr): When re-gimplifying expressions
do not gimplify a MEM_REF address operand if it is already
in suitable form.

* gcc.dg/tree-ssa/ssa-lim-10.c: New testcase.

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

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-10.c [new file with mode: 0644]

index 87dac53..4388b68 100644 (file)
@@ -1,3 +1,10 @@
+2012-02-21  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/52324
+       * gimplify.c (gimplify_expr): When re-gimplifying expressions
+       do not gimplify a MEM_REF address operand if it is already
+       in suitable form.
+
 2012-02-21  Andreas Krebbel  <Andreas.Krebbel@de.ibm.com>
 
        * config/s390/s390.md ("fixuns_trunc<mode>si2"): Replace
index 782adc3..a214134 100644 (file)
@@ -7061,15 +7061,23 @@ gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
              ret = GS_OK;
              break;
            }
-         ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
-                              is_gimple_mem_ref_addr, fb_rvalue);
-         if (ret == GS_ERROR)
-           break;
+         /* Avoid re-gimplifying the address operand if it is already
+            in suitable form.  Re-gimplifying would mark the address
+            operand addressable.  Always gimplify when not in SSA form
+            as we still may have to gimplify decls with value-exprs.  */
+         if (!gimplify_ctxp || !gimplify_ctxp->into_ssa
+             || !is_gimple_mem_ref_addr (TREE_OPERAND (*expr_p, 0)))
+           {
+             ret = gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
+                                  is_gimple_mem_ref_addr, fb_rvalue);
+             if (ret == GS_ERROR)
+               break;
+           }
          recalculate_side_effects (*expr_p);
          ret = GS_ALL_DONE;
          break;
 
-         /* Constants need not be gimplified.  */
+       /* Constants need not be gimplified.  */
        case INTEGER_CST:
        case REAL_CST:
        case FIXED_CST:
index 0fe2f69..5592364 100644 (file)
@@ -1,3 +1,8 @@
+2012-02-21  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/52324
+       * gcc.dg/tree-ssa/ssa-lim-10.c: New testcase.
+
 2012-02-21  Georg-Johann Lay  <avr@gjlay.de>
 
        PR middle-end/51782
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-10.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-10.c
new file mode 100644 (file)
index 0000000..bc14926
--- /dev/null
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-lim1-details" } */
+
+int *l, *r;
+int test_func(void)
+{
+  int i;
+  int direction;
+  static int pos;
+
+  pos = 0;
+  direction = 1;
+
+  for ( i = 0; i <= 400; i++ )
+    {
+      if ( direction == 0 )
+       pos = l[pos];
+      else
+       pos = r[pos];
+
+      if ( pos == -1 )
+       {
+         pos = 0;
+         direction = !direction;
+       }
+    }
+  return i;
+}
+
+/* { dg-final { scan-tree-dump "Executing store motion of pos" "lim1" } } */
+/* { dg-final { cleanup-tree-dump "lim1" } } */