revert: re PR rtl-optimization/57381 (array of volatile pointers hangs gcc)
authorRichard Biener <rguenther@suse.de>
Mon, 27 May 2013 12:44:29 +0000 (12:44 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 27 May 2013 12:44:29 +0000 (12:44 +0000)
2013-05-27  Richard Biener  <rguenther@suse.de>

Revert
PR middle-end/57381
* fold-const.c (operand_equal_p): Compare FIELD_DECLs with
OEP_CONSTANT_ADDRESS_OF retained.

PR tree-optimization/57417
* tree-ssa-sccvn.c (vn_reference_fold_indirect): Fix test
for unchanged base.
(set_ssa_val_to): Compare addresses using
get_addr_base_and_unit_offset.

* gcc.dg/torture/pr57417.c: New testcase.

From-SVN: r199356

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr57417.c [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index a8c366b608682b4921addab0661d12ed112f8f47..8b7bed89d4b05ca2c8565a1429e0ba457847c594 100644 (file)
@@ -1,3 +1,16 @@
+2013-05-27  Richard Biener  <rguenther@suse.de>
+
+       Revert
+       PR middle-end/57381
+       * fold-const.c (operand_equal_p): Compare FIELD_DECLs with
+       OEP_CONSTANT_ADDRESS_OF retained.
+
+       PR tree-optimization/57417
+       * tree-ssa-sccvn.c (vn_reference_fold_indirect): Fix test
+       for unchanged base.
+       (set_ssa_val_to): Compare addresses using
+       get_addr_base_and_unit_offset.
+
 2013-05-27  Joern Rennecke <joern.rennecke@embecosm.com>
 
        PR rtl-optimization/56833
index 38db3f1d83231fc73f583f6dbd30a568139ddc38..a2b7ac183126ec6d28afcef4ecea6ca5068809a0 100644 (file)
@@ -2664,10 +2664,10 @@ operand_equal_p (const_tree arg0, const_tree arg1, unsigned int flags)
        case COMPONENT_REF:
          /* Handle operand 2 the same as for ARRAY_REF.  Operand 0
             may be NULL when we're called to compare MEM_EXPRs.  */
-         if (!OP_SAME_WITH_NULL (0) || !OP_SAME (1))
+         if (!OP_SAME_WITH_NULL (0))
            return 0;
          flags &= ~OEP_CONSTANT_ADDRESS_OF;
-         return OP_SAME_WITH_NULL (2);
+         return OP_SAME (1) && OP_SAME_WITH_NULL (2);
 
        case BIT_FIELD_REF:
          if (!OP_SAME (0))
index d0f01c84c010e8249549287c28a84de165f1c60b..7cf47c4f51410ba07dd1a3234d75fa08df68c2d9 100644 (file)
@@ -1,3 +1,8 @@
+2013-05-27  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/57417
+       * gcc.dg/torture/pr57417.c: New testcase.
+
 2013-05-27  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/57396
diff --git a/gcc/testsuite/gcc.dg/torture/pr57417.c b/gcc/testsuite/gcc.dg/torture/pr57417.c
new file mode 100644 (file)
index 0000000..6eac6f9
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+int a, b;
+volatile int *c;
+
+void foo ()
+{
+  volatile int d[1];
+  b = 0;
+  for (;; a--)
+    c = &d[b];
+}
index 0e7a74c2a9c3d0be641600c9020cefd9ce22c8f3..6886efbe3eb1f1f341e796c5c85abc58e870cec7 100644 (file)
@@ -1145,7 +1145,7 @@ vn_reference_fold_indirect (vec<vn_reference_op_s> *ops,
   addr_base = get_addr_base_and_unit_offset (TREE_OPERAND (op->op0, 0),
                                             &addr_offset);
   gcc_checking_assert (addr_base && TREE_CODE (addr_base) != MEM_REF);
-  if (addr_base != op->op0)
+  if (addr_base != TREE_OPERAND (op->op0, 0))
     {
       double_int off = tree_to_double_int (mem_op->op0);
       off = off.sext (TYPE_PRECISION (TREE_TYPE (mem_op->op0)));
@@ -2608,6 +2608,7 @@ static inline bool
 set_ssa_val_to (tree from, tree to)
 {
   tree currval = SSA_VAL (from);
+  HOST_WIDE_INT toff, coff;
 
   if (from != to)
     {
@@ -2643,7 +2644,17 @@ set_ssa_val_to (tree from, tree to)
       print_generic_expr (dump_file, to, 0);
     }
 
-  if (currval != to  && !operand_equal_p (currval, to, OEP_PURE_SAME))
+  if (currval != to
+      && !operand_equal_p (currval, to, 0)
+      /* ???  For addresses involving volatile objects or types operand_equal_p
+         does not reliably detect ADDR_EXPRs as equal.  We know we are only
+        getting invariant gimple addresses here, so can use
+        get_addr_base_and_unit_offset to do this comparison.  */
+      && !(TREE_CODE (currval) == ADDR_EXPR
+          && TREE_CODE (to) == ADDR_EXPR
+          && (get_addr_base_and_unit_offset (TREE_OPERAND (currval, 0), &coff)
+              == get_addr_base_and_unit_offset (TREE_OPERAND (to, 0), &toff))
+          && coff == toff))
     {
       VN_INFO (from)->valnum = to;
       if (dump_file && (dump_flags & TDF_DETAILS))