]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/80162 (ICE on invalid code (address of register variable))
authorJeff Law <law@redhat.com>
Tue, 28 Mar 2017 03:22:25 +0000 (21:22 -0600)
committerJeff Law <law@gcc.gnu.org>
Tue, 28 Mar 2017 03:22:25 +0000 (21:22 -0600)
        PR tree-optimization/80162
* tree-ssa-dom.c (derive_equivalences_from_bit_ior): Fix typo in
function name.  Limit recursion depth.
(record_temporary_equivalences): Corresponding changes.

PR tree-optimization/80162
* gcc.c-torture/compile/pr80216.c: New test.

From-SVN: r246517

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr80216.c [new file with mode: 0644]
gcc/tree-ssa-dom.c

index a45168e67f682914e19d6cf4fde505dbbab6beaf..10bb56bada237b99efc162436aae38336d3fd0cd 100644 (file)
@@ -1,3 +1,10 @@
+017-03-27  Jeff Law  <law@redhat.com>
+
+        PR tree-optimization/80162
+       * tree-ssa-dom.c (derive_equivalences_from_bit_ior): Fix typo in
+       function name.  Limit recursion depth.
+       (record_temporary_equivalences): Corresponding changes.
+
 2017-03-27  Jonathan Wakely  <jwakely@redhat.com>
 
        * doc/invoke.texi (-Wno-narrowing): Reorder so default behavior is
index 14f6d6b5408b2b3b173879f4c435233d50dd2656..9c7f2cf9ae9e695e8f5de18c9f770ffe6333b034 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-27  Jeff Law  <law@redhat.com>
+
+       PR tree-optimization/80162
+       * gcc.c-torture/compile/pr80216.c: New test.
+
 2017-03-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/80162
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr80216.c b/gcc/testsuite/gcc.c-torture/compile/pr80216.c
new file mode 100644 (file)
index 0000000..cf5b27d
--- /dev/null
@@ -0,0 +1,37 @@
+int u4, lx, e0, zy, pz;
+
+void
+tb (int m6)
+{
+  for (pz = 0; pz < 1; ++pz)
+    {
+      for (zy = 0; zy < 1; ++zy)
+        for (u4 = 0; u4 < 1; ++u4)
+          for (e0 = 0; e0 < 1; ++e0)
+            {
+ as:
+              for (;;)
+                {
+                }
+            }
+
+      if (e0 != 0)
+        goto ql;
+
+      if (0)
+        {
+ o3:
+          for (lx = 0; lx < 1; ++lx)
+            {
+              m6 |= lx;
+              if (m6 == 0)
+                lx = 0;
+ ql:
+              ;
+            }
+          goto as;
+        }
+    }
+  goto o3;
+}
+
index c6ffc38e1a8f1d89ddb4ad84e7bdf3862c6c3cc6..d2263bb13e698c41ca7262972f3b2b45a00b2c90 100644 (file)
@@ -692,11 +692,18 @@ back_propagate_equivalences (tree lhs, edge e,
 }
 
 /* Record NAME has the value zero and if NAME was set from a BIT_IOR_EXPR
-   recurse into both operands recording their values as zero too.  */
+   recurse into both operands recording their values as zero too. 
+   RECURSION_DEPTH controls how far back we recurse through the operands
+   of the BIT_IOR_EXPR.  */
 
 static void
-derive_equivalencs_from_bit_ior (tree name, const_and_copies *const_and_copies)
+derive_equivalences_from_bit_ior (tree name,
+                                 const_and_copies *const_and_copies,
+                                 int recursion_limit)
 {
+  if (recursion_limit == 0)
+    return;
+
   if (TREE_CODE (name) == SSA_NAME)
     {
       tree value = fold_convert (TREE_TYPE (name), integer_zero_node);
@@ -710,10 +717,12 @@ derive_equivalencs_from_bit_ior (tree name, const_and_copies *const_and_copies)
       if (is_gimple_assign (def_stmt)
          && gimple_assign_rhs_code (def_stmt) == BIT_IOR_EXPR)
        {
-         derive_equivalencs_from_bit_ior (gimple_assign_rhs1 (def_stmt),
-                                          const_and_copies);
-         derive_equivalencs_from_bit_ior (gimple_assign_rhs2 (def_stmt),
-                                          const_and_copies);
+         derive_equivalences_from_bit_ior (gimple_assign_rhs1 (def_stmt),
+                                           const_and_copies,
+                                           recursion_limit - 1);
+         derive_equivalences_from_bit_ior (gimple_assign_rhs2 (def_stmt),
+                                           const_and_copies,
+                                           recursion_limit - 1);
        }
     }
 }
@@ -751,7 +760,7 @@ record_temporary_equivalences (edge e,
              enum tree_code code = eq->cond.ops.binary.op;
              if ((code == EQ_EXPR && eq->value == boolean_true_node)
                  || (code == NE_EXPR && eq->value == boolean_false_node))
-               derive_equivalencs_from_bit_ior (op0, const_and_copies);
+               derive_equivalences_from_bit_ior (op0, const_and_copies, 4);
 
              /* TODO: We could handle BIT_AND_EXPR in a similar fashion
                 recording that the operands have a nonzero value.  */