[Bug target/113550] data512_t initializers dereference a clobbered register
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113550 Richard Sandiford changed: What|Removed |Added CC||rsandifo at gcc dot gnu.org Resolution|--- |FIXED Status|ASSIGNED|RESOLVED --- Comment #5 from Richard Sandiford --- Yeah, FWIW, I agree improving the define_split is probably best. Now fixed.
[Bug target/113550] data512_t initializers dereference a clobbered register
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113550 --- Comment #4 from GCC Commits --- The trunk branch has been updated by Richard Sandiford : https://gcc.gnu.org/g:8eead1148cd0ac086b39a7abccea404041c85cb5 commit r14-8421-g8eead1148cd0ac086b39a7abccea404041c85cb5 Author: Richard Sandiford Date: Thu Jan 25 12:03:18 2024 + aarch64: Handle overlapping registers in movv8di [PR113550] The LS64 movv8di pattern didn't handle loads that overlapped with the address register (unless the overlap happened to be in the last subload). gcc/ PR target/113550 * config/aarch64/aarch64-simd.md: In the movv8di splitter, check whether each split instruction is a load that clobbers the source address. Emit that instruction last if so. gcc/testsuite/ PR target/113550 * gcc.target/aarch64/pr113550.c: New test.
[Bug target/113550] data512_t initializers dereference a clobbered register
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113550 Andrew Pinski changed: What|Removed |Added URL||https://gcc.gnu.org/piperma ||il/gcc-patches/2024-January ||/643766.html Keywords||patch --- Comment #3 from Andrew Pinski --- Patch posted: https://gcc.gnu.org/pipermail/gcc-patches/2024-January/643766.html
[Bug target/113550] data512_t initializers dereference a clobbered register
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113550 --- Comment #2 from Andrew Pinski --- Thinking about this, maybe it is too complex to figure out which register overlaps with the memory. So the easiest is just to mark `=r/m` alternative as an early clobber.
[Bug target/113550] data512_t initializers dereference a clobbered register
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113550 Andrew Pinski 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 --- 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 ...