143 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -aa-pipeline=basic-aa -passes=inferattrs,dse | FileCheck %s3 4target triple = "x86_64-unknown-linux-gnu"5 6declare ptr @__memset_chk(ptr writeonly, i32, i64, i64) argmemonly7declare ptr @__memcpy_chk(ptr writeonly, ptr readonly, i64, i64) argmemonly nounwind8 9declare ptr @strncpy(ptr %dest, ptr %src, i64 %n) nounwind10declare void @use(ptr)11 12; strncpy -> __memset_chk, full overwrite13define void @dse_strncpy_memset_chk_test1(ptr noalias %out, ptr noalias %in, i64 %n) {14; CHECK-LABEL: @dse_strncpy_memset_chk_test1(15; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT:%.*]], i32 42, i64 100, i64 [[N:%.*]])16; CHECK-NEXT: ret void17;18 %call = tail call ptr @strncpy(ptr %out, ptr %in, i64 100)19 %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 100, i64 %n)20 ret void21}22 23define void @dse_memset_chk_eliminate_store1(ptr %out, i64 %n) {24; CHECK-LABEL: @dse_memset_chk_eliminate_store1(25; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT:%.*]], i32 42, i64 100, i64 [[N:%.*]])26; CHECK-NEXT: ret void27;28 store i8 10, ptr %out29 %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 100, i64 %n)30 ret void31}32 33define void @dse_memset_chk_eliminate_store2(ptr %out, i64 %n) {34; CHECK-LABEL: @dse_memset_chk_eliminate_store2(35; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[OUT:%.*]], i64 10036; CHECK-NEXT: store i8 10, ptr [[GEP]], align 137; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT]], i32 42, i64 100, i64 [[N:%.*]])38; CHECK-NEXT: ret void39;40 %gep = getelementptr inbounds i8, ptr %out, i64 10041 store i8 10, ptr %gep42 %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 100, i64 %n)43 ret void44}45 46define void @dse_memset_chk_eliminates_store_local_object_escapes_after(i64 %n) {47; CHECK-LABEL: @dse_memset_chk_eliminates_store_local_object_escapes_after(48; CHECK-NEXT: [[A:%.*]] = alloca [200 x i8], align 149; CHECK-NEXT: [[OUT_100:%.*]] = getelementptr i8, ptr [[A]], i64 10050; CHECK-NEXT: store i8 10, ptr [[OUT_100]], align 151; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[A]], i32 42, i64 100, i64 [[N:%.*]])52; CHECK-NEXT: call void @use(ptr [[A]])53; CHECK-NEXT: ret void54;55 %a = alloca [200 x i8]56 store i8 10, ptr %a57 %out.100 = getelementptr i8, ptr %a, i64 10058 store i8 10, ptr %out.10059 %call.2 = tail call ptr @__memset_chk(ptr %a, i32 42, i64 100, i64 %n)60 call void @use(ptr %a)61 ret void62}63 64define void @dse_memset_chk_eliminates_store_local_object_escapes_before(i64 %n) {65; CHECK-LABEL: @dse_memset_chk_eliminates_store_local_object_escapes_before(66; CHECK-NEXT: [[A:%.*]] = alloca [200 x i8], align 167; CHECK-NEXT: call void @use(ptr [[A]])68; CHECK-NEXT: [[OUT_100:%.*]] = getelementptr i8, ptr [[A]], i64 10069; CHECK-NEXT: store i8 0, ptr [[OUT_100]], align 170; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[A]], i32 42, i64 100, i64 [[N:%.*]])71; CHECK-NEXT: call void @use(ptr [[A]])72; CHECK-NEXT: ret void73;74 %a = alloca [200 x i8]75 call void @use(ptr %a)76 store i8 10, ptr %a77 %out.100 = getelementptr i8, ptr %a, i64 10078 store i8 0, ptr %out.10079 %call.2 = tail call ptr @__memset_chk(ptr %a, i32 42, i64 100, i64 %n)80 call void @use(ptr %a)81 ret void82}83 84; strncpy -> memset_chk, partial overwrite85define void @dse_strncpy_memset_chk_test2(ptr noalias %out, ptr noalias %in, i64 %n) {86; CHECK-LABEL: @dse_strncpy_memset_chk_test2(87; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @strncpy(ptr [[OUT:%.*]], ptr [[IN:%.*]], i64 100)88; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT]], i32 42, i64 99, i64 [[N:%.*]])89; CHECK-NEXT: ret void90;91 %call = tail call ptr @strncpy(ptr %out, ptr %in, i64 100)92 %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 99, i64 %n)93 ret void94}95 96; strncpy -> memset_chk, different destination97define void @dse_strncpy_chk_test3(ptr noalias %out1, ptr noalias %out2, ptr noalias %in, i64 %n) {98; CHECK-LABEL: @dse_strncpy_chk_test3(99; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @strncpy(ptr [[OUT1:%.*]], ptr [[IN:%.*]], i64 100)100; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT2:%.*]], i32 42, i64 100, i64 [[N:%.*]])101; CHECK-NEXT: ret void102;103 %call = tail call ptr @strncpy(ptr %out1, ptr %in, i64 100)104 %call.2 = tail call ptr @__memset_chk(ptr %out2, i32 42, i64 100, i64 %n)105 ret void106}107 108define void @dse_strncpy_memcpy_chk_test1(ptr noalias %out, ptr noalias %in, i64 %n) {109; CHECK-LABEL: @dse_strncpy_memcpy_chk_test1(110; CHECK-NEXT: [[CALL_1:%.*]] = tail call ptr @__memcpy_chk(ptr [[OUT:%.*]], ptr [[IN:%.*]], i64 100, i64 [[N:%.*]])111; CHECK-NEXT: ret void112;113 store i32 0, ptr %out114 %call.1 = tail call ptr @__memcpy_chk(ptr %out, ptr %in, i64 100, i64 %n)115 ret void116}117 118define void @dse_strncpy_memcpy_chk_test2(ptr noalias %out, ptr noalias %in, i64 %n) {119; CHECK-LABEL: @dse_strncpy_memcpy_chk_test2(120; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[OUT:%.*]], i64 100121; CHECK-NEXT: store i8 10, ptr [[GEP]], align 1122; CHECK-NEXT: [[CALL_1:%.*]] = tail call ptr @__memcpy_chk(ptr [[OUT]], ptr [[IN:%.*]], i64 100, i64 [[N:%.*]])123; CHECK-NEXT: ret void124;125 %gep = getelementptr inbounds i8, ptr %out, i64 100126 store i8 10, ptr %gep127 %call.1 = tail call ptr @__memcpy_chk(ptr %out, ptr %in, i64 100, i64 %n)128 ret void129}130 131define void @test_memcpy_intrinsic_and_memcpy_chk(ptr %A, ptr %B, ptr noalias %C) {132; CHECK-LABEL: @test_memcpy_intrinsic_and_memcpy_chk(133; CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr [[A:%.*]], ptr [[B:%.*]], i64 48, i1 false)134; CHECK-NEXT: [[CALL:%.*]] = call ptr @__memcpy_chk(ptr [[A]], ptr [[C:%.*]], i64 1, i64 10)135; CHECK-NEXT: ret void136;137 tail call void @llvm.memcpy.p0.p0.i64(ptr %A, ptr %B, i64 48, i1 false)138 %call = call ptr @__memcpy_chk(ptr %A, ptr %C, i64 1, i64 10)139 ret void140}141 142declare void @llvm.memcpy.p0.p0.i64(ptr noalias nocapture writeonly, ptr noalias nocapture readonly, i64, i1 immarg)143