On 02/02/2026 08:29, 覃珊珊 wrote:
> The load_multiple_sequence function already supports ldm_case=5 to handle
> memory references with arbitrary ARM-encodable constant offsets (via
> const_ok_for_arm). However, the corresponding store path in
> store_multiple_sequence lacked this capability, even though gen_stm_seq
> was prepared to handle stm_case=5.
>
> The change adds a check similar to load_multiple_sequence: when the
> offset is not zero but can be encoded as an ARM immediate (using
> const_ok_for_arm), we now return stm_case = 5. This enables the
> generation of add+stm sequences for store operations, improving
> code size and maintaining consistency between load and store
> optimizations.
>
> gcc/ChangeLog:
> * config/arm/arm.c (store_multiple_sequence): Add support for
> stm_case=5 using const_ok_for_arm to check offset encodability.
>
> Signed-off-by: tanshanshan <[email protected]
> <mailto:[email protected]>>
> ---
> gcc/config/arm/arm.cc | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/gcc/config/arm/arm.cc b/gcc/config/arm/arm.cc
> index 0a1f6612d07..5861849daae 100644
> --- a/gcc/config/arm/arm.cc
> +++ b/gcc/config/arm/arm.cc
> @@ -14907,6 +14907,9 @@ store_multiple_sequence (rtx *operands, int nops, int
> nops_total,
> stm_case = 3; /* stmda */
> else if (TARGET_32BIT && unsorted_offsets[order[nops - 1]] == -4)
> stm_case = 4; /* stmdb */
> + else if (const_ok_for_arm (unsorted_offsets[order[0]])
> + || const_ok_for_arm (-unsorted_offsets[order[0]]))
> + stm_case = 5;
> else
> return 0;
>
> --
> 2.43.0
>
>
Hi, thanks for the patch.
Can you provide some additional background please? Did you spot this just by
observation (reading the code), or because you have identified a case where the
code generated is failing/suboptimal without this change? Does it fix a bug
report (in our bugzilla)? If so, which?
How have you tested it? We would normally want a test-case that demonstrates a
patch is doing the right thing?
A small nit on the code formatting:
> + else if (const_ok_for_arm (unsorted_offsets[order[0]])
> + || const_ok_for_arm (-unsorted_offsets[order[0]]))
The continuation line here should be indented to the depth of the opening
parenthesis, so
else if (const_ok_for_arm (unsorted_offsets[order[0]])
|| const_ok_for_arm (-unsorted_offsets[order[0]]))
Use hard tabs for multiples of 8 spaces.
Thanks one again,
R.