This fixes another case where we use the wrong memory constraint. See the analysis in the PR. The rule for operand predicate and constraints is simply that the union of all constraints must exactly match the operand predicate.
Bootstrapped and regression tested powerpc64-linux and powerpc64le-linux. OK for mainline and active branches? Note that I didn't see the bootstrap miscompares reported in the PR, so perhaps there is some other issue to fix besides this one.. PR target/61231 * config/rs6000/rs6000.c (mem_operand_gpr): Handle SImode. * config/rs6000/rs6000.md (extendsidi2_lfiwax, extendsidi2_nocell): Use "Y" constraint rather than "m". Index: gcc/config/rs6000/rs6000.c =================================================================== --- gcc/config/rs6000/rs6000.c (revision 210661) +++ gcc/config/rs6000/rs6000.c (working copy) @@ -6124,7 +6127,8 @@ mem_operand_gpr (rtx op, enum machine_mode mode) return false; extra = GET_MODE_SIZE (mode) - UNITS_PER_WORD; - gcc_assert (extra >= 0); + if (extra < 0) + extra = 0; if (GET_CODE (addr) == LO_SUM) /* For lo_sum addresses, we must allow any offset except one that Index: gcc/config/rs6000/rs6000.md =================================================================== --- gcc/config/rs6000/rs6000.md (revision 210661) +++ gcc/config/rs6000/rs6000.md (working copy) @@ -745,7 +745,7 @@ (define_insn "*extendsidi2_lfiwax" [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r,??wm,!wl,!wu") - (sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r,r,Z,Z")))] + (sign_extend:DI (match_operand:SI 1 "lwa_operand" "Y,r,r,Z,Z")))] "TARGET_POWERPC64 && TARGET_LFIWAX" "@ lwa%U1%X1 %0,%1 @@ -758,7 +758,7 @@ (define_insn "*extendsidi2_nocell" [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r") - (sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r")))] + (sign_extend:DI (match_operand:SI 1 "lwa_operand" "Y,r")))] "TARGET_POWERPC64 && rs6000_gen_cell_microcode && !TARGET_LFIWAX" "@ lwa%U1%X1 %0,%1 -- Alan Modra Australia Development Lab, IBM