Skip to content

Commit f61ee94

Browse files
gandhi56nikic
authored andcommitted
[InstCombine] Add tests for constant memcpy with select (NFC)
Tests for D136524.
1 parent ed9ef9b commit f61ee94

File tree

1 file changed

+77
-5
lines changed

1 file changed

+77
-5
lines changed

llvm/test/Transforms/InstCombine/replace-alloca-phi.ll renamed to llvm/test/Transforms/InstCombine/ptr-replace-alloca.ll

Lines changed: 77 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ define i8 @remove_alloca_use_arg(i1 %cond) {
2121
;
2222
entry:
2323
%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)
2525
br i1 %cond, label %if, label %else
2626

2727
if:
@@ -42,7 +42,7 @@ define i8 @volatile_load_keep_alloca(i1 %cond) {
4242
; CHECK-LABEL: @volatile_load_keep_alloca(
4343
; CHECK-NEXT: entry:
4444
; 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)
4646
; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF:%.*]], label [[ELSE:%.*]]
4747
; CHECK: if:
4848
; 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) {
5757
;
5858
entry:
5959
%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)
6161
br i1 %cond, label %if, label %else
6262

6363
if:
@@ -124,7 +124,7 @@ define i8 @loop_phi_remove_alloca(i1 %cond) {
124124
;
125125
entry:
126126
%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)
128128
%val1 = getelementptr inbounds [32 x i8], ptr addrspace(1) %alloca, i32 0, i32 1
129129
br label %bb.0
130130

@@ -190,7 +190,7 @@ bb.0:
190190

191191
bb.1:
192192
%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)
194194
br label %bb.0
195195

196196
exit:
@@ -337,6 +337,78 @@ exit:
337337
ret i32 %v
338338
}
339339

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+
340412
declare void @llvm.memcpy.p1.p0.i64(ptr addrspace(1), ptr, i64, i1)
341413
declare void @llvm.memcpy.p0.p0.i64(ptr, ptr, i64, i1)
342414
declare void @llvm.memcpy.p0.p1.i64(ptr, ptr addrspace(1), i64, i1)

0 commit comments

Comments
 (0)