@@ -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