diff --git a/llvm/test/Transforms/DeadStoreElimination/MSSA/libcalls.ll b/llvm/test/Transforms/DeadStoreElimination/MSSA/libcalls.ll index 1c85d0db6ced75..4376154502826c 100644 --- a/llvm/test/Transforms/DeadStoreElimination/MSSA/libcalls.ll +++ b/llvm/test/Transforms/DeadStoreElimination/MSSA/libcalls.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py -; RUN: opt -S -inferattrs -basic-aa -dse < %s | FileCheck %s +; RUN: opt -S -inferattrs -basic-aa -dse < %s | FileCheck %s --check-prefixes=CHECK,LPM +; RUN: opt -S -aa-pipeline=basic-aa -passes=inferattrs,dse < %s | FileCheck %s --check-prefixes=CHECK,NPM target triple = "x86_64-unknown-linux-gnu" @@ -302,3 +303,74 @@ entry: %res = call i8* @memccpy(i8* %foo, i8* %stack.ptr, i32 42, i64 %n) ret i8* %res } + +define void @dse_strcpy(i8* nocapture readonly %src) { +; CHECK-LABEL: @dse_strcpy( +; CHECK-NEXT: [[A:%.*]] = alloca [256 x i8], align 16 +; CHECK-NEXT: [[BUF:%.*]] = getelementptr inbounds [256 x i8], [256 x i8]* [[A]], i64 0, i64 0 +; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 256, i8* nonnull [[BUF]]) +; CHECK-NEXT: [[TMP1:%.*]] = call i8* @strcpy(i8* nonnull [[BUF]], i8* nonnull dereferenceable(1) [[SRC:%.*]]) +; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull [[BUF]]) +; CHECK-NEXT: ret void +; + %a = alloca [256 x i8], align 16 + %buf = getelementptr inbounds [256 x i8], [256 x i8]* %a, i64 0, i64 0 + call void @llvm.lifetime.start.p0i8(i64 256, i8* nonnull %buf) + call i8* @strcpy(i8* nonnull %buf, i8* nonnull dereferenceable(1) %src) + call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull %buf) + ret void +} + +define void @dse_strncpy(i8* nocapture readonly %src) { +; CHECK-LABEL: @dse_strncpy( +; CHECK-NEXT: [[A:%.*]] = alloca [256 x i8], align 16 +; CHECK-NEXT: [[BUF:%.*]] = getelementptr inbounds [256 x i8], [256 x i8]* [[A]], i64 0, i64 0 +; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 256, i8* nonnull [[BUF]]) +; CHECK-NEXT: [[TMP1:%.*]] = call i8* @strncpy(i8* nonnull [[BUF]], i8* nonnull dereferenceable(1) [[SRC:%.*]], i64 6) +; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull [[BUF]]) +; CHECK-NEXT: ret void +; + %a = alloca [256 x i8], align 16 + %buf = getelementptr inbounds [256 x i8], [256 x i8]* %a, i64 0, i64 0 + call void @llvm.lifetime.start.p0i8(i64 256, i8* nonnull %buf) + call i8* @strncpy(i8* nonnull %buf, i8* nonnull dereferenceable(1) %src, i64 6) + call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull %buf) + ret void +} + +define void @dse_strcat(i8* nocapture readonly %src) { +; CHECK-LABEL: @dse_strcat( +; CHECK-NEXT: [[A:%.*]] = alloca [256 x i8], align 16 +; CHECK-NEXT: [[BUF:%.*]] = getelementptr inbounds [256 x i8], [256 x i8]* [[A]], i64 0, i64 0 +; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 256, i8* nonnull [[BUF]]) +; CHECK-NEXT: [[TMP1:%.*]] = call i8* @strcat(i8* nonnull [[BUF]], i8* nonnull dereferenceable(1) [[SRC:%.*]]) +; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull [[BUF]]) +; CHECK-NEXT: ret void +; + %a = alloca [256 x i8], align 16 + %buf = getelementptr inbounds [256 x i8], [256 x i8]* %a, i64 0, i64 0 + call void @llvm.lifetime.start.p0i8(i64 256, i8* nonnull %buf) + call i8* @strcat(i8* nonnull %buf, i8* nonnull dereferenceable(1) %src) + call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull %buf) + ret void +} + +define void @dse_strncat(i8* nocapture readonly %src) { +; CHECK-LABEL: @dse_strncat( +; CHECK-NEXT: [[A:%.*]] = alloca [256 x i8], align 16 +; CHECK-NEXT: [[BUF:%.*]] = getelementptr inbounds [256 x i8], [256 x i8]* [[A]], i64 0, i64 0 +; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 256, i8* nonnull [[BUF]]) +; CHECK-NEXT: [[TMP1:%.*]] = call i8* @strncat(i8* nonnull [[BUF]], i8* nonnull dereferenceable(1) [[SRC:%.*]], i64 6) +; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull [[BUF]]) +; CHECK-NEXT: ret void +; + %a = alloca [256 x i8], align 16 + %buf = getelementptr inbounds [256 x i8], [256 x i8]* %a, i64 0, i64 0 + call void @llvm.lifetime.start.p0i8(i64 256, i8* nonnull %buf) + call i8* @strncat(i8* nonnull %buf, i8* nonnull dereferenceable(1) %src, i64 6) + call void @llvm.lifetime.end.p0i8(i64 256, i8* nonnull %buf) + ret void +} + +declare void @llvm.lifetime.start.p0i8(i64 immarg, i8* nocapture) +declare void @llvm.lifetime.end.p0i8(i64 immarg, i8* nocapture)