https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121449

--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Pengfei Li <pfu...@gcc.gnu.org>:

https://gcc.gnu.org/g:aa1e7dd6a354da428e23bd5e528a8a0f744e7351

commit r16-3083-gaa1e7dd6a354da428e23bd5e528a8a0f744e7351
Author: Pengfei Li <pengfei....@arm.com>
Date:   Thu Aug 7 14:52:45 2025 +0000

    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.

Reply via email to