Skip to content

Commit ae6e127

Browse files
authored
[AArch64] Merge scaled and unscaled narrow zero stores (llvm#136705)
1 parent 21130d3 commit ae6e127

File tree

2 files changed

+95
-11
lines changed

2 files changed

+95
-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: 90 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,56 @@ 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+
---
72+
name: merge_unscaled_str_with_scaled_8_limits
73+
body: |
74+
bb.0.entry:
75+
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_8_limits
76+
; CHECK: STURHHi $wzr, $x0, 255 :: (store (s8))
77+
; CHECK-NEXT: RET undef $lr
78+
STURBBi $wzr, $x0, 255 :: (store (s8))
79+
STRBBui $wzr, $x0, 256 :: (store (s8))
80+
RET undef $lr
81+
---
82+
---
83+
name: merge_scaled_str_with_unscaled_8_limits
84+
body: |
85+
bb.0.entry:
86+
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_8_limits
87+
; CHECK: STRHHui $wzr, $x0, 127 :: (store (s8))
88+
; CHECK-NEXT: RET undef $lr
89+
STRBBui $wzr, $x0, 254 :: (store (s8))
90+
STURBBi $wzr, $x0, 255 :: (store (s8))
91+
RET undef $lr
92+
---
5293
name: merge_unscaled_str_with_unscaled_str_16
5394
body: |
5495
bb.0:
@@ -75,8 +116,7 @@ name: merge_scaled_str_with_unscaled_16
75116
body: |
76117
bb.0.entry:
77118
; 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))
119+
; CHECK: STRWui $wzr, $x0, 1 :: (store (s16))
80120
; CHECK-NEXT: RET undef $lr
81121
STRHHui $wzr, $x0, 2 :: (store (s16))
82122
STURHHi $wzr, $x0, 6 :: (store (s16))
@@ -87,14 +127,56 @@ name: merge_unscaled_str_with_scaled_16
87127
body: |
88128
bb.0.entry:
89129
; 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))
130+
; CHECK: STURWi $wzr, $x0, 4 :: (store (s16))
92131
; CHECK-NEXT: RET undef $lr
93132
STURHHi $wzr, $x0, 4 :: (store (s16))
94133
STRHHui $wzr, $x0, 3 :: (store (s16))
95134
RET undef $lr
96135
...
97136
---
137+
name: merge_unscaled_str_with_scaled_16_lower_address_second
138+
body: |
139+
bb.0.entry:
140+
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_16_lower_address_second
141+
; CHECK: STURWi $wzr, $x0, 2 :: (store (s16))
142+
; CHECK-NEXT: RET undef $lr
143+
STURHHi $wzr, $x0, 4 :: (store (s16))
144+
STRHHui $wzr, $x0, 1 :: (store (s16))
145+
RET undef $lr
146+
...
147+
---
148+
name: merge_scaled_str_with_unscaled_16_lower_address_second
149+
body: |
150+
bb.0.entry:
151+
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_16_lower_address_second
152+
; CHECK: STRWui $wzr, $x0, 0 :: (store (s16))
153+
; CHECK-NEXT: RET undef $lr
154+
STRHHui $wzr, $x0, 1 :: (store (s16))
155+
STURHHi $wzr, $x0, 0 :: (store (s16))
156+
RET undef $lr
157+
...
158+
---
159+
name: merge_unscaled_str_with_scaled_16_limits
160+
body: |
161+
bb.0.entry:
162+
; CHECK-LABEL: name: merge_unscaled_str_with_scaled_16_limits
163+
; CHECK: STURWi $wzr, $x0, 254 :: (store (s16))
164+
; CHECK-NEXT: RET undef $lr
165+
STURHHi $wzr, $x0, 254 :: (store (s16))
166+
STRHHui $wzr, $x0, 128 :: (store (s16))
167+
RET undef $lr
168+
---
169+
---
170+
name: merge_scaled_str_with_unscaled_16_limits
171+
body: |
172+
bb.0.entry:
173+
; CHECK-LABEL: name: merge_scaled_str_with_unscaled_16_limits
174+
; CHECK: STRWui $wzr, $x0, 63 :: (store (s16))
175+
; CHECK-NEXT: RET undef $lr
176+
STRHHui $wzr, $x0, 126 :: (store (s16))
177+
STURHHi $wzr, $x0, 254 :: (store (s16))
178+
RET undef $lr
179+
---
98180
name: merge_unscaled_str_with_unscaled_32
99181
body: |
100182
bb.0.entry:

0 commit comments

Comments
 (0)