ifcvt: Don't make invalid insns for a cond trap (PR78751)
authorSegher Boessenkool <segher@kernel.crashing.org>
Sun, 15 Jan 2017 17:03:55 +0000 (18:03 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Sun, 15 Jan 2017 17:03:55 +0000 (18:03 +0100)
As shown in the PR, ifcvt will happily make invalid insns when given the
chance.  This patch teaches it some manners.

PR rtl-optimization/78751
* ifcvt.c (find_cond_trap): If we generated a non-existing insn,
give up.

From-SVN: r244476

gcc/ChangeLog
gcc/ifcvt.c

index 36982c69df1cd9535fe5a1b3119cd42b3d319b4e..c689c58670c67f9aca625f57c9733dd9678a03f4 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-15  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/78751
+       * ifcvt.c (find_cond_trap): If we generated a non-existing insn,
+       give up.
+
 2017-01-14  Jeff Law  <law@redhat.com>
 
        PR tree-optimization/79090
index 68c1a1d42c406aa605aed7b8e3d92efd7bd43a9a..6d306392f603ba2990032dc5bf0a18cc9f7a451f 100644 (file)
@@ -4686,6 +4686,11 @@ find_cond_trap (basic_block test_bb, edge then_edge, edge else_edge)
   if (seq == NULL)
     return FALSE;
 
+  /* If that results in an invalid insn, back out.  */
+  for (rtx_insn *x = seq; x; x = NEXT_INSN (x))
+    if (recog_memoized (x) < 0)
+      return FALSE;
+
   /* Emit the new insns before cond_earliest.  */
   emit_insn_before_setloc (seq, cond_earliest, INSN_LOCATION (trap));