re PR rtl-optimization/79780 (ICE in rtl_verify_bb_insns, at cfgrtl.c:2661 (error...
authorJakub Jelinek <jakub@redhat.com>
Thu, 2 Mar 2017 16:02:37 +0000 (17:02 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 2 Mar 2017 16:02:37 +0000 (17:02 +0100)
PR rtl-optimization/79780
* cprop.c (one_cprop_pass): When second and further conditional trap
in a single basic block is turned into an unconditional trap, turn it
into a deleted note to avoid RTL verification failures.

* gcc.c-torture/compile/pr79780.c: New test.

From-SVN: r245843

gcc/ChangeLog
gcc/cprop.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr79780.c [new file with mode: 0644]

index d5e438c883f0722d541cf707c361c8c9bdc643af..4663d438a916e1a5d80eee0836200b3d1a101151 100644 (file)
@@ -1,3 +1,10 @@
+2017-03-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/79780
+       * cprop.c (one_cprop_pass): When second and further conditional trap
+       in a single basic block is turned into an unconditional trap, turn it
+       into a deleted note to avoid RTL verification failures.
+
 2017-03-02  Richard Biener  <rguenther@suse.de>
 
        * fold-const.c (const_binop): Use ulow () instead of elt (0).
index 7d20c4434b670ab6ed19d1db56371c9bfc4ca818..4814b5e97c0690b43f12f1f052f8d5b73301a685 100644 (file)
@@ -1852,12 +1852,22 @@ one_cprop_pass (void)
                if (! NOTE_P (insn) && ! insn->deleted ())
                  mark_oprs_set (insn);
 
-               if (!was_uncond_trap && !seen_uncond_trap
+               if (!was_uncond_trap
                    && GET_CODE (PATTERN (insn)) == TRAP_IF
                    && XEXP (PATTERN (insn), 0) == const1_rtx)
                  {
-                   seen_uncond_trap = true;
-                   uncond_traps.safe_push (insn);
+                   /* If we have already seen an unconditional trap
+                      earlier, the rest of the bb is going to be removed
+                      as unreachable.  Just turn it into a note, so that
+                      RTL verification doesn't complain about it before
+                      it is finally removed.  */
+                   if (seen_uncond_trap)
+                     set_insn_deleted (insn);
+                   else
+                     {
+                       seen_uncond_trap = true;
+                       uncond_traps.safe_push (insn);
+                     }
                  }
              }
        }
index bb5d68f0477075c7b510a80ac8299e374d5c9f7f..3eca2ab2194bd2d1ea4f4e5ac90a42675dd7ebb3 100644 (file)
@@ -1,3 +1,8 @@
+2017-03-02  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/79780
+       * gcc.c-torture/compile/pr79780.c: New test.
+
 2017-03-02  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/79345
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr79780.c b/gcc/testsuite/gcc.c-torture/compile/pr79780.c
new file mode 100644 (file)
index 0000000..c50708d
--- /dev/null
@@ -0,0 +1,48 @@
+/* PR rtl-optimization/79780 */
+
+int t3, iy, f4, oi, gn;
+
+void
+foo (long long int mh)
+{
+  int pi = 0;
+
+  if (iy != 0)
+    for (;;)
+      f4 = 0;
+
+  if (t3 != 0)
+    {
+      while (mh != 0LL)
+       {
+         while (mh < 1LL)
+           ++mh;
+         ++mh;
+       }
+      for (;;)
+       ;
+      for (oi = 0; oi < 1; ++oi)
+       {
+       n3:;
+       }
+      gn = iy = 1;
+    }
+
+  f4 = 0;
+
+  if (pi - (mh != 0LL) == 0)
+    if (mh != 1LL)
+      {
+       oi = t3 = 0;
+       if (mh == 0LL)
+         ++pi;
+      }
+
+  if (iy != 0 && pi != 0)
+    {
+      t3 = 0;
+      goto n3;
+    }
+
+  t3 /= 0;
+}