@@ -221,3 +221,54 @@ define void @test20(ptr %p1, ptr %p2) {
221
221
store i32 15111112 , ptr %p2 , align 4
222
222
ret void
223
223
}
224
+
225
+ define void @test21 (ptr %p1 , ptr %p2 ) {
226
+ ; CHECK-LABEL: define void @test21(
227
+ ; CHECK-SAME: ptr [[P1:%.*]], ptr [[P2:%.*]]) {
228
+ ; CHECK-NEXT: store i32 15111111, ptr [[P1]], align 1
229
+ ; CHECK-NEXT: store i32 15111112, ptr [[P2]], align 1
230
+ ; CHECK-NEXT: ret void
231
+ ;
232
+ store i32 15111111 , ptr %p1 , align 1
233
+ store i32 15111112 , ptr %p2 , align 1
234
+ ret void
235
+ }
236
+
237
+ ; 0 immediates shouldn't be hoisted.
238
+ define void @test22 (ptr %p1 , ptr %p2 ) {
239
+ ; CHECK-LABEL: define void @test22(
240
+ ; CHECK-SAME: ptr [[P1:%.*]], ptr [[P2:%.*]]) {
241
+ ; CHECK-NEXT: store i128 0, ptr [[P1]], align 8
242
+ ; CHECK-NEXT: store i128 -1, ptr [[P2]], align 8
243
+ ; CHECK-NEXT: ret void
244
+ ;
245
+ store i64 0 , ptr %p1 , align 8
246
+ store i64 -1 , ptr %p2 , align 8
247
+ ret void
248
+ }
249
+
250
+ ; 0 immediates shouldn't be hoisted.
251
+ define void @test23 (ptr %p1 , ptr %p2 ) {
252
+ ; CHECK-LABEL: define void @test23(
253
+ ; CHECK-SAME: ptr [[P1:%.*]], ptr [[P2:%.*]]) {
254
+ ; CHECK-NEXT: store i127 0, ptr [[P1]], align 8
255
+ ; CHECK-NEXT: store i127 -1, ptr [[P2]], align 8
256
+ ; CHECK-NEXT: ret void
257
+ ;
258
+ store i127 0 , ptr %p1 , align 8
259
+ store i127 -1 , ptr %p2 , align 8
260
+ ret void
261
+ }
262
+
263
+ ; Hoisting doesn't happen for types that aren't legal.
264
+ define void @test24 (ptr %p1 , ptr %p2 ) {
265
+ ; CHECK-LABEL: define void @test24(
266
+ ; CHECK-SAME: ptr [[P1:%.*]], ptr [[P2:%.*]]) {
267
+ ; CHECK-NEXT: store i128 15111111, ptr [[P1]], align 4
268
+ ; CHECK-NEXT: store i128 15111112, ptr [[P2]], align 4
269
+ ; CHECK-NEXT: ret void
270
+ ;
271
+ store i128 15111111 , ptr %p1 , align 4
272
+ store i128 15111112 , ptr %p2 , align 4
273
+ ret void
274
+ }
0 commit comments