[llvm] 4a419ea - [DSE] Add additional memset_chk tests.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 6 05:06:38 PST 2021


Author: Florian Hahn
Date: 2021-12-06T13:06:11Z
New Revision: 4a419ea4007bec1ca87299785113046024e475b6

URL: https://github.com/llvm/llvm-project/commit/4a419ea4007bec1ca87299785113046024e475b6
DIFF: https://github.com/llvm/llvm-project/commit/4a419ea4007bec1ca87299785113046024e475b6.diff

LOG: [DSE] Add additional memset_chk tests.

Added: 
    

Modified: 
    llvm/test/Transforms/DeadStoreElimination/libcalls.ll
    llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll
index c0aa4c14fc1b4..619287748d3e3 100644
--- a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll
@@ -477,6 +477,63 @@ define void @dse_strncpy_memset_chk_test1(i8* noalias %out, i8* noalias %in, i64
   ret void
 }
 
+declare void @use(i8*)
+
+define void @dse_memset_chk_cannot_eliminates_store(i8* %out, i64 %n) {
+; CHECK-LABEL: @dse_memset_chk_cannot_eliminates_store(
+; CHECK-NEXT:    store i8 10, i8* [[OUT:%.*]], align 1
+; CHECK-NEXT:    [[CALL_2:%.*]] = tail call i8* @__memset_chk(i8* [[OUT]], i32 42, i64 100, i64 [[N:%.*]])
+; CHECK-NEXT:    ret void
+;
+  store i8 10, i8* %out
+  %call.2 = tail call i8* @__memset_chk(i8* %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:    [[OUT:%.*]] = bitcast [200 x i8]* [[A]] to i8*
+; CHECK-NEXT:    store i8 10, i8* [[OUT]], align 1
+; CHECK-NEXT:    [[OUT_100:%.*]] = getelementptr i8, i8* [[OUT]], i64 100
+; CHECK-NEXT:    store i8 10, i8* [[OUT_100]], align 1
+; CHECK-NEXT:    [[CALL_2:%.*]] = tail call i8* @__memset_chk(i8* [[OUT]], i32 42, i64 100, i64 [[N:%.*]])
+; CHECK-NEXT:    call void @use(i8* [[OUT]])
+; CHECK-NEXT:    ret void
+;
+  %a = alloca [200 x i8]
+  %out = bitcast [200 x i8]* %a to i8*
+  store i8 10, i8* %out
+  %out.100 = getelementptr i8, i8* %out, i64 100
+  store i8 10, i8* %out.100
+  %call.2 = tail call i8* @__memset_chk(i8* %out, i32 42, i64 100, i64 %n)
+  call void @use(i8* %out)
+  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:    [[OUT:%.*]] = bitcast [200 x i8]* [[A]] to i8*
+; CHECK-NEXT:    call void @use(i8* [[OUT]])
+; CHECK-NEXT:    store i8 10, i8* [[OUT]], align 1
+; CHECK-NEXT:    [[OUT_100:%.*]] = getelementptr i8, i8* [[OUT]], i64 100
+; CHECK-NEXT:    store i8 0, i8* [[OUT_100]], align 1
+; CHECK-NEXT:    [[CALL_2:%.*]] = tail call i8* @__memset_chk(i8* [[OUT]], i32 42, i64 100, i64 [[N:%.*]])
+; CHECK-NEXT:    call void @use(i8* [[OUT]])
+; CHECK-NEXT:    ret void
+;
+  %a = alloca [200 x i8]
+  %out = bitcast [200 x i8]* %a to i8*
+  call void @use(i8* %out)
+  store i8 10, i8* %out
+  %out.100 = getelementptr i8, i8* %out, i64 100
+  store i8 0, i8* %out.100
+  %call.2 = tail call i8* @__memset_chk(i8* %out, i32 42, i64 100, i64 %n)
+  call void @use(i8* %out)
+  ret void
+}
+
 ; strncpy -> memset, partial overwrite
 define void @dse_strncpy_test2(i8* noalias %out, i8* noalias %in) {
 ; CHECK-LABEL: @dse_strncpy_test2(

diff  --git a/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll b/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
index b3bc95f4c7755..f3943326fc6fd 100644
--- a/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
@@ -447,7 +447,7 @@ define void @test12_memset_other_store_in_between(i8* %ptr) {
   ret void
 }
 
-declare i8* @__memset_chk(i8* writeonly, i32, i64, i64) argmemonly
+declare i8* @__memset_chk(i8* writeonly, i32, i64, i64) argmemonly writeonly nofree nounwind
 
 define void @test12_memset_chk_other_store_in_between(i8* %ptr) {
 ; CHECK-LABEL: @test12_memset_chk_other_store_in_between(
@@ -466,6 +466,60 @@ define void @test12_memset_chk_other_store_in_between(i8* %ptr) {
   ret void
 }
 
+declare void @use(i8*)
+
+define void @test12_memset_chk_other_store_in_between_stack_obj_escape_after(i64 %n) {
+; CHECK-LABEL: @test12_memset_chk_other_store_in_between_stack_obj_escape_after(
+; CHECK-NEXT:    [[OBJ:%.*]] = alloca [200 x i8], align 1
+; CHECK-NEXT:    [[PTR:%.*]] = bitcast [200 x i8]* [[OBJ]] to i8*
+; CHECK-NEXT:    [[CALL:%.*]] = tail call i8* @__memset_chk(i8* [[PTR]], i32 0, i64 10, i64 [[N:%.*]])
+; CHECK-NEXT:    [[PTR_4:%.*]] = getelementptr i8, i8* [[PTR]], i64 4
+; CHECK-NEXT:    store i8 8, i8* [[PTR_4]], align 1
+; CHECK-NEXT:    [[PTR_5:%.*]] = getelementptr i8, i8* [[PTR]], i64 5
+; CHECK-NEXT:    store i8 0, i8* [[PTR_5]], align 1
+; CHECK-NEXT:    call void @use(i8* [[PTR]])
+; CHECK-NEXT:    ret void
+;
+  %obj = alloca [200 x i8]
+  %ptr = bitcast [200 x i8]* %obj to i8*
+  %call = tail call i8* @__memset_chk(i8* %ptr, i32 0, i64 10, i64 %n)
+  %ptr.4 = getelementptr i8, i8* %ptr, i64 4
+  store i8 8, i8* %ptr.4
+  %ptr.5 = getelementptr i8, i8* %ptr, i64 5
+  store i8 0, i8* %ptr.5
+  call void @use(i8* %ptr)
+  ret void
+}
+
+define void @test12_memset_chk_other_store_in_between_stack_obj_escape_before(i64 %n) {
+; CHECK-LABEL: @test12_memset_chk_other_store_in_between_stack_obj_escape_before(
+; CHECK-NEXT:    [[OBJ:%.*]] = alloca [200 x i8], align 1
+; CHECK-NEXT:    [[PTR:%.*]] = bitcast [200 x i8]* [[OBJ]] to i8*
+; CHECK-NEXT:    call void @use(i8* [[PTR]])
+; CHECK-NEXT:    [[CALL:%.*]] = tail call i8* @__memset_chk(i8* [[PTR]], i32 0, i64 10, i64 [[N:%.*]])
+; CHECK-NEXT:    [[PTR_4:%.*]] = getelementptr i8, i8* [[PTR]], i64 4
+; CHECK-NEXT:    store i8 8, i8* [[PTR_4]], align 1
+; CHECK-NEXT:    [[PTR_5:%.*]] = getelementptr i8, i8* [[PTR]], i64 5
+; CHECK-NEXT:    store i8 0, i8* [[PTR_5]], align 1
+; CHECK-NEXT:    [[PTR_10:%.*]] = getelementptr i8, i8* [[PTR]], i64 10
+; CHECK-NEXT:    store i8 0, i8* [[PTR_10]], align 1
+; CHECK-NEXT:    call void @use(i8* [[PTR]])
+; CHECK-NEXT:    ret void
+;
+  %obj = alloca [200 x i8]
+  %ptr = bitcast [200 x i8]* %obj to i8*
+  call void @use(i8* %ptr)
+  %call = tail call i8* @__memset_chk(i8* %ptr, i32 0, i64 10, i64 %n)
+  %ptr.4 = getelementptr i8, i8* %ptr, i64 4
+  store i8 8, i8* %ptr.4
+  %ptr.5 = getelementptr i8, i8* %ptr, i64 5
+  store i8 0, i8* %ptr.5
+  %ptr.10 = getelementptr i8, i8* %ptr, i64 10
+  store i8 0, i8* %ptr.10
+  call void @use(i8* %ptr)
+  ret void
+}
+
 define void @test12_memset_other_store_in_between_partial_overlap(i8* %ptr) {
 ; CHECK-LABEL: @test12_memset_other_store_in_between_partial_overlap(
 ; CHECK-NEXT:    call void @llvm.memset.p0i8.i64(i8* [[PTR:%.*]], i8 0, i64 10, i1 false)


        


More information about the llvm-commits mailing list