[DSE] Add memset_chk tests.
diff --git a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll
index afe064d..9e8d556 100644
--- a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll
+++ b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll
@@ -443,6 +443,20 @@
   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 @@
   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, different destination
 define void @dse_strncpy_test3(i8* noalias %out1, i8* noalias %out2, i8* noalias %in) {
 ; CHECK-LABEL: @dse_strncpy_test3(
@@ -467,6 +493,17 @@
   ret void
 }
 
+; strncpy -> memset_chk, different 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 8419dca..127c027 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 @@
   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)