re PR tree-optimization/48694 (possible memory hog bug)
authorRichard Guenther <rguenther@suse.de>
Tue, 26 Apr 2011 09:21:44 +0000 (09:21 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 26 Apr 2011 09:21:44 +0000 (09:21 +0000)
2011-04-26  Richard Guenther  <rguenther@suse.de>

PR middle-end/48694
* tree.h (OEP_CONSTANT_ADDRESS_OF): New operand_equal_flag.
* fold-const.c (operand_equal_p): For TREE_CONSTANT ADDR_EXPRs
compare the operands with OEP_CONSTANT_ADDRESS_OF.  Treat
trees with TREE_SIDE_EFFECTS equal when OEP_CONSTANT_ADDRESS_OF
is set.

* gcc.dg/torture/pr48694-1.c: New testcase.
* gcc.dg/torture/pr48694-2.c: Likewise.

From-SVN: r172954

gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr48694-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr48694-2.c [new file with mode: 0644]
gcc/tree.h

index 8f90f6f108afd66aca62e99e7738fc7069b72a48..1aa0dec00110f565022680151f27abc39eb0a156 100644 (file)
@@ -2473,9 +2473,12 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
      equal if they have no side effects.  If we have two identical
      expressions with side effects that should be treated the same due
      to the only side effects being identical SAVE_EXPR's, that will
-     be detected in the recursive calls below.  */
+     be detected in the recursive calls below.
+     If we are taking an invariant address of two identical objects
+     they are necessarily equal as well.  */
   if (arg0 == arg1 && ! (flags & OEP_ONLY_CONST)
       && (TREE_CODE (arg0) == SAVE_EXPR
+         || (flags & OEP_CONSTANT_ADDRESS_OF)
          || (! TREE_SIDE_EFFECTS (arg0) && ! TREE_SIDE_EFFECTS (arg1))))
     return 1;
 
@@ -2538,7 +2541,8 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
 
       case ADDR_EXPR:
        return operand_equal_p (TREE_OPERAND (arg0, 0), TREE_OPERAND (arg1, 0),
-                               0);
+                               TREE_CONSTANT (arg0) && TREE_CONSTANT (arg1)
+                               ? OEP_CONSTANT_ADDRESS_OF : 0);
       default:
        break;
       }
index f464fa416195de762a3dd43c11d8e3747c28694a..5efb6b164b5464a690a650ed7188a0e3e6208c1c 100644 (file)
@@ -1,3 +1,9 @@
+2011-04-26  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/48694
+       * gcc.dg/torture/pr48694-1.c: New testcase.
+       * gcc.dg/torture/pr48694-2.c: Likewise.
+
 2011-04-25  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * g++.dg/ext/underlying_type1.C: New.
diff --git a/gcc/testsuite/gcc.dg/torture/pr48694-1.c b/gcc/testsuite/gcc.dg/torture/pr48694-1.c
new file mode 100644 (file)
index 0000000..810366b
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+
+extern volatile int g_89[5][9];
+extern int g, *gp;
+void func_64()
+{
+  int i;
+  for (i = 0; i < 1; )
+    {
+      for (g = 0; g < 1; )
+       return;
+      gp = (int *)&g_89[g][0];
+    }
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr48694-2.c b/gcc/testsuite/gcc.dg/torture/pr48694-2.c
new file mode 100644 (file)
index 0000000..4791ac3
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+extern volatile int g_4[1][4];
+extern int g_7;
+void modify(int *);
+void func_2()
+{
+  int l_46 = 4;
+  if (g_7)
+    modify(&l_46);
+  else
+    {
+      int i;
+      for (i = 0; i != 5; i += 1)
+       {
+         volatile int *vp = &g_4[0][l_46];
+         *vp = 0;
+       }
+    }
+}
index 0bc98cd01b46691ae9fdab162326e3c65adb74e6..8f25832589f570d05ed8403dd93f5c95f6e5a1f0 100644 (file)
@@ -5118,7 +5118,8 @@ extern tree fold_fma (location_t, tree, tree, tree, tree);
 enum operand_equal_flag
 {
   OEP_ONLY_CONST = 1,
-  OEP_PURE_SAME = 2
+  OEP_PURE_SAME = 2,
+  OEP_CONSTANT_ADDRESS_OF = 4
 };
 
 extern int operand_equal_p (const_tree, const_tree, unsigned int);