[𝘀𝗽𝗿] initial version Created using spr 1.3.4
diff --git a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp index bfc8bd5..5a9ea42 100644 --- a/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp +++ b/llvm/lib/Transforms/Scalar/DeadStoreElimination.cpp
@@ -760,6 +760,8 @@ bool isNoopIntrinsic(Instruction *I) { if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) { switch (II->getIntrinsicID()) { + case Intrinsic::allow_runtime_check: + case Intrinsic::allow_ubsan_check: case Intrinsic::lifetime_start: case Intrinsic::lifetime_end: case Intrinsic::invariant_end:
diff --git a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll index 4d9a767..7a4908d 100644 --- a/llvm/test/Transforms/DeadStoreElimination/libcalls.ll +++ b/llvm/test/Transforms/DeadStoreElimination/libcalls.ll
@@ -487,3 +487,20 @@ %call = tail call ptr @strncpy(ptr %out2, ptr %in, i64 100) ret void } + +define i32 @test_strcat_with_allow_check(ptr %src) { +; CHECK-LABEL: @test_strcat_with_allow_check( +; CHECK-NEXT: [[ALLOW1:%.*]] = call i1 @llvm.allow.runtime.check(metadata !"test_check") +; CHECK-NEXT: [[ALLOW2:%.*]] = call i1 @llvm.allow.ubsan.check(i8 7) +; CHECK-NEXT: tail call void @llvm.memset.p0.i64(ptr [[B:%.*]], i8 44, i64 16, i1 false) +; CHECK-NEXT: [[RET:%.*]] = load i32, ptr [[B]], align 4 +; CHECK-NEXT: ret i32 [[RET]] +; + tail call void @llvm.memset.p0.i64(ptr %src, i8 42, i64 16, i1 false) + %allow1 = call i1 @llvm.allow.runtime.check(metadata !"test_check") + tail call void @llvm.memset.p0.i64(ptr %src, i8 43, i64 16, i1 false) + %allow2 = call i1 @llvm.allow.ubsan.check(i8 7) + tail call void @llvm.memset.p0.i64(ptr %src, i8 44, i64 16, i1 false) + %ret = load i32, ptr %src, align 4 + ret i32 %ret +}