]> git.ipfire.org Git - thirdparty/gcc.git/commit
AArch64: Fix invalid immediate offsets in SVE gather/scatter [PR121449]
authorPengfei Li <Pengfei.Li2@arm.com>
Thu, 7 Aug 2025 14:52:45 +0000 (14:52 +0000)
committerPengfei Li <Pengfei.Li2@arm.com>
Fri, 8 Aug 2025 13:42:25 +0000 (13:42 +0000)
commitaa1e7dd6a354da428e23bd5e528a8a0f744e7351
treeefca31e41276141ae1cea1df5099f205b11e808f
parentc9d0953ec88a4a4d2d949042ecb44deaeb65961f
AArch64: Fix invalid immediate offsets in SVE gather/scatter [PR121449]

This patch fixes incorrect constraints in RTL patterns for AArch64 SVE
gather/scatter with type widening/narrowing and vector-plus-immediate
addressing. The bug leads to below "immediate offset out of range"
errors during assembly, eventually causing compilation failures.

/tmp/ccsVqBp1.s: Assembler messages:
/tmp/ccsVqBp1.s:54: Error: immediate offset out of range 0 to 31 at operand 3 -- `ld1b z1.d,p0/z,[z1.d,#64]'

Current RTL patterns for such instructions incorrectly use vgw or vgd
constraints for the immediate operand, base on the vector element type
in Z registers (zN.s or zN.d). However, for gather/scatter with type
conversions, the immediate range for vector-plus-immediate addressing is
determined by the element type in memory, which differs from that in
vector registers. Using the wrong constraint can produce out-of-range
offset values that cannot be encoded in the instruction.

This patch corrects the constraints used in these patterns. A test case
that reproduces the issue is also included.

Bootstrapped and regression-tested on aarch64-linux-gnu.

gcc/ChangeLog:
PR target/121449
* config/aarch64/aarch64-sve.md
(mask_gather_load<mode><v_int_container>): Use vg<Vesize>
constraints for alternatives with immediate offset.
(mask_scatter_store<mode><v_int_container>): Likewise.

gcc/testsuite/ChangeLog:
PR target/121449
* g++.target/aarch64/sve/pr121449.C: New test.
gcc/config/aarch64/aarch64-sve.md
gcc/testsuite/g++.target/aarch64/sve/pr121449.C [new file with mode: 0644]