Skip to content

AArch64: Use storepair more when storing out constant values#9676

Open
david-arm wants to merge 2 commits intofacebook:masterfrom
david-arm:more_storepairs2
Open

AArch64: Use storepair more when storing out constant values#9676
david-arm wants to merge 2 commits intofacebook:masterfrom
david-arm:more_storepairs2

Conversation

@david-arm
Copy link
Contributor

We sometimes see sequences like this:

store %123(...b), [addr + 8]
store %124(...q), [addr]

The existing storepair simplify code requires that the stored registers be physical GP registers, presumably because the lowering for storepair/storepairl cannot handle FP/SIMD regs. However, during register allocation we materialise these constants and end up with the sequence:

ldimmb ... => x0
store x0, [addr + 8]
ldimmq ... => x0
store x0, [addr]

which then makes it very difficult to combine these into storepairs in the post-regalloc simplify pass. This PR permits combining pairs of stores prior to regalloc, provided we can show they are either:

  1. A GP physical register, or
  2. An integer constant that will be materialised into a GP reg.

@meta-cla meta-cla bot added the CLA Signed label Nov 27, 2025
@meta-codesync
Copy link

meta-codesync bot commented Nov 27, 2025

@facebook-github-bot has imported this pull request. If you are a Meta employee, you can view this in D87975171. (Because this pull request was imported automatically, there will not be any future comments.)

Copy link
Contributor

@ottoni ottoni left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks good, except for small coding style nit below

@@ -166,11 +166,19 @@ int is_adjacent_vptr64(const Vptr64& a, const Vptr64& b, int32_t step, int32_t m
return 0;
}

bool is_valid_reg_for_storepair(Env& env, Vreg s) {
if (s.isGP())
return true;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: move the return true; to previous line or wrap it in { } per coding style

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done, thanks!

We sometimes see sequences like this:

store %123(...b), [addr + 8]
store %124(...q), [addr]

The existing storepair simplify code requires that the stored
registers be physical GP registers, presumably because the
lowering for storepair/storepairl cannot handle FP/SIMD regs.
However, during register allocation we materialise these
constants and end up with the sequence:

ldimmb ... => x0
store x0, [addr + 8]
ldimmq ... => x0
store x0, [addr]

which then makes it very difficult to combine these into
storepairs in the post-regalloc simplify pass. This PR permits
combining pairs of stores prior to regalloc, provided we can
show they are either:

1. A GP physical register, or
2. An integer constant that will be materialised into a GP reg.
@facebook-github-bot
Copy link
Contributor

@david-arm has updated the pull request. You must reimport the pull request before landing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants