Skip to content

[AArch64] Merge scaled and unscaled narrow zero stores #136705

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
May 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1676,10 +1676,12 @@ static bool areCandidatesToMergeOrPair(MachineInstr &FirstMI, MachineInstr &MI,
if (!PairIsValidLdStrOpc)
return false;

// FIXME: We don't support merging narrow stores with mixed scaled/unscaled
// offsets.
// Narrow stores do not have a matching pair opcodes, so constrain their
// merging to zero stores.
if (isNarrowStore(OpcA) || isNarrowStore(OpcB))
return false;
return getLdStRegOp(FirstMI).getReg() == AArch64::WZR &&
getLdStRegOp(MI).getReg() == AArch64::WZR &&
TII->getMemScale(FirstMI) == TII->getMemScale(MI);

// The STR<S,D,Q,W,X>pre - STR<S,D,Q,W,X>ui and
// LDR<S,D,Q,W,X,SW>pre-LDR<S,D,Q,W,X,SW>ui
Expand Down
98 changes: 90 additions & 8 deletions llvm/test/CodeGen/AArch64/str-narrow-zero-merge.mir
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ name: merge_scaled_str_with_unscaled_8
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_8
; CHECK: STRBBui $wzr, $x0, 4 :: (store (s8))
; CHECK-NEXT: STURBBi $wzr, $x0, 5 :: (store (s8))
; CHECK: STRHHui $wzr, $x0, 2 :: (store (s8))
; CHECK-NEXT: RET undef $lr
STRBBui $wzr, $x0, 4 :: (store (s8))
STURBBi $wzr, $x0, 5 :: (store (s8))
Expand All @@ -41,14 +40,56 @@ name: merge_unscaled_str_with_scaled_8
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_8
; CHECK: STURBBi $wzr, $x0, 4 :: (store (s8))
; CHECK-NEXT: STRBBui $wzr, $x0, 5 :: (store (s8))
; CHECK: STURHHi $wzr, $x0, 4 :: (store (s8))
; CHECK-NEXT: RET undef $lr
STURBBi $wzr, $x0, 4 :: (store (s8))
STRBBui $wzr, $x0, 5 :: (store (s8))
RET undef $lr
...
---
name: merge_unscaled_str_with_scaled_8_lower_address_second
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_8_lower_address_second
; CHECK: STURHHi $wzr, $x0, 0 :: (store (s8))
; CHECK-NEXT: RET undef $lr
STURBBi $wzr, $x0, 1 :: (store (s8))
STRBBui $wzr, $x0, 0 :: (store (s8))
RET undef $lr
...
---
name: merge_scaled_str_with_unscaled_8_lower_address_second
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_8_lower_address_second
; CHECK: STRHHui $wzr, $x0, 0 :: (store (s8))
; CHECK-NEXT: RET undef $lr
STRBBui $wzr, $x0, 1 :: (store (s8))
STURBBi $wzr, $x0, 0 :: (store (s8))
RET undef $lr
...
---
name: merge_unscaled_str_with_scaled_8_limits
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_8_limits
; CHECK: STURHHi $wzr, $x0, 255 :: (store (s8))
; CHECK-NEXT: RET undef $lr
STURBBi $wzr, $x0, 255 :: (store (s8))
STRBBui $wzr, $x0, 256 :: (store (s8))
RET undef $lr
---
---
name: merge_scaled_str_with_unscaled_8_limits
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_8_limits
; CHECK: STRHHui $wzr, $x0, 127 :: (store (s8))
; CHECK-NEXT: RET undef $lr
STRBBui $wzr, $x0, 254 :: (store (s8))
STURBBi $wzr, $x0, 255 :: (store (s8))
RET undef $lr
---
name: merge_unscaled_str_with_unscaled_str_16
body: |
bb.0:
Expand All @@ -75,8 +116,7 @@ name: merge_scaled_str_with_unscaled_16
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_16
; CHECK: STRHHui $wzr, $x0, 2 :: (store (s16))
; CHECK-NEXT: STURHHi $wzr, $x0, 6 :: (store (s16))
; CHECK: STRWui $wzr, $x0, 1 :: (store (s16))
; CHECK-NEXT: RET undef $lr
STRHHui $wzr, $x0, 2 :: (store (s16))
STURHHi $wzr, $x0, 6 :: (store (s16))
Expand All @@ -87,14 +127,56 @@ name: merge_unscaled_str_with_scaled_16
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_16
; CHECK: STURHHi $wzr, $x0, 4 :: (store (s16))
; CHECK-NEXT: STRHHui $wzr, $x0, 3 :: (store (s16))
; CHECK: STURWi $wzr, $x0, 4 :: (store (s16))
; CHECK-NEXT: RET undef $lr
STURHHi $wzr, $x0, 4 :: (store (s16))
STRHHui $wzr, $x0, 3 :: (store (s16))
RET undef $lr
...
---
name: merge_unscaled_str_with_scaled_16_lower_address_second
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_16_lower_address_second
; CHECK: STURWi $wzr, $x0, 2 :: (store (s16))
; CHECK-NEXT: RET undef $lr
STURHHi $wzr, $x0, 4 :: (store (s16))
STRHHui $wzr, $x0, 1 :: (store (s16))
RET undef $lr
...
---
name: merge_scaled_str_with_unscaled_16_lower_address_second
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_16_lower_address_second
; CHECK: STRWui $wzr, $x0, 0 :: (store (s16))
; CHECK-NEXT: RET undef $lr
STRHHui $wzr, $x0, 1 :: (store (s16))
STURHHi $wzr, $x0, 0 :: (store (s16))
RET undef $lr
...
---
name: merge_unscaled_str_with_scaled_16_limits
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_16_limits
; CHECK: STURWi $wzr, $x0, 254 :: (store (s16))
; CHECK-NEXT: RET undef $lr
STURHHi $wzr, $x0, 254 :: (store (s16))
STRHHui $wzr, $x0, 128 :: (store (s16))
RET undef $lr
---
---
name: merge_scaled_str_with_unscaled_16_limits
body: |
bb.0.entry:
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_16_limits
; CHECK: STRWui $wzr, $x0, 63 :: (store (s16))
; CHECK-NEXT: RET undef $lr
STRHHui $wzr, $x0, 126 :: (store (s16))
STURHHi $wzr, $x0, 254 :: (store (s16))
RET undef $lr
---
name: merge_unscaled_str_with_unscaled_32
body: |
bb.0.entry:
Expand Down
Loading