Skip to content

Commit 960bc5f

Browse files
committed
[AArch64] Support merging of narrow zero stores
1 parent e3ee6bb commit 960bc5f

File tree

2 files changed

+53
-11
lines changed

2 files changed

+53
-11
lines changed

llvm/lib/Target/AArch64/AArch64LoadStoreOptimizer.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1676,10 +1676,12 @@ static bool areCandidatesToMergeOrPair(MachineInstr &FirstMI, MachineInstr &MI,
16761676
if (!PairIsValidLdStrOpc)
16771677
return false;
16781678

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

16841686
// The STR<S,D,Q,W,X>pre - STR<S,D,Q,W,X>ui and
16851687
// LDR<S,D,Q,W,X,SW>pre-LDR<S,D,Q,W,X,SW>ui

llvm/test/CodeGen/AArch64/str-narrow-zero-merge.mir

Lines changed: 48 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ name: merge_scaled_str_with_unscaled_8
2929
body: |
3030
bb.0.entry:
3131
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_8
32-
; CHECK: STRBBui $wzr, $x0, 4 :: (store (s8))
33-
; CHECK-NEXT: STURBBi $wzr, $x0, 5 :: (store (s8))
32+
; CHECK: STRHHui $wzr, $x0, 2 :: (store (s8))
3433
; CHECK-NEXT: RET undef $lr
3534
STRBBui $wzr, $x0, 4 :: (store (s8))
3635
STURBBi $wzr, $x0, 5 :: (store (s8))
@@ -41,14 +40,35 @@ name: merge_unscaled_str_with_scaled_8
4140
body: |
4241
bb.0.entry:
4342
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_8
44-
; CHECK: STURBBi $wzr, $x0, 4 :: (store (s8))
45-
; CHECK-NEXT: STRBBui $wzr, $x0, 5 :: (store (s8))
43+
; CHECK: STURHHi $wzr, $x0, 4 :: (store (s8))
4644
; CHECK-NEXT: RET undef $lr
4745
STURBBi $wzr, $x0, 4 :: (store (s8))
4846
STRBBui $wzr, $x0, 5 :: (store (s8))
4947
RET undef $lr
5048
...
5149
---
50+
name: merge_unscaled_str_with_scaled_8_lower_address_second
51+
body: |
52+
bb.0.entry:
53+
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_8_lower_address_second
54+
; CHECK: STURHHi $wzr, $x0, 0 :: (store (s8))
55+
; CHECK-NEXT: RET undef $lr
56+
STURBBi $wzr, $x0, 1 :: (store (s8))
57+
STRBBui $wzr, $x0, 0 :: (store (s8))
58+
RET undef $lr
59+
...
60+
---
61+
name: merge_scaled_str_with_unscaled_8_lower_address_second
62+
body: |
63+
bb.0.entry:
64+
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_8_lower_address_second
65+
; CHECK: STRHHui $wzr, $x0, 0 :: (store (s8))
66+
; CHECK-NEXT: RET undef $lr
67+
STRBBui $wzr, $x0, 1 :: (store (s8))
68+
STURBBi $wzr, $x0, 0 :: (store (s8))
69+
RET undef $lr
70+
...
71+
---
5272
name: merge_unscaled_str_with_unscaled_str_16
5373
body: |
5474
bb.0:
@@ -75,8 +95,7 @@ name: merge_scaled_str_with_unscaled_16
7595
body: |
7696
bb.0.entry:
7797
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_16
78-
; CHECK: STRHHui $wzr, $x0, 2 :: (store (s16))
79-
; CHECK-NEXT: STURHHi $wzr, $x0, 6 :: (store (s16))
98+
; CHECK: STRWui $wzr, $x0, 1 :: (store (s16))
8099
; CHECK-NEXT: RET undef $lr
81100
STRHHui $wzr, $x0, 2 :: (store (s16))
82101
STURHHi $wzr, $x0, 6 :: (store (s16))
@@ -87,14 +106,35 @@ name: merge_unscaled_str_with_scaled_16
87106
body: |
88107
bb.0.entry:
89108
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_16
90-
; CHECK: STURHHi $wzr, $x0, 4 :: (store (s16))
91-
; CHECK-NEXT: STRHHui $wzr, $x0, 3 :: (store (s16))
109+
; CHECK: STURWi $wzr, $x0, 4 :: (store (s16))
92110
; CHECK-NEXT: RET undef $lr
93111
STURHHi $wzr, $x0, 4 :: (store (s16))
94112
STRHHui $wzr, $x0, 3 :: (store (s16))
95113
RET undef $lr
96114
...
97115
---
116+
name: merge_unscaled_str_with_scaled_16_lower_address_second
117+
body: |
118+
bb.0.entry:
119+
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_16_lower_address_second
120+
; CHECK: STURWi $wzr, $x0, 2 :: (store (s16))
121+
; CHECK-NEXT: RET undef $lr
122+
STURHHi $wzr, $x0, 4 :: (store (s16))
123+
STRHHui $wzr, $x0, 1 :: (store (s16))
124+
RET undef $lr
125+
...
126+
---
127+
name: merge_scaled_str_with_unscaled_16_lower_address_second
128+
body: |
129+
bb.0.entry:
130+
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_16_lower_address_second
131+
; CHECK: STRWui $wzr, $x0, 0 :: (store (s16))
132+
; CHECK-NEXT: RET undef $lr
133+
STRHHui $wzr, $x0, 1 :: (store (s16))
134+
STURHHi $wzr, $x0, 0 :: (store (s16))
135+
RET undef $lr
136+
...
137+
---
98138
name: merge_unscaled_str_with_unscaled_32
99139
body: |
100140
bb.0.entry:

0 commit comments

Comments
 (0)