re PR rtl-optimization/52714 (ICE in fixup_reorder_chain, at cfglayout.c:880)
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 3 Dec 2014 06:00:54 +0000 (07:00 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Wed, 3 Dec 2014 06:00:54 +0000 (07:00 +0100)
PR rtl-optimization/52714
* combine.c (try_combine): Allow combining two insns into two
new insns if at least one of those is a noop.

gcc/testsuite/
* gcc.target/m68k/pr52714.c: New testcase.

From-SVN: r218302

gcc/ChangeLog
gcc/combine.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/m68k/pr52714.c [new file with mode: 0644]

index cfc6628797931331b119c33ad3fa48b065785b24..e3b3477e54174e21b30b22399176fe3aebaff848 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-03  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/52714
+       * combine.c (try_combine): Allow combining two insns into two
+       new insns if at least one of those is a noop.
+
 2014-12-03  Bin Cheng  <bin.cheng@arm.com>
 
        * target.def (fusion_priority): Wrap code with @smallexample.
index 63c1e4f3f6031d5fd0885d3f4274707307348649..e6deb419987398b6b20c89c52322822193f65684 100644 (file)
@@ -3812,15 +3812,20 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0,
   /* Similarly, check for a case where we have a PARALLEL of two independent
      SETs but we started with three insns.  In this case, we can do the sets
      as two separate insns.  This case occurs when some SET allows two
-     other insns to combine, but the destination of that SET is still live.  */
+     other insns to combine, but the destination of that SET is still live.
 
-  else if (i1 && insn_code_number < 0 && asm_noperands (newpat) < 0
+     Also do this if we started with two insns and (at least) one of the
+     resulting sets is a noop; this noop will be deleted later.  */
+
+  else if (insn_code_number < 0 && asm_noperands (newpat) < 0
           && GET_CODE (newpat) == PARALLEL
           && XVECLEN (newpat, 0) == 2
           && GET_CODE (XVECEXP (newpat, 0, 0)) == SET
+          && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
+          && (i1 || set_noop_p (XVECEXP (newpat, 0, 0))
+                 || set_noop_p (XVECEXP (newpat, 0, 1)))
           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != ZERO_EXTRACT
           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 0))) != STRICT_LOW_PART
-          && GET_CODE (XVECEXP (newpat, 0, 1)) == SET
           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != ZERO_EXTRACT
           && GET_CODE (SET_DEST (XVECEXP (newpat, 0, 1))) != STRICT_LOW_PART
           && ! reg_referenced_p (SET_DEST (XVECEXP (newpat, 0, 1)),
index f2e54ef42153b12c347bbfe2d5932e6af4593d2d..ee812d25be8eb2b46275adaa3a93e8976754252b 100644 (file)
@@ -1,3 +1,8 @@
+2014-12-03  Segher Boessenkool  <segher.kernel.crashing.org>
+
+       PR rtl-optimization/52714
+       * gcc.target/m68k/pr52714.c: New testcase.
+
 2014-12-02  Uros Bizjak  <ubizjak@gmail.com>
 
        * gcc.target/i386/avx512ifma-vpmaddhuq-2.c: Define AVX512IFMA.
diff --git a/gcc/testsuite/gcc.target/m68k/pr52714.c b/gcc/testsuite/gcc.target/m68k/pr52714.c
new file mode 100644 (file)
index 0000000..0a52a1d
--- /dev/null
@@ -0,0 +1,33 @@
+/* PR rtl-optimization/52714
+
+   Check that combine manages to remove the "stack == 0" test.
+   Without ICEing.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O1" } */
+
+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;
+}
+
+/* { dg-final { scan-assembler-not {\mtst\.l %sp\M} } } */