rs6000: Fix PR67346
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 25 Aug 2015 19:35:15 +0000 (21:35 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 25 Aug 2015 19:35:15 +0000 (21:35 +0200)
"*ior<mode>_mask" is a define_insn_and_split, so it shouldn't use
can_create_pseudo in its instruction condition, because IRA can then
create such an instruction, and the condition becomes false before
the insn is split.  Use a scratch instead.

2015-08-25  Segher Boessenkool  <segher@kernel.crashing.org>

PR target/67346
* config/rs6000/rs6000.md (*ior<mode>_mask): Use a match_scratch.

From-SVN: r227183

gcc/ChangeLog
gcc/config/rs6000/rs6000.md

index 6d0e1e1a6df7efb34460b59242c71dfb682b8fb7..3900191fceeb5e8103d88b38f230de24be65b5d5 100644 (file)
@@ -1,3 +1,8 @@
+2015-08-25  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       PR target/67346
+       * config/rs6000/rs6000.md (*ior<mode>_mask): Use a match_scratch.
+
 2015-08-25  Segher Boessenkool  <segher@kernel.crashing.org>
 
        PR target/67344
index 60632421ca576adc00efb240ca1a6adf15fc961d..f7b3b4e3032f19dcfe67b18dcbece277c66b8f88 100644 (file)
 (define_insn_and_split "*ior<mode>_mask"
   [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
        (ior:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
-                (match_operand:GPR 2 "const_int_operand" "n")))]
-  "can_create_pseudo_p ()
-   && !logical_const_operand (operands[2], <MODE>mode)
+                (match_operand:GPR 2 "const_int_operand" "n")))
+   (clobber (match_scratch:GPR 3 "=r"))]
+  "!logical_const_operand (operands[2], <MODE>mode)
    && rs6000_is_valid_mask (operands[2], NULL, NULL, <MODE>mode)"
   "#"
   "&& 1"
 {
   int nb, ne;
   rs6000_is_valid_mask (operands[2], &nb, &ne, <MODE>mode);
-  operands[3] = gen_reg_rtx (<MODE>mode);
+  if (GET_CODE (operands[3]) == SCRATCH)
+    operands[3] = gen_reg_rtx (<MODE>mode);
   operands[4] = GEN_INT (ne);
   operands[5] = GEN_INT (~UINTVAL (operands[2]));
 }