Skip to content
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