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. Bootstrapped etc. powerpc64le-linux. OK? 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. diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 9dd222dc5d7..51b6b7a9660 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -12525,7 +12525,7 @@ (define_split 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 { @@ -12603,7 +12603,7 @@ (define_split (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)) @@ -12636,7 +12636,7 @@ (define_split 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 { -- Alan Modra Australia Development Lab, IBM