Skip to content

Arm64: enable ldp/stp peephole for negative offsets#129932

Open
EgorBo wants to merge 1 commit into
dotnet:mainfrom
EgorBo:fix-arm64-ldp-stp-negative-offset
Open

Arm64: enable ldp/stp peephole for negative offsets#129932
EgorBo wants to merge 1 commit into
dotnet:mainfrom
EgorBo:fix-arm64-ldp-stp-negative-offset

Conversation

@EgorBo

@EgorBo EgorBo commented Jun 27, 2026

Copy link
Copy Markdown
Member

Closes #93382

Diffs

The ldp/stp peephole was disabled whenever either access used the
IF_LS_2C (ldur/stur) format, whose immediate is a raw, unscaled byte
offset rather than the scaled value used by IF_LS_2B. Normalize the
IF_LS_2C immediates to scaled units (bailing out when the raw offset is
not a multiple of the operand size) so the merge applies to negative
offsets, and recover byte offsets per-format when emitting the pair.

Closes dotnet#93382

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot AI review requested due to automatic review settings June 27, 2026 22:50
@github-actions github-actions Bot added the area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI label Jun 27, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

This PR updates the ARM64 JIT emitter’s ldr/strldp/stp peephole so it can merge consecutive loads/stores even when the original instructions use the unscaled ldur/stur format (IF_LS_2C), which is commonly selected for negative byte offsets.

Changes:

  • Normalize IF_LS_2C immediates to a scaled representation inside IsOptimizableLdrStrWithPair so adjacency/range checks work consistently.
  • Compute byte offsets correctly in ReplaceLdrStrWithPairInstr when either instruction is IF_LS_2C (avoid incorrectly multiplying raw byte offsets by operand size).
  • Preserve safety by rejecting IF_LS_2C offsets that can’t be represented as scaled pair offsets (non-multiple-of-element-size).

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

Labels

area-CodeGen-coreclr CLR JIT compiler in src/coreclr/src/jit and related components such as SuperPMI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

stp/ldp optimization doesn't kick in for negative offsets

2 participants