https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113550
Andrew Pinski <pinskia at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Last reconfirmed| |2024-01-22 Ever confirmed|0 |1 Keywords| |wrong-code Status|UNCONFIRMED |ASSIGNED Assignee|unassigned at gcc dot gnu.org |pinskia at gcc dot gnu.org --- Comment #1 from Andrew Pinski <pinskia at gcc dot gnu.org> --- Should be an easy fix. The pattern: (define_insn "*aarch64_movv8di" [(set (match_operand:V8DI 0 "nonimmediate_operand" "=r,m,r") (match_operand:V8DI 1 "general_operand" " r,r,m"))] "(register_operand (operands[0], V8DImode) || register_operand (operands[1], V8DImode))" "#" [(set_attr "type" "multiple,multiple,multiple") (set_attr "length" "32,16,16")] ) Is missing a & on the r/m case. Or the split could be improved such that the one that gets loadded last is the one that might conflict: (define_split [(set (match_operand:V8DI 0 "nonimmediate_operand") (match_operand:V8DI 1 "general_operand"))] "reload_completed" [(const_int 0)] aarch64_simd_emit_reg_reg_move handles this case already too. I am going to go with the improving the define_split ...