]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[RS6000] Fix <bd>_<mode> and <bd>tf_<mode> splitters
authorAlan Modra <amodra@gmail.com>
Sun, 17 Feb 2019 03:01:41 +0000 (13:31 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Sun, 17 Feb 2019 03:01:41 +0000 (13:31 +1030)
This patch fixes a bug that can result in "insn does not satisfy its
constraints" if these splitters fire due to not getting ctr for the
jump insn.  Since the jump insn can have any of r,m,d,wi,c,l as the
decremented count output, it's not sufficient to check for
gpc_reg_operand (which matches VSX regs for example).  Seen after
correcting register_move_cost when the cost of gpr <-> vsx is much
lower.  Since this is a prerequisite to fixing PR89271, I'm mentioning
that PR in the ChangeLog.

The <bd>tf_<mode> split had a further bug in that it wouldn't match
if the count output was m,d,wi, or l.

PR target/89271
* config/rs6000/rs6000.md (<bd>_<mode> split): Check for an int
output reg on add insn.
(<bd>tf_<mode> split): Likewise.  Match predicates with insn.

From-SVN: r268968

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

index d80e4f46e5aa1fa3e4f6f9491895e4a8459d529e..74f96a29089b647a8de0c798ad69d0d9dd424072 100644 (file)
@@ -1,3 +1,10 @@
+2019-02-17  Alan Modra  <amodra@gmail.com>
+
+       PR target/89271
+       * config/rs6000/rs6000.md (<bd>_<mode> split): Check for an int
+       output reg on add insn.
+       (<bd>tf_<mode> split): Likewise.  Match predicates with insn.
+
 2019-02-16  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/89372
index 5bca96b70d13ab5b748d4739b58d2f5ce8c8f19d..584b9da6e7174eec191ad0aeb3bfd485b7313667 100644 (file)
                                const0_rtx);
   emit_insn (gen_rtx_SET (operands[3],
                          gen_rtx_COMPARE (CCmode, operands[1], const1_rtx)));
-  if (gpc_reg_operand (operands[0], <MODE>mode))
+  if (int_reg_operand (operands[0], <MODE>mode))
     emit_insn (gen_add<mode>3 (operands[0], operands[1], constm1_rtx));
   else
     {
                       (const_int 0)]))
          (match_operand 4)
          (match_operand 5)))
-   (set (match_operand:P 6 "int_reg_operand")
+   (set (match_operand:P 6 "nonimmediate_operand")
        (plus:P (match_dup 0)
                (const_int -1)))
    (clobber (match_scratch:P 7))
   else
      emit_insn (gen_cceq_ior_compare_complement (operands[9], andexpr, ctrcmpcc,
                                                 operands[8], cccmp, ccin));
-  if (gpc_reg_operand (operands[0], <MODE>mode))
+  if (int_reg_operand (ctrout, <MODE>mode))
      emit_insn (gen_add<mode>3 (ctrout, ctr, constm1_rtx));
   else
     {