Skip to content

Commit 45d5738

Browse files
committed
[AArch64] Add PreTest for storing symmetry constant
1 parent 5e06050 commit 45d5738

File tree

2 files changed

+261
-0
lines changed

2 files changed

+261
-0
lines changed

llvm/test/CodeGen/AArch64/movimm-expand-ldst.ll

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,3 +93,162 @@ define i64 @testuu0xf555f555f555f555() {
9393
; CHECK-NEXT: ret
9494
ret i64 u0xf555f555f555f555
9595
}
96+
97+
define void @test_store_0x1234567812345678(ptr %x) {
98+
; CHECK-LABEL: test_store_0x1234567812345678:
99+
; CHECK: // %bb.0:
100+
; CHECK-NEXT: mov x8, #22136 // =0x5678
101+
; CHECK-NEXT: movk x8, #4660, lsl #16
102+
; CHECK-NEXT: orr x8, x8, x8, lsl #32
103+
; CHECK-NEXT: str x8, [x0]
104+
; CHECK-NEXT: ret
105+
store i64 u0x1234567812345678, ptr %x
106+
ret void
107+
}
108+
109+
define void @test_store_0xff3456ffff3456ff(ptr %x) {
110+
; CHECK-LABEL: test_store_0xff3456ffff3456ff:
111+
; CHECK: // %bb.0:
112+
; CHECK-NEXT: mov x8, #22271 // =0x56ff
113+
; CHECK-NEXT: movk x8, #65332, lsl #16
114+
; CHECK-NEXT: orr x8, x8, x8, lsl #32
115+
; CHECK-NEXT: str x8, [x0]
116+
; CHECK-NEXT: ret
117+
store i64 u0xff3456ffff3456ff, ptr %x
118+
ret void
119+
}
120+
121+
define void @test_store_0x00345600345600(ptr %x) {
122+
; CHECK-LABEL: test_store_0x00345600345600:
123+
; CHECK: // %bb.0:
124+
; CHECK-NEXT: mov x8, #22016 // =0x5600
125+
; CHECK-NEXT: movk x8, #52, lsl #16
126+
; CHECK-NEXT: movk x8, #13398, lsl #32
127+
; CHECK-NEXT: str x8, [x0]
128+
; CHECK-NEXT: ret
129+
store i64 u0x00345600345600, ptr %x
130+
ret void
131+
}
132+
133+
define void @test_store_0x5555555555555555(ptr %x) {
134+
; CHECK-LABEL: test_store_0x5555555555555555:
135+
; CHECK: // %bb.0:
136+
; CHECK-NEXT: mov x8, #6148914691236517205 // =0x5555555555555555
137+
; CHECK-NEXT: str x8, [x0]
138+
; CHECK-NEXT: ret
139+
store i64 u0x5555555555555555, ptr %x
140+
ret void
141+
}
142+
143+
define void @test_store_0x5055555550555555(ptr %x) {
144+
; CHECK-LABEL: test_store_0x5055555550555555:
145+
; CHECK: // %bb.0:
146+
; CHECK-NEXT: mov x8, #6148914691236517205 // =0x5555555555555555
147+
; CHECK-NEXT: and x8, x8, #0xf0fffffff0ffffff
148+
; CHECK-NEXT: str x8, [x0]
149+
; CHECK-NEXT: ret
150+
store i64 u0x5055555550555555, ptr %x
151+
ret void
152+
}
153+
154+
define void @test_store_0x0000555555555555(ptr %x) {
155+
; CHECK-LABEL: test_store_0x0000555555555555:
156+
; CHECK: // %bb.0:
157+
; CHECK-NEXT: mov x8, #6148914691236517205 // =0x5555555555555555
158+
; CHECK-NEXT: movk x8, #0, lsl #48
159+
; CHECK-NEXT: str x8, [x0]
160+
; CHECK-NEXT: ret
161+
store i64 u0x0000555555555555, ptr %x
162+
ret void
163+
}
164+
165+
define void @test_store_0x0000555500005555(ptr %x) {
166+
; CHECK-LABEL: test_store_0x0000555500005555:
167+
; CHECK: // %bb.0:
168+
; CHECK-NEXT: mov x8, #21845 // =0x5555
169+
; CHECK-NEXT: movk x8, #21845, lsl #32
170+
; CHECK-NEXT: str x8, [x0]
171+
; CHECK-NEXT: ret
172+
store i64 u0x0000555500005555, ptr %x
173+
ret void
174+
}
175+
176+
define void @test_store_0x5555000055550000(ptr %x) {
177+
; CHECK-LABEL: test_store_0x5555000055550000:
178+
; CHECK: // %bb.0:
179+
; CHECK-NEXT: mov x8, #1431633920 // =0x55550000
180+
; CHECK-NEXT: movk x8, #21845, lsl #48
181+
; CHECK-NEXT: str x8, [x0]
182+
; CHECK-NEXT: ret
183+
store i64 u0x5555000055550000, ptr %x
184+
ret void
185+
}
186+
187+
define void @test_store_u0xffff5555ffff5555(ptr %x) {
188+
; CHECK-LABEL: test_store_u0xffff5555ffff5555:
189+
; CHECK: // %bb.0:
190+
; CHECK-NEXT: mov x8, #-43691 // =0xffffffffffff5555
191+
; CHECK-NEXT: movk x8, #21845, lsl #32
192+
; CHECK-NEXT: str x8, [x0]
193+
; CHECK-NEXT: ret
194+
store i64 u0xffff5555ffff5555, ptr %x
195+
ret void
196+
}
197+
198+
define void @test_store_0x8888ffff8888ffff(ptr %x) {
199+
; CHECK-LABEL: test_store_0x8888ffff8888ffff:
200+
; CHECK: // %bb.0:
201+
; CHECK-NEXT: mov x8, #-2004287489 // =0xffffffff8888ffff
202+
; CHECK-NEXT: movk x8, #34952, lsl #48
203+
; CHECK-NEXT: str x8, [x0]
204+
; CHECK-NEXT: ret
205+
store i64 u0x8888ffff8888ffff, ptr %x
206+
ret void
207+
}
208+
209+
define void @test_store_uu0xfffff555f555f555(ptr %x) {
210+
; CHECK-LABEL: test_store_uu0xfffff555f555f555:
211+
; CHECK: // %bb.0:
212+
; CHECK-NEXT: mov x8, #-2731 // =0xfffffffffffff555
213+
; CHECK-NEXT: movk x8, #62805, lsl #16
214+
; CHECK-NEXT: movk x8, #62805, lsl #32
215+
; CHECK-NEXT: str x8, [x0]
216+
; CHECK-NEXT: ret
217+
store i64 u0xfffff555f555f555, ptr %x
218+
ret void
219+
}
220+
221+
define void @test_store_uu0xf555f555f555f555(ptr %x) {
222+
; CHECK-LABEL: test_store_uu0xf555f555f555f555:
223+
; CHECK: // %bb.0:
224+
; CHECK-NEXT: mov x8, #6148914691236517205 // =0x5555555555555555
225+
; CHECK-NEXT: orr x8, x8, #0xe001e001e001e001
226+
; CHECK-NEXT: str x8, [x0]
227+
; CHECK-NEXT: ret
228+
store i64 u0xf555f555f555f555, ptr %x
229+
ret void
230+
}
231+
232+
define void @test_store_0x1234567812345678_offset_range(ptr %x) {
233+
%g = getelementptr i64, ptr %x, i64 4
234+
store i64 u0x1234567812345678, ptr %g
235+
ret void
236+
}
237+
238+
define void @test_store_0x1234567812345678_offset_min(ptr %x) {
239+
%g = getelementptr i1, ptr %x, i32 0
240+
store i64 u0x1234567812345678, ptr %g
241+
ret void
242+
}
243+
244+
define void @test_store_0x1234567812345678_offset_max(ptr %x) {
245+
%g = getelementptr i1, ptr %x, i32 248
246+
store i64 u0x1234567812345678, ptr %g
247+
ret void
248+
}
249+
250+
define void @test_store_0x1234567812345678_offset_max_over(ptr %x) {
251+
%g = getelementptr i1, ptr %x, i32 249
252+
store i64 u0x1234567812345678, ptr %g
253+
ret void
254+
}

llvm/test/CodeGen/AArch64/movimm-expand-ldst.mir

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,105 @@ body: |
3232
; CHECK-NEXT: RET undef $lr, implicit $x0
3333
renamable $x0 = MOVi64imm -4550323095879417536
3434
RET_ReallyLR implicit $x0
35+
...
36+
---
37+
name: test_fold_repeating_constant_store
38+
tracksRegLiveness: true
39+
body: |
40+
bb.0:
41+
liveins: $x0
42+
; CHECK-LABEL: name: test_fold_repeating_constant_store
43+
; CHECK: liveins: $x0
44+
; CHECK-NEXT: {{ $}}
45+
; CHECK-NEXT: renamable $x8 = MOVZXi 49370, 0
46+
; CHECK-NEXT: renamable $x8 = MOVKXi $x8, 320, 16
47+
; CHECK-NEXT: renamable $x8 = ORRXrs $x8, $x8, 32
48+
; CHECK-NEXT: STRXui killed renamable $x8, killed renamable $x0, 0
49+
; CHECK-NEXT: RET undef $lr
50+
renamable $x8 = MOVi64imm 90284035103834330
51+
STRXui killed renamable $x8, killed renamable $x0, 0
52+
RET_ReallyLR
53+
...
54+
---
55+
name: test_fold_repeating_constant_store_neg
56+
tracksRegLiveness: true
57+
body: |
58+
bb.0:
59+
liveins: $x0
60+
; CHECK-LABEL: name: test_fold_repeating_constant_store_neg
61+
; CHECK: liveins: $x0
62+
; CHECK-NEXT: {{ $}}
63+
; CHECK-NEXT: renamable $x8 = MOVZXi 320, 0
64+
; CHECK-NEXT: renamable $x8 = MOVKXi $x8, 49370, 16
65+
; CHECK-NEXT: renamable $x8 = ORRXrs $x8, $x8, 32
66+
; CHECK-NEXT: STRXui killed renamable $x8, killed renamable $x0, 0
67+
; CHECK-NEXT: RET undef $lr
68+
renamable $x8 = MOVi64imm -4550323095879417536
69+
STRXui killed renamable $x8, killed renamable $x0, 0
70+
RET_ReallyLR
71+
...
72+
---
73+
name: test_fold_repeating_constant_store_16bit_unit
74+
tracksRegLiveness: true
75+
body: |
76+
bb.0:
77+
liveins: $x0
78+
; CHECK-LABEL: name: test_fold_repeating_constant_store_16bit_unit
79+
; CHECK: liveins: $x0
80+
; CHECK-NEXT: {{ $}}
81+
; CHECK-NEXT: renamable $x8 = MOVZXi 21845, 16
82+
; CHECK-NEXT: renamable $x8 = MOVKXi $x8, 21845, 48
83+
; CHECK-NEXT: STRXui killed renamable $x8, killed renamable $x0, 0
84+
; CHECK-NEXT: RET undef $lr
85+
renamable $x8 = MOVZXi 21845, 16
86+
renamable $x8 = MOVKXi $x8, 21845, 48
87+
STRXui killed renamable $x8, killed renamable $x0, 0
88+
RET undef $lr
89+
...
90+
---
91+
name: test_fold_repeating_constant_store_offset_min
92+
tracksRegLiveness: true
93+
body: |
94+
bb.0:
95+
liveins: $x0
96+
renamable $x8 = MOVZXi 22136, 0
97+
renamable $x8 = MOVKXi $x8, 4660, 16
98+
renamable $x8 = ORRXrs $x8, $x8, 32
99+
STRXui killed renamable $x8, killed renamable $x0, -32
100+
RET undef $lr
101+
...
102+
---
103+
name: test_fold_repeating_constant_store_offset_max
104+
tracksRegLiveness: true
105+
body: |
106+
bb.0:
107+
liveins: $x0
108+
renamable $x8 = MOVZXi 22136, 0
109+
renamable $x8 = MOVKXi $x8, 4660, 16
110+
renamable $x8 = ORRXrs $x8, $x8, 32
111+
STRXui killed renamable $x8, killed renamable $x0, 31
112+
RET undef $lr
113+
...
114+
---
115+
name: test_fold_repeating_constant_store_offset_min_lower
116+
tracksRegLiveness: true
117+
body: |
118+
bb.0:
119+
liveins: $x0
120+
renamable $x8 = MOVZXi 22136, 0
121+
renamable $x8 = MOVKXi $x8, 4660, 16
122+
renamable $x8 = ORRXrs $x8, $x8, 32
123+
STRXui killed renamable $x8, killed renamable $x0, -33
124+
RET undef $lr
125+
...
126+
---
127+
name: test_fold_repeating_constant_store_offset_max_over
128+
tracksRegLiveness: true
129+
body: |
130+
bb.0:
131+
liveins: $x0
132+
renamable $x8 = MOVZXi 22136, 0
133+
renamable $x8 = MOVKXi $x8, 4660, 16
134+
renamable $x8 = ORRXrs $x8, $x8, 32
135+
STRXui killed renamable $x8, killed renamable $x0, 32
136+
RET undef $lr

0 commit comments

Comments
 (0)