combine: Handle aborts in is_parallel_of_n_reg_sets (PR68381)
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 24 Nov 2015 06:43:20 +0000 (07:43 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 24 Nov 2015 06:43:20 +0000 (07:43 +0100)
Some users of is_parallel_of_n_reg_sets disregard the clobbers in a
parallel after it has returned "yes, this is a parallel of N sets and
maybe some clobbers".  But combine uses a clobber of const0_rtx to
indicate substitution failure, so this leads to disaster.

Fix this by checking for such special clobbers in is_parallel_of_n_reg_sets.

PR rtl-optimization/68381
* combine.c (is_parallel_of_n_reg_sets): Return false if the pattern
is poisoned.

From-SVN: r230786

gcc/ChangeLog
gcc/combine.c

index e770638354df281dd734adaf0793c610c431fec7..b3538c487351aa0aeae40178480ee53acc44d431 100644 (file)
@@ -1,3 +1,9 @@
+2015-11-24  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR rtl-optimization/68381
+       * combine.c (is_parallel_of_n_reg_sets): Return false if the pattern
+       is poisoned.
+
 2015-11-23  Nick Clifton  <nickc@redhat.com>
            Jeff Law  <law@redhat.com>
 
index 2a66fd5c8bdf6dbccc407ab3290ee8723bb71448..4958d3bfc63607db3665d14ac743ebeb5d652d3a 100644 (file)
@@ -2512,7 +2512,8 @@ is_parallel_of_n_reg_sets (rtx pat, int n)
        || !REG_P (SET_DEST (XVECEXP (pat, 0, i))))
       return false;
   for ( ; i < len; i++)
-    if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER)
+    if (GET_CODE (XVECEXP (pat, 0, i)) != CLOBBER
+       || XEXP (XVECEXP (pat, 0, i), 0) == const0_rtx)
       return false;
 
   return true;