> PR target/78660 > * lra-constraints.c (curr_insn_transform): Handle > WORD_REGISTER_OPERATIONS requirements when reloading SUBREGs. > --- > gcc/lra-constraints.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c > index 22323b2..f29308f 100644 > --- a/gcc/lra-constraints.c > +++ b/gcc/lra-constraints.c > @@ -4130,7 +4130,14 @@ curr_insn_transform (bool check_only_p) > && (goal_alt[i] == NO_REGS > > || (simplify_subreg_regno > > (ira_class_hard_regs[goal_alt[i]][0], > - GET_MODE (reg), byte, mode) >= 0))))) > + GET_MODE (reg), byte, mode) >= 0))) > + /* WORD_REGISTER_OPERATIONS targets require the register > + to be reloaded when the outer mode is strictly > + narrower than the inner mode. Note: It may be > + necessary to always reload the inner mode here but it > + requires further investigation. */ > + || (GET_MODE_SIZE (mode) < GET_MODE_SIZE (GET_MODE (reg)) > + && WORD_REGISTER_OPERATIONS))) > { > if (type == OP_OUT) > type = OP_INOUT;
You want GET_MODE_PRECISION instead of GET_MODE_SIZE here. -- Eric Botcazou