@@ -21,7 +21,7 @@ define i8 @remove_alloca_use_arg(i1 %cond) {
21
21
;
22
22
entry:
23
23
%alloca = alloca [32 x i8 ], align 4 , addrspace (1 )
24
- call void @llvm.memcpy.p1.p0.i64 (ptr addrspace (1 ) %alloca , ptr @g1 , i64 256 , i1 false )
24
+ call void @llvm.memcpy.p1.p0.i64 (ptr addrspace (1 ) %alloca , ptr @g1 , i64 32 , i1 false )
25
25
br i1 %cond , label %if , label %else
26
26
27
27
if:
@@ -42,7 +42,7 @@ define i8 @volatile_load_keep_alloca(i1 %cond) {
42
42
; CHECK-LABEL: @volatile_load_keep_alloca(
43
43
; CHECK-NEXT: entry:
44
44
; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [32 x i8], align 4, addrspace(1)
45
- ; CHECK-NEXT: call void @llvm.memcpy.p1.p0.i64(ptr addrspace(1) noundef align 4 dereferenceable(256 ) [[ALLOCA]], ptr noundef nonnull align 16 dereferenceable(256 ) @g1, i64 256 , i1 false)
45
+ ; CHECK-NEXT: call void @llvm.memcpy.p1.p0.i64(ptr addrspace(1) noundef align 4 dereferenceable(32 ) [[ALLOCA]], ptr noundef nonnull align 16 dereferenceable(32 ) @g1, i64 32 , i1 false)
46
46
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
47
47
; CHECK: if:
48
48
; CHECK-NEXT: [[VAL_IF:%.*]] = getelementptr inbounds [32 x i8], ptr addrspace(1) [[ALLOCA]], i64 0, i64 1
@@ -57,7 +57,7 @@ define i8 @volatile_load_keep_alloca(i1 %cond) {
57
57
;
58
58
entry:
59
59
%alloca = alloca [32 x i8 ], align 4 , addrspace (1 )
60
- call void @llvm.memcpy.p1.p0.i64 (ptr addrspace (1 ) %alloca , ptr @g1 , i64 256 , i1 false )
60
+ call void @llvm.memcpy.p1.p0.i64 (ptr addrspace (1 ) %alloca , ptr @g1 , i64 32 , i1 false )
61
61
br i1 %cond , label %if , label %else
62
62
63
63
if:
@@ -124,7 +124,7 @@ define i8 @loop_phi_remove_alloca(i1 %cond) {
124
124
;
125
125
entry:
126
126
%alloca = alloca [32 x i8 ], align 4 , addrspace (1 )
127
- call void @llvm.memcpy.p1.p0.i64 (ptr addrspace (1 ) %alloca , ptr @g1 , i64 256 , i1 false )
127
+ call void @llvm.memcpy.p1.p0.i64 (ptr addrspace (1 ) %alloca , ptr @g1 , i64 32 , i1 false )
128
128
%val1 = getelementptr inbounds [32 x i8 ], ptr addrspace (1 ) %alloca , i32 0 , i32 1
129
129
br label %bb.0
130
130
@@ -190,7 +190,7 @@ bb.0:
190
190
191
191
bb.1 :
192
192
%val2 = getelementptr inbounds [32 x i8 ], ptr addrspace (1 ) %alloca , i32 0 , i32 2
193
- call void @llvm.memcpy.p1.p0.i64 (ptr addrspace (1 ) %alloca , ptr @g1 , i64 256 , i1 false )
193
+ call void @llvm.memcpy.p1.p0.i64 (ptr addrspace (1 ) %alloca , ptr @g1 , i64 32 , i1 false )
194
194
br label %bb.0
195
195
196
196
exit:
@@ -337,6 +337,78 @@ exit:
337
337
ret i32 %v
338
338
}
339
339
340
+ define i8 @select_same_addrspace_remove_alloca (i1 %cond , ptr %p ) {
341
+ ; CHECK-LABEL: @select_same_addrspace_remove_alloca(
342
+ ; CHECK-NEXT: entry:
343
+ ; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [32 x i8], align 1
344
+ ; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(32) [[ALLOCA]], ptr noundef nonnull align 16 dereferenceable(32) @g1, i64 32, i1 false)
345
+ ; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr [[ALLOCA]], ptr [[P:%.*]]
346
+ ; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[PTR]], align 1
347
+ ; CHECK-NEXT: ret i8 [[LOAD]]
348
+ ;
349
+ entry:
350
+ %alloca = alloca [32 x i8 ]
351
+ call void @llvm.memcpy.p0.p0.i64 (ptr %alloca , ptr @g1 , i64 32 , i1 false )
352
+ %ptr = select i1 %cond , ptr %alloca , ptr %p
353
+ %load = load i8 , ptr %ptr
354
+ ret i8 %load
355
+ }
356
+
357
+ define i8 @select_after_memcpy_keep_alloca (i1 %cond , ptr %p ) {
358
+ ; CHECK-LABEL: @select_after_memcpy_keep_alloca(
359
+ ; CHECK-NEXT: entry:
360
+ ; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [32 x i8], align 1
361
+ ; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr [[ALLOCA]], ptr [[P:%.*]]
362
+ ; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 1 dereferenceable(32) [[PTR]], ptr noundef nonnull align 16 dereferenceable(32) @g1, i64 32, i1 false)
363
+ ; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[PTR]], align 1
364
+ ; CHECK-NEXT: ret i8 [[LOAD]]
365
+ ;
366
+ entry:
367
+ %alloca = alloca [32 x i8 ]
368
+ %ptr = select i1 %cond , ptr %alloca , ptr %p
369
+ call void @llvm.memcpy.p0.p0.i64 (ptr %ptr , ptr @g1 , i64 32 , i1 false )
370
+ %load = load i8 , ptr %ptr
371
+ ret i8 %load
372
+ }
373
+
374
+ define i8 @select_diff_addrspace_keep_alloca (i1 %cond , ptr addrspace (1 ) %p ) {
375
+ ; CHECK-LABEL: @select_diff_addrspace_keep_alloca(
376
+ ; CHECK-NEXT: entry:
377
+ ; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [32 x i8], align 1, addrspace(1)
378
+ ; CHECK-NEXT: call void @llvm.memcpy.p1.p0.i64(ptr addrspace(1) noundef align 1 dereferenceable(32) [[ALLOCA]], ptr noundef nonnull align 16 dereferenceable(32) @g1, i64 32, i1 false)
379
+ ; CHECK-NEXT: [[PTR:%.*]] = select i1 [[COND:%.*]], ptr addrspace(1) [[ALLOCA]], ptr addrspace(1) [[P:%.*]]
380
+ ; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr addrspace(1) [[PTR]], align 1
381
+ ; CHECK-NEXT: ret i8 [[LOAD]]
382
+ ;
383
+ entry:
384
+ %alloca = alloca [32 x i8 ], addrspace (1 )
385
+ call void @llvm.memcpy.p1.p0.i64 (ptr addrspace (1 ) %alloca , ptr @g1 , i64 32 , i1 false )
386
+ %ptr = select i1 %cond , ptr addrspace (1 ) %alloca , ptr addrspace (1 ) %p
387
+ %load = load i8 , ptr addrspace (1 ) %ptr
388
+ ret i8 %load
389
+ }
390
+
391
+ define i8 @select_diff_addrspace_remove_alloca (i1 %cond , ptr %p ) {
392
+ ; CHECK-LABEL: @select_diff_addrspace_remove_alloca(
393
+ ; CHECK-NEXT: entry:
394
+ ; CHECK-NEXT: [[ALLOCA:%.*]] = alloca [32 x i8], align 1
395
+ ; CHECK-NEXT: call void @llvm.memcpy.p0.p1.i64(ptr noundef nonnull align 1 dereferenceable(32) [[ALLOCA]], ptr addrspace(1) noundef align 16 dereferenceable(32) @g2, i64 32, i1 false)
396
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [32 x i8], ptr [[ALLOCA]], i64 0, i64 2
397
+ ; CHECK-NEXT: [[SEL:%.*]] = select i1 [[COND:%.*]], ptr [[ALLOCA]], ptr [[GEP]]
398
+ ; CHECK-NEXT: [[GEP2:%.*]] = getelementptr inbounds i8, ptr [[SEL]], i64 4
399
+ ; CHECK-NEXT: [[LOAD:%.*]] = load i8, ptr [[GEP2]], align 1
400
+ ; CHECK-NEXT: ret i8 [[LOAD]]
401
+ ;
402
+ entry:
403
+ %alloca = alloca [32 x i8 ]
404
+ call void @llvm.memcpy.p0.p1.i64 (ptr %alloca , ptr addrspace (1 ) @g2 , i64 32 , i1 false )
405
+ %gep = getelementptr inbounds [32 x i8 ], ptr %alloca , i32 0 , i32 2
406
+ %sel = select i1 %cond , ptr %alloca , ptr %gep
407
+ %gep2 = getelementptr inbounds i8 , ptr %sel , i64 4
408
+ %load = load i8 , ptr %gep2
409
+ ret i8 %load
410
+ }
411
+
340
412
declare void @llvm.memcpy.p1.p0.i64 (ptr addrspace (1 ), ptr , i64 , i1 )
341
413
declare void @llvm.memcpy.p0.p0.i64 (ptr , ptr , i64 , i1 )
342
414
declare void @llvm.memcpy.p0.p1.i64 (ptr , ptr addrspace (1 ), i64 , i1 )
0 commit comments