Skip to content

Commit f1c2331

Browse files
committed
[MemCpyOpt] Add additional tests for earliest escape (NFC)
1 parent b712a14 commit f1c2331

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

llvm/test/Transforms/MemCpyOpt/memcpy.ll

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,94 @@ define void @memcpy_memory_none(ptr %p, ptr %p2, i64 %size) {
812812
ret void
813813
}
814814

815+
declare void @do_something()
816+
declare void @capture(ptr)
817+
818+
define void @memcpy_memcpy_escape_before(ptr noalias %P, ptr noalias %Q) {
819+
; CHECK-LABEL: @memcpy_memcpy_escape_before(
820+
; CHECK-NEXT: [[MEMTMP:%.*]] = alloca [32 x i8], align 16
821+
; CHECK-NEXT: call void @capture(ptr [[MEMTMP]])
822+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 16 [[MEMTMP]], ptr align 16 [[P:%.*]], i32 32, i1 false)
823+
; CHECK-NEXT: call void @do_something()
824+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 16 [[Q:%.*]], ptr align 16 [[MEMTMP]], i32 32, i1 false)
825+
; CHECK-NEXT: ret void
826+
;
827+
%memtmp = alloca [32 x i8], align 16
828+
call void @capture(ptr %memtmp)
829+
call void @llvm.memcpy.p0.p0.i32(ptr align 16 %memtmp, ptr align 16 %P, i32 32, i1 false)
830+
call void @do_something()
831+
call void @llvm.memcpy.p0.p0.i32(ptr align 16 %Q, ptr align 16 %memtmp, i32 32, i1 false)
832+
ret void
833+
}
834+
835+
define void @memcpy_memcpy_escape_after1(ptr noalias %P, ptr noalias %Q) {
836+
; CHECK-LABEL: @memcpy_memcpy_escape_after1(
837+
; CHECK-NEXT: [[MEMTMP:%.*]] = alloca [32 x i8], align 16
838+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 16 [[MEMTMP]], ptr align 16 [[P:%.*]], i32 32, i1 false)
839+
; CHECK-NEXT: call void @do_something()
840+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 16 [[Q:%.*]], ptr align 16 [[MEMTMP]], i32 32, i1 false)
841+
; CHECK-NEXT: call void @capture(ptr [[MEMTMP]])
842+
; CHECK-NEXT: ret void
843+
;
844+
%memtmp = alloca [32 x i8], align 16
845+
call void @llvm.memcpy.p0.p0.i32(ptr align 16 %memtmp, ptr align 16 %P, i32 32, i1 false)
846+
call void @do_something()
847+
call void @llvm.memcpy.p0.p0.i32(ptr align 16 %Q, ptr align 16 %memtmp, i32 32, i1 false)
848+
call void @capture(ptr %memtmp)
849+
ret void
850+
}
851+
852+
define void @memcpy_memcpy_escape_after2(ptr noalias %P, ptr noalias %Q) {
853+
; CHECK-LABEL: @memcpy_memcpy_escape_after2(
854+
; CHECK-NEXT: [[MEMTMP:%.*]] = alloca [32 x i8], align 16
855+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 16 [[MEMTMP]], ptr align 16 [[P:%.*]], i32 32, i1 false)
856+
; CHECK-NEXT: call void @do_something()
857+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 16 [[Q:%.*]], ptr align 16 [[MEMTMP]], i32 32, i1 false)
858+
; CHECK-NEXT: call void @capture(ptr [[P]])
859+
; CHECK-NEXT: ret void
860+
;
861+
%memtmp = alloca [32 x i8], align 16
862+
call void @llvm.memcpy.p0.p0.i32(ptr align 16 %memtmp, ptr align 16 %P, i32 32, i1 false)
863+
call void @do_something()
864+
call void @llvm.memcpy.p0.p0.i32(ptr align 16 %Q, ptr align 16 %memtmp, i32 32, i1 false)
865+
call void @capture(ptr %P)
866+
ret void
867+
}
868+
869+
define void @memcpy_byval_escape_after(ptr noalias %P) {
870+
; CHECK-LABEL: @memcpy_byval_escape_after(
871+
; CHECK-NEXT: [[A:%.*]] = alloca [8 x i8], align 1
872+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[A]], ptr align 4 [[P:%.*]], i64 8, i1 false)
873+
; CHECK-NEXT: call void @do_something()
874+
; CHECK-NEXT: call void @test4a(ptr byval(i8) align 1 [[A]])
875+
; CHECK-NEXT: call void @capture(ptr [[P]])
876+
; CHECK-NEXT: ret void
877+
;
878+
%A = alloca [8 x i8]
879+
call void @llvm.memcpy.p0.p0.i64(ptr align 4 %A, ptr align 4 %P, i64 8, i1 false)
880+
call void @do_something()
881+
call void @test4a(ptr align 1 byval(i8) %A)
882+
call void @capture(ptr %P)
883+
ret void
884+
}
885+
886+
define void @memcpy_immut_escape_after(ptr align 4 noalias %val) {
887+
; CHECK-LABEL: @memcpy_immut_escape_after(
888+
; CHECK-NEXT: [[VAL1:%.*]] = alloca i8, align 4
889+
; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 4 [[VAL1]], ptr align 4 [[VAL:%.*]], i64 1, i1 false)
890+
; CHECK-NEXT: call void @do_something()
891+
; CHECK-NEXT: call void @f(ptr noalias nocapture readonly align 4 [[VAL1]])
892+
; CHECK-NEXT: call void @capture(ptr [[VAL]])
893+
; CHECK-NEXT: ret void
894+
;
895+
%val1 = alloca i8, align 4
896+
call void @llvm.memcpy.p0.p0.i64(ptr align 4 %val1, ptr align 4 %val, i64 1, i1 false)
897+
call void @do_something()
898+
call void @f(ptr align 4 nocapture noalias readonly %val1)
899+
call void @capture(ptr %val)
900+
ret void
901+
}
902+
815903
!0 = !{!0}
816904
!1 = !{!1, !0}
817905
!2 = !{!1}

0 commit comments

Comments
 (0)