147 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -aa-pipeline=basic-aa -passes='require<memoryssa>,memcpyopt' -verify-memoryssa -S %s | FileCheck %s3 4; REQUIRES: asserts5 6target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"7target triple = "x86_64-apple-macosx10.15.0"8 9%t = type <{ ptr, [4 x i8], ptr, ptr, i32, [8192 x i8] }>10 11 12define i32 @test1(ptr %ptr) {13; CHECK-LABEL: @test1(14; CHECK-NEXT: invoke.cont6:15; CHECK-NEXT: [[P_2:%.*]] = getelementptr inbounds [[T:%.*]], ptr [[PTR:%.*]], i64 0, i32 416; CHECK-NEXT: [[P_3:%.*]] = getelementptr inbounds [[T]], ptr [[PTR]], i64 0, i32 5, i64 017; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[PTR]], i8 0, i64 20, i1 false)18; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 8 [[P_2]], i8 0, i64 8195, i1 false)19; CHECK-NEXT: ret i32 020;21invoke.cont6:22 call void @llvm.memset.p0.i64(ptr %ptr, i8 0, i64 20, i1 false)23 store ptr null, ptr %ptr, align 824 %p.2 = getelementptr inbounds %t, ptr %ptr, i64 0, i32 425 store i32 0, ptr %p.2, align 826 %p.3 = getelementptr inbounds %t, ptr %ptr, i64 0, i32 5, i64 027 call void @llvm.memset.p0.i64(ptr %p.3, i8 0, i64 8191, i1 false)28 ret i32 029}30 31declare ptr @get_ptr()32 33define void @test2(ptr noalias %in) {34; CHECK-LABEL: @test2(35; CHECK-NEXT: entry:36; CHECK-NEXT: [[CALL_I1_I:%.*]] = tail call ptr @get_ptr()37; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[CALL_I1_I]], ptr [[IN:%.*]], i64 10, i1 false)38; CHECK-NEXT: ret void39;40entry:41 %call.i1.i = tail call ptr @get_ptr()42 tail call void @llvm.memset.p0.i64(ptr %call.i1.i, i8 0, i64 10, i1 false)43 tail call void @llvm.memcpy.p0.p0.i64(ptr %call.i1.i, ptr %in, i64 10, i1 false)44 ret void45}46 47declare ptr @malloc(i64)48 49define i32 @test3(ptr noalias %in) {50; CHECK-LABEL: @test3(51; CHECK-NEXT: [[CALL_I_I_I:%.*]] = tail call ptr @malloc(i64 20)52; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[CALL_I_I_I]], ptr [[IN:%.*]], i64 20, i1 false)53; CHECK-NEXT: ret i32 1054;55 %call.i.i.i = tail call ptr @malloc(i64 20)56 tail call void @llvm.memmove.p0.p0.i64(ptr %call.i.i.i, ptr %in, i64 20, i1 false)57 ret i32 1058}59 60define void @test4(i32 %n, ptr noalias %ptr.0, ptr noalias %ptr.1, ptr %ptr.2) unnamed_addr {61; CHECK-LABEL: @test4(62; CHECK-NEXT: [[ELEM_I:%.*]] = getelementptr i8, ptr [[PTR_0:%.*]], i64 863; CHECK-NEXT: store i32 [[N:%.*]], ptr [[PTR_2:%.*]], align 864; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[ELEM_I]], ptr [[PTR_1:%.*]], i64 10, i1 false)65; CHECK-NEXT: ret void66;67 %elem.i = getelementptr i8, ptr %ptr.0, i64 868 call void @llvm.memset.p0.i64(ptr %elem.i, i8 0, i64 10, i1 false)69 store i32 %n, ptr %ptr.2, align 870 call void @llvm.memcpy.p0.p0.i64(ptr %elem.i, ptr %ptr.1, i64 10, i1 false)71 ret void72}73 74declare void @decompose(ptr nocapture)75 76define void @test5(ptr %ptr) {77; CHECK-LABEL: @test5(78; CHECK-NEXT: entry:79; CHECK-NEXT: [[EARLY_DATA:%.*]] = alloca [128 x i8], align 880; CHECK-NEXT: [[TMP:%.*]] = alloca [[T:%.*]], align 881; CHECK-NEXT: call void @llvm.lifetime.start.p0(ptr [[EARLY_DATA]])82; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[PTR:%.*]], align 883; CHECK-NEXT: call fastcc void @decompose(ptr [[TMP]])84; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr [[EARLY_DATA]], ptr [[TMP]], i64 32, i1 false)85; CHECK-NEXT: ret void86;87entry:88 %early_data = alloca [128 x i8], align 889 %tmp = alloca %t, align 890 call void @llvm.lifetime.start.p0(ptr %early_data)91 %0 = load i32, ptr %ptr, align 892 call fastcc void @decompose(ptr %tmp)93 call void @llvm.memcpy.p0.p0.i64(ptr %early_data, ptr %tmp, i64 32, i1 false)94 ret void95}96 97define void @test7(ptr %ptr) {98; CHECK-LABEL: @test7(99; CHECK-NEXT: entry:100; CHECK-NEXT: [[TMP0:%.*]] = getelementptr inbounds [4 x i32], ptr [[PTR:%.*]], i64 0, i32 1101; CHECK-NEXT: [[TMP1:%.*]] = getelementptr inbounds [4 x i32], ptr [[PTR]], i64 0, i32 2102; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds [4 x i32], ptr [[PTR]], i64 0, i32 3103; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[PTR]], i8 0, i64 16, i1 false)104; CHECK-NEXT: call void @clobber()105; CHECK-NEXT: ret void106;107entry:108 store i32 0, ptr %ptr, align 1109 %0 = getelementptr inbounds [4 x i32], ptr %ptr, i64 0, i32 1110 store i32 0, ptr %0, align 1111 %1 = getelementptr inbounds [4 x i32], ptr %ptr, i64 0, i32 2112 store i32 0, ptr %1, align 1113 %2 = getelementptr inbounds [4 x i32], ptr %ptr, i64 0, i32 3114 store i32 0, ptr %2, align 1115 call void @clobber()116 ret void117}118 119define void @test8(ptr noalias %src, ptr %dst) {120; CHECK-LABEL: @test8(121; CHECK-NEXT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 [[DST:%.*]], ptr align 1 [[SRC:%.*]], i64 8224, i1 false)122; CHECK-NEXT: call void @llvm.memset.p0.i64(ptr align 1 [[SRC]], i8 0, i64 8224, i1 false)123; CHECK-NEXT: ret void124;125 %1 = load %t, ptr %src126 store %t zeroinitializer, ptr %src127 store %t %1, ptr %dst128 ret void129}130 131declare void @clobber()132 133; Function Attrs: argmemonly nounwind willreturn134declare void @llvm.lifetime.start.p0(ptr nocapture) #0135 136; Function Attrs: argmemonly nounwind willreturn137declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg) #0138 139; Function Attrs: argmemonly nounwind willreturn writeonly140declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg) #1141 142; Function Attrs: argmemonly nounwind willreturn143declare void @llvm.memmove.p0.p0.i64(ptr nocapture, ptr nocapture readonly, i64, i1 immarg) #0144 145attributes #0 = { argmemonly nounwind willreturn }146attributes #1 = { argmemonly nounwind willreturn writeonly }147