]> git.ipfire.org Git - thirdparty/gcc.git/commit
arm: Fix LDRD register overlap [PR117675]
authorWilco Dijkstra <wilco.dijkstra@arm.com>
Tue, 10 Dec 2024 14:22:48 +0000 (14:22 +0000)
committerWilco Dijkstra <wilco.dijkstra@arm.com>
Tue, 10 Dec 2024 16:19:07 +0000 (16:19 +0000)
commit21fbfae2e55e1a153820acc6fbd922e66f67e65b
tree4478cfbeae43440181ce0a45844fb2e13cb4903e
parent132025a5fe6a9ba59d62126ecba21887f7ac0f98
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.
gcc/config/arm/arm-protos.h
gcc/config/arm/arm.cc
gcc/config/arm/constraints.md
gcc/config/arm/predicates.md
gcc/config/arm/sync.md
gcc/testsuite/gcc.target/arm/pr117675.c [new file with mode: 0644]