[llvm] 41d59a3 - [DSE] Add memset_chk tests.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 30 05:50:35 PST 2021


Author: Florian Hahn
Date: 2021-11-30T13:50:10Z
New Revision: 41d59a36459ea99ada4819a26072366f77484f87

URL: https://github.com/llvm/llvm-project/commit/41d59a36459ea99ada4819a26072366f77484f87
DIFF: https://github.com/llvm/llvm-project/commit/41d59a36459ea99ada4819a26072366f77484f87.diff

LOG: [DSE] Add 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 afe064daf5bd5..9e8d556881dbb 100644
--- a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll
@@ -443,6 +443,20 @@ define void @dse_strncpy_test1(i8* noalias %out, i8* noalias %in) {
   ret void
 }
 
+declare i8* @__memset_chk(i8* writeonly, i32, i64, i64) argmemonly
+
+; strncpy -> __memset_chk, full overwrite
+define void @dse_strncpy_memset_chk_test1(i8* noalias %out, i8* noalias %in, i64 %n) {
+; CHECK-LABEL: @dse_strncpy_memset_chk_test1(
+; CHECK-NEXT:    [[CALL:%.*]] = tail call i8* @strncpy(i8* [[OUT:%.*]], i8* [[IN:%.*]], i64 100)
+; CHECK-NEXT:    [[CALL_2:%.*]] = tail call i8* @__memset_chk(i8* [[OUT]], i32 42, i64 100, i64 [[N:%.*]])
+; CHECK-NEXT:    ret void
+;
+  %call = tail call i8* @strncpy(i8* %out, i8* %in, i64 100)
+  %call.2 = tail call i8* @__memset_chk(i8* %out, i32 42, i64 100, i64 %n)
+  ret void
+}
+
 ; strncpy -> memset, partial overwrite
 define void @dse_strncpy_test2(i8* noalias %out, i8* noalias %in) {
 ; CHECK-LABEL: @dse_strncpy_test2(
@@ -455,6 +469,18 @@ define void @dse_strncpy_test2(i8* noalias %out, i8* noalias %in) {
   ret void
 }
 
+; strncpy -> memset_chk, partial overwrite
+define void @dse_strncpy_memset_chk_test2(i8* noalias %out, i8* noalias %in, i64 %n) {
+; CHECK-LABEL: @dse_strncpy_memset_chk_test2(
+; CHECK-NEXT:    [[CALL:%.*]] = tail call i8* @strncpy(i8* [[OUT:%.*]], i8* [[IN:%.*]], i64 100)
+; CHECK-NEXT:    [[CALL_2:%.*]] = tail call i8* @__memset_chk(i8* [[OUT]], i32 42, i64 99, i64 [[N:%.*]])
+; CHECK-NEXT:    ret void
+;
+  %call = tail call i8* @strncpy(i8* %out, i8* %in, i64 100)
+  %call.2 = tail call i8* @__memset_chk(i8* %out, i32 42, i64 99, i64 %n)
+  ret void
+}
+
 ; strncpy -> memset, 
diff erent destination
 define void @dse_strncpy_test3(i8* noalias %out1, i8* noalias %out2, i8* noalias %in) {
 ; CHECK-LABEL: @dse_strncpy_test3(
@@ -467,6 +493,17 @@ define void @dse_strncpy_test3(i8* noalias %out1, i8* noalias %out2, i8* noalias
   ret void
 }
 
+; strncpy -> memset_chk, 
diff erent destination
+define void @dse_strncpy_chk_test3(i8* noalias %out1, i8* noalias %out2, i8* noalias %in, i64 %n) {
+; CHECK-LABEL: @dse_strncpy_chk_test3(
+; CHECK-NEXT:    [[CALL:%.*]] = tail call i8* @strncpy(i8* [[OUT1:%.*]], i8* [[IN:%.*]], i64 100)
+; CHECK-NEXT:    [[CALL_2:%.*]] = tail call i8* @__memset_chk(i8* [[OUT2:%.*]], i32 42, i64 100, i64 [[N:%.*]])
+; CHECK-NEXT:    ret void
+;
+  %call = tail call i8* @strncpy(i8* %out1, i8* %in, i64 100)
+  %call.2 = tail call i8* @__memset_chk(i8* %out2, i32 42, i64 100, i64 %n)
+  ret void
+}
 
 ; memset -> strncpy, full overwrite
 define void @dse_strncpy_test4(i8* noalias %out, i8* noalias %in) {

diff  --git a/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll b/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
index 8419dcadf3e19..127c027924210 100644
--- a/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/stores-of-existing-values.ll
@@ -428,6 +428,25 @@ define void @test12_memset_other_store_in_between(i8* %ptr) {
   ret void
 }
 
+declare i8* @__memset_chk(i8* writeonly, i32, i64, i64) argmemonly
+
+define void @test12_memset_chk_other_store_in_between(i8* %ptr) {
+; CHECK-LABEL: @test12_memset_chk_other_store_in_between(
+; CHECK-NEXT:    [[CALL:%.*]] = tail call i8* @__memset_chk(i8* [[PTR:%.*]], i32 0, i64 10, i64 -1)
+; 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:    ret void
+;
+  %call = tail call i8* @__memset_chk(i8* %ptr, i32 0, i64 10, i64 -1)
+  %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
+  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