re PR rtl-optimization/52714 (ICE in fixup_reorder_chain, at cfglayout.c:880)
authorJeff Law <law@redhat.com>
Thu, 27 Feb 2014 19:28:40 +0000 (12:28 -0700)
committerJeff Law <law@gcc.gnu.org>
Thu, 27 Feb 2014 19:28:40 +0000 (12:28 -0700)
PR rtl-optimization/52714
* combine.c (try_combine): When splitting an unrecognized PARALLEL
into two independent simple sets, if I3 is a jump, ensure the
pattern we place into I3 is a (set (pc) ...)

PR rtl-optimization/52714
* gcc.c-torture/compile/pr52714.c: New test.

From-SVN: r208204

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

index a20cee3..16c499b 100644 (file)
@@ -1,3 +1,10 @@
+2014-02-27  Jeff Law  <law@redhat.com>
+
+       PR rtl-optimization/52714
+       * combine.c (try_combine): When splitting an unrecognized PARALLEL
+       into two independent simple sets, if I3 is a jump, ensure the
+       pattern we place into I3 is a (set (pc) ...)
+
 2014-02-27  Mikael Pettersson  <mikpe@it.uu.se>
            Jeff Law  <law@redhat.com>
 
index 1b598b4..fc473b6 100644 (file)
@@ -3712,6 +3712,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p,
 #ifdef HAVE_cc0
          && !reg_referenced_p (cc0_rtx, set0)
 #endif
+         /* If I3 is a jump, ensure that set0 is a jump so that
+            we do not create invalid RTL.  */
+         && (!JUMP_P (i3) || SET_DEST (set0) == pc_rtx)
         )
        {
          newi2pat = set1;
@@ -3726,6 +3729,9 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p,
 #ifdef HAVE_cc0
               && !reg_referenced_p (cc0_rtx, set1)
 #endif
+              /* If I3 is a jump, ensure that set1 is a jump so that
+                 we do not create invalid RTL.  */
+              && (!JUMP_P (i3) || SET_DEST (set1) == pc_rtx)
              )
        {
          newi2pat = set0;
index be4cb12..b95bcfd 100644 (file)
@@ -1,3 +1,8 @@
+2014-02-27  Jeff Law  <law@redhat.com>
+
+       PR rtl-optimization/52714
+       * gcc.c-torture/compile/pr52714.c: New test.
+
 2014-02-27  Mikael Pettersson  <mikpe@it.uu.se>
             Jeff Law  <law@redhat.com>
 
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr52714.c b/gcc/testsuite/gcc.c-torture/compile/pr52714.c
new file mode 100644 (file)
index 0000000..03d4990
--- /dev/null
@@ -0,0 +1,25 @@
+
+int __re_compile_fastmap(unsigned char *p)
+{
+    unsigned char **stack;
+    unsigned size;
+    unsigned avail;
+
+    stack = __builtin_alloca(5 * sizeof(unsigned char*));
+    if (stack == 0)
+       return -2;
+    size = 5;
+    avail = 0;
+
+    for (;;) {
+       switch (*p++) {
+       case 0:
+           if (avail == size)
+               return -2;
+           stack[avail++] = p;
+       }
+    }
+
+    return 0;
+}
+