https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109855
ktkachov at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2023-05-22 Ever confirmed|0 |1 Status|UNCONFIRMED |NEW --- Comment #2 from ktkachov at gcc dot gnu.org --- Confirmed. The ICE in LRA happens very early on: ********** Local #1: ********** Spilling non-eliminable hard regs: 31 alt=0: Bad operand -- refuse The pattern matches: [(set (match_operand:VDQ_BHSI 0 "register_operand" "=w") (plus:VDQ_BHSI (mult:VDQ_BHSI (match_operand:VDQ_BHSI 2 "register_operand" "w") (match_operand:VDQ_BHSI 3 "register_operand" "w")) (match_operand:VDQ_BHSI 1 "register_operand" "0")))] I wonder whether the substitution breaks something on the constraint in operand 1, which is tied to 0. The define_subst rule adds another operand to the pattern to match the zero vector, but I would have expected the substitution machinery to handle it all transparently...