]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/61964 (krb5 database propagation enters infinite loop; reduce...
authorRichard Biener <rguenther@suse.de>
Fri, 1 Aug 2014 07:40:01 +0000 (07:40 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 1 Aug 2014 07:40:01 +0000 (07:40 +0000)
2014-08-01  Richard Biener  <rguenther@suse.de>

PR tree-optimization/61964
* tree-ssa-tail-merge.c (gimple_operand_equal_value_p): New
function merged from trunk.
(gimple_equal_p): Handle non-SSA LHS solely by structural
equality.

* gcc.dg/torture/pr61964.c: New testcase.
* gcc.dg/pr51879-18.c: XFAIL.

From-SVN: r213405

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr51879-18.c
gcc/testsuite/gcc.dg/torture/pr61964.c [new file with mode: 0644]
gcc/tree-ssa-tail-merge.c

index fb1ebec5f80f3be84ee51c994e2c583f2fea5395..7813061ec446916de4cdc01aaca2a33a22b0c32b 100644 (file)
@@ -1,3 +1,11 @@
+2014-08-01  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/61964
+       * tree-ssa-tail-merge.c (gimple_operand_equal_value_p): New
+       function merged from trunk.
+       (gimple_equal_p): Handle non-SSA LHS solely by structural
+       equality.
+
 2014-07-25  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/alpha/elf.h: Define TARGET_UNWIND_TABLES_DEFAULT.
index da156a60226e7d60c9d1ec20fb8b49de706c33bf..675ec254df309f7726c2addb07e295d095bb7413 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-01  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/61964
+       * gcc.dg/torture/pr61964.c: New testcase.
+       * gcc.dg/pr51879-18.c: XFAIL.
+
 2014-07-28  Richard Biener  <rguenther@suse.de>
 
        PR rtl-optimization/61801
index 95629f12261d79482c4a510c8cbea9edde575d32..9b3cb80a4e6fa65acaf043cf2a88f39bb6d8aa52 100644 (file)
@@ -13,5 +13,5 @@ void bar (int c, int *p)
     *q = foo ();
 }
 
-/* { dg-final { scan-tree-dump-times "foo \\(" 1 "pre"} } */
+/* { dg-final { scan-tree-dump-times "foo \\(" 1 "pre" { xfail *-*-* } } } */
 /* { dg-final { cleanup-tree-dump "pre" } } */
diff --git a/gcc/testsuite/gcc.dg/torture/pr61964.c b/gcc/testsuite/gcc.dg/torture/pr61964.c
new file mode 100644 (file)
index 0000000..a03cfdc
--- /dev/null
@@ -0,0 +1,33 @@
+/* { dg-do run } */
+
+extern void abort (void);
+
+struct node { struct node *next, *prev; } node;
+struct head { struct node *first; } heads[5];
+int k = 2;
+struct head *head = &heads[2];
+
+static int __attribute__((noinline))
+foo()
+{
+  node.prev = (void *)head;
+  head->first = &node;
+
+  struct node *n = head->first;
+  struct head *h = &heads[k];
+
+  if (n->prev == (void *)h)
+    h->first = n->next;
+  else
+    n->prev->next = n->next;
+
+  n->next = h->first;
+  return n->next == &node;
+}
+
+int main()
+{
+  if (foo ())
+    abort ();
+  return 0;
+}
index 419b4ec024e901f70376f72df4428fca5729ccea..61add6e0445961c8618e4ad4eb1d940093cf6330 100644 (file)
@@ -1060,6 +1060,24 @@ set_cluster (basic_block bb1, basic_block bb2)
     gcc_unreachable ();
 }
 
+/* Return true if gimple operands T1 and T2 have the same value.  */
+
+static bool
+gimple_operand_equal_value_p (tree t1, tree t2)
+{
+  if (t1 == t2)
+    return true;
+
+  if (t1 == NULL_TREE
+      || t2 == NULL_TREE)
+    return false;
+
+  if (operand_equal_p (t1, t2, 0))
+    return true;
+
+  return gvn_uses_equal (t1, t2);
+}
+
 /* Return true if gimple statements S1 and S2 are equal.  Gimple_bb (s1) and
    gimple_bb (s2) are members of SAME_SUCC.  */
 
@@ -1122,8 +1140,9 @@ gimple_equal_p (same_succ same_succ, gimple s1, gimple s2)
       lhs2 = gimple_get_lhs (s2);
       if (TREE_CODE (lhs1) != SSA_NAME
          && TREE_CODE (lhs2) != SSA_NAME)
-       return (vn_valueize (gimple_vdef (s1))
-               == vn_valueize (gimple_vdef (s2)));
+       return (operand_equal_p (lhs1, lhs2, 0)
+               && gimple_operand_equal_value_p (gimple_assign_rhs1 (s1),
+                                                gimple_assign_rhs1 (s2)));
       else if (TREE_CODE (lhs1) == SSA_NAME
               && TREE_CODE (lhs2) == SSA_NAME)
        return vn_valueize (lhs1) == vn_valueize (lhs2);