From: Florian Hahn Date: Thu, 1 Dec 2022 11:37:06 +0000 (+0000) Subject: [DSE] Split off _chk libcall tests into separate file. X-Git-Tag: upstream/17.0.6~25744 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=aec03ad99119aa2c3a96faeb261b0ed583e0824b;p=platform%2Fupstream%2Fllvm.git [DSE] Split off _chk libcall tests into separate file. This keeps a clearer separation between tests and avoids growing the libcalls.ll test too large. --- diff --git a/llvm/test/Transforms/DeadStoreElimination/libcalls-chk.ll b/llvm/test/Transforms/DeadStoreElimination/libcalls-chk.ll new file mode 100644 index 0000000..d414b36 --- /dev/null +++ b/llvm/test/Transforms/DeadStoreElimination/libcalls-chk.ll @@ -0,0 +1,108 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py +; RUN: opt < %s -S -aa-pipeline=basic-aa -passes=inferattrs,dse | FileCheck %s + +target triple = "x86_64-unknown-linux-gnu" + +declare ptr @__memset_chk(ptr writeonly, i32, i64, i64) argmemonly +declare ptr @strncpy(ptr %dest, ptr %src, i64 %n) nounwind +declare void @use(ptr) + +; strncpy -> __memset_chk, full overwrite +define void @dse_strncpy_memset_chk_test1(ptr noalias %out, ptr noalias %in, i64 %n) { +; CHECK-LABEL: @dse_strncpy_memset_chk_test1( +; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @strncpy(ptr [[OUT:%.*]], ptr [[IN:%.*]], i64 100) +; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT]], i32 42, i64 100, i64 [[N:%.*]]) +; CHECK-NEXT: ret void +; + %call = tail call ptr @strncpy(ptr %out, ptr %in, i64 100) + %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 100, i64 %n) + ret void +} + +define void @dse_memset_chk_eliminate_store1(ptr %out, i64 %n) { +; CHECK-LABEL: @dse_memset_chk_eliminate_store1( +; CHECK-NEXT: store i8 10, ptr [[OUT:%.*]], align 1 +; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT]], i32 42, i64 100, i64 [[N:%.*]]) +; CHECK-NEXT: ret void +; + store i8 10, ptr %out + %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 100, i64 %n) + ret void +} + +define void @dse_memset_chk_eliminate_store2(ptr %out, i64 %n) { +; CHECK-LABEL: @dse_memset_chk_eliminate_store2( +; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds i8, ptr [[OUT:%.*]], i64 100 +; CHECK-NEXT: store i8 10, ptr [[GEP]], align 1 +; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT]], i32 42, i64 100, i64 [[N:%.*]]) +; CHECK-NEXT: ret void +; + %gep = getelementptr inbounds i8, ptr %out, i64 100 + store i8 10, ptr %gep + %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 100, i64 %n) + ret void +} + +define void @dse_memset_chk_eliminates_store_local_object_escapes_after(i64 %n) { +; CHECK-LABEL: @dse_memset_chk_eliminates_store_local_object_escapes_after( +; CHECK-NEXT: [[A:%.*]] = alloca [200 x i8], align 1 +; CHECK-NEXT: store i8 10, ptr [[A]], align 1 +; CHECK-NEXT: [[OUT_100:%.*]] = getelementptr i8, ptr [[A]], i64 100 +; CHECK-NEXT: store i8 10, ptr [[OUT_100]], align 1 +; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[A]], i32 42, i64 100, i64 [[N:%.*]]) +; CHECK-NEXT: call void @use(ptr [[A]]) +; CHECK-NEXT: ret void +; + %a = alloca [200 x i8] + store i8 10, ptr %a + %out.100 = getelementptr i8, ptr %a, i64 100 + store i8 10, ptr %out.100 + %call.2 = tail call ptr @__memset_chk(ptr %a, i32 42, i64 100, i64 %n) + call void @use(ptr %a) + ret void +} + +define void @dse_memset_chk_eliminates_store_local_object_escapes_before(i64 %n) { +; CHECK-LABEL: @dse_memset_chk_eliminates_store_local_object_escapes_before( +; CHECK-NEXT: [[A:%.*]] = alloca [200 x i8], align 1 +; CHECK-NEXT: call void @use(ptr [[A]]) +; CHECK-NEXT: store i8 10, ptr [[A]], align 1 +; CHECK-NEXT: [[OUT_100:%.*]] = getelementptr i8, ptr [[A]], i64 100 +; CHECK-NEXT: store i8 0, ptr [[OUT_100]], align 1 +; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[A]], i32 42, i64 100, i64 [[N:%.*]]) +; CHECK-NEXT: call void @use(ptr [[A]]) +; CHECK-NEXT: ret void +; + %a = alloca [200 x i8] + call void @use(ptr %a) + store i8 10, ptr %a + %out.100 = getelementptr i8, ptr %a, i64 100 + store i8 0, ptr %out.100 + %call.2 = tail call ptr @__memset_chk(ptr %a, i32 42, i64 100, i64 %n) + call void @use(ptr %a) + ret void +} + +; strncpy -> memset_chk, partial overwrite +define void @dse_strncpy_memset_chk_test2(ptr noalias %out, ptr noalias %in, i64 %n) { +; CHECK-LABEL: @dse_strncpy_memset_chk_test2( +; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @strncpy(ptr [[OUT:%.*]], ptr [[IN:%.*]], i64 100) +; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT]], i32 42, i64 99, i64 [[N:%.*]]) +; CHECK-NEXT: ret void +; + %call = tail call ptr @strncpy(ptr %out, ptr %in, i64 100) + %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 99, i64 %n) + ret void +} + +; strncpy -> memset_chk, different destination +define void @dse_strncpy_chk_test3(ptr noalias %out1, ptr noalias %out2, ptr noalias %in, i64 %n) { +; CHECK-LABEL: @dse_strncpy_chk_test3( +; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @strncpy(ptr [[OUT1:%.*]], ptr [[IN:%.*]], i64 100) +; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT2:%.*]], i32 42, i64 100, i64 [[N:%.*]]) +; CHECK-NEXT: ret void +; + %call = tail call ptr @strncpy(ptr %out1, ptr %in, i64 100) + %call.2 = tail call ptr @__memset_chk(ptr %out2, i32 42, i64 100, i64 %n) + ret void +} diff --git a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll index f437112..4d9a767 100644 --- a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll +++ b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll @@ -428,73 +428,6 @@ define void @dse_strncpy_test1(ptr noalias %out, ptr noalias %in) { ret void } -declare ptr @__memset_chk(ptr writeonly, i32, i64, i64) argmemonly - -; strncpy -> __memset_chk, full overwrite -define void @dse_strncpy_memset_chk_test1(ptr noalias %out, ptr noalias %in, i64 %n) { -; CHECK-LABEL: @dse_strncpy_memset_chk_test1( -; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @strncpy(ptr [[OUT:%.*]], ptr [[IN:%.*]], i64 100) -; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT]], i32 42, i64 100, i64 [[N:%.*]]) -; CHECK-NEXT: ret void -; - %call = tail call ptr @strncpy(ptr %out, ptr %in, i64 100) - %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 100, i64 %n) - ret void -} - -declare void @use(ptr) - -define void @dse_memset_chk_cannot_eliminates_store(ptr %out, i64 %n) { -; CHECK-LABEL: @dse_memset_chk_cannot_eliminates_store( -; CHECK-NEXT: store i8 10, ptr [[OUT:%.*]], align 1 -; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT]], i32 42, i64 100, i64 [[N:%.*]]) -; CHECK-NEXT: ret void -; - store i8 10, ptr %out - %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 100, i64 %n) - ret void -} - -define void @dse_memset_chk_eliminates_store_local_object_escapes_after(i64 %n) { -; CHECK-LABEL: @dse_memset_chk_eliminates_store_local_object_escapes_after( -; CHECK-NEXT: [[A:%.*]] = alloca [200 x i8], align 1 -; CHECK-NEXT: store i8 10, ptr [[A]], align 1 -; CHECK-NEXT: [[OUT_100:%.*]] = getelementptr i8, ptr [[A]], i64 100 -; CHECK-NEXT: store i8 10, ptr [[OUT_100]], align 1 -; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[A]], i32 42, i64 100, i64 [[N:%.*]]) -; CHECK-NEXT: call void @use(ptr [[A]]) -; CHECK-NEXT: ret void -; - %a = alloca [200 x i8] - store i8 10, ptr %a - %out.100 = getelementptr i8, ptr %a, i64 100 - store i8 10, ptr %out.100 - %call.2 = tail call ptr @__memset_chk(ptr %a, i32 42, i64 100, i64 %n) - call void @use(ptr %a) - ret void -} - -define void @dse_memset_chk_eliminates_store_local_object_escapes_before(i64 %n) { -; CHECK-LABEL: @dse_memset_chk_eliminates_store_local_object_escapes_before( -; CHECK-NEXT: [[A:%.*]] = alloca [200 x i8], align 1 -; CHECK-NEXT: call void @use(ptr [[A]]) -; CHECK-NEXT: store i8 10, ptr [[A]], align 1 -; CHECK-NEXT: [[OUT_100:%.*]] = getelementptr i8, ptr [[A]], i64 100 -; CHECK-NEXT: store i8 0, ptr [[OUT_100]], align 1 -; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[A]], i32 42, i64 100, i64 [[N:%.*]]) -; CHECK-NEXT: call void @use(ptr [[A]]) -; CHECK-NEXT: ret void -; - %a = alloca [200 x i8] - call void @use(ptr %a) - store i8 10, ptr %a - %out.100 = getelementptr i8, ptr %a, i64 100 - store i8 0, ptr %out.100 - %call.2 = tail call ptr @__memset_chk(ptr %a, i32 42, i64 100, i64 %n) - call void @use(ptr %a) - ret void -} - ; strncpy -> memset, partial overwrite define void @dse_strncpy_test2(ptr noalias %out, ptr noalias %in) { ; CHECK-LABEL: @dse_strncpy_test2( @@ -507,18 +440,6 @@ define void @dse_strncpy_test2(ptr noalias %out, ptr noalias %in) { ret void } -; strncpy -> memset_chk, partial overwrite -define void @dse_strncpy_memset_chk_test2(ptr noalias %out, ptr noalias %in, i64 %n) { -; CHECK-LABEL: @dse_strncpy_memset_chk_test2( -; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @strncpy(ptr [[OUT:%.*]], ptr [[IN:%.*]], i64 100) -; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT]], i32 42, i64 99, i64 [[N:%.*]]) -; CHECK-NEXT: ret void -; - %call = tail call ptr @strncpy(ptr %out, ptr %in, i64 100) - %call.2 = tail call ptr @__memset_chk(ptr %out, i32 42, i64 99, i64 %n) - ret void -} - ; strncpy -> memset, different destination define void @dse_strncpy_test3(ptr noalias %out1, ptr noalias %out2, ptr noalias %in) { ; CHECK-LABEL: @dse_strncpy_test3( @@ -531,18 +452,6 @@ define void @dse_strncpy_test3(ptr noalias %out1, ptr noalias %out2, ptr noalias ret void } -; strncpy -> memset_chk, different destination -define void @dse_strncpy_chk_test3(ptr noalias %out1, ptr noalias %out2, ptr noalias %in, i64 %n) { -; CHECK-LABEL: @dse_strncpy_chk_test3( -; CHECK-NEXT: [[CALL:%.*]] = tail call ptr @strncpy(ptr [[OUT1:%.*]], ptr [[IN:%.*]], i64 100) -; CHECK-NEXT: [[CALL_2:%.*]] = tail call ptr @__memset_chk(ptr [[OUT2:%.*]], i32 42, i64 100, i64 [[N:%.*]]) -; CHECK-NEXT: ret void -; - %call = tail call ptr @strncpy(ptr %out1, ptr %in, i64 100) - %call.2 = tail call ptr @__memset_chk(ptr %out2, i32 42, i64 100, i64 %n) - ret void -} - ; memset -> strncpy, full overwrite define void @dse_strncpy_test4(ptr noalias %out, ptr noalias %in) { ; CHECK-LABEL: @dse_strncpy_test4(