@@ -812,6 +812,94 @@ define void @memcpy_memory_none(ptr %p, ptr %p2, i64 %size) {
812
812
ret void
813
813
}
814
814
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
+
815
903
!0 = !{!0 }
816
904
!1 = !{!1 , !0 }
817
905
!2 = !{!1 }
0 commit comments