https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117675
--- Comment #5 from GCC Commits <cvs-commit at gcc dot gnu.org> --- The master branch has been updated by Wilco Dijkstra <wi...@gcc.gnu.org>: https://gcc.gnu.org/g:21fbfae2e55e1a153820acc6fbd922e66f67e65b commit r15-6088-g21fbfae2e55e1a153820acc6fbd922e66f67e65b Author: Wilco Dijkstra <wilco.dijks...@arm.com> Date: Tue Dec 10 14:22:48 2024 +0000 arm: Fix LDRD register overlap [PR117675] The register indexed variants of LDRD have complex register overlap constraints which makes them hard to use without using output_move_double (which can't be used for atomics as it doesn't guarantee to emit atomic LDRD/STRD when required). Add a new predicate and constraint for plain LDRD/STRD with base or base+imm. This blocks register indexing and fixes PR117675. gcc: PR target/117675 * config/arm/arm.cc (arm_ldrd_legitimate_address): New function. * config/arm/arm-protos.h (arm_ldrd_legitimate_address): New prototype. * config/arm/constraints.md: Add new Uo constraint. * config/arm/predicates.md (arm_ldrd_memory_operand): Add new predicate. * config/arm/sync.md (arm_atomic_loaddi2_ldrd): Use arm_ldrd_memory_operand and Uo. gcc/testsuite: PR target/117675 * gcc.target/arm/pr117675.c: Add new test.