diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp index 1a7654983e9faf..db7078b9283f69 100644 --- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -610,12 +610,16 @@ Value *LibCallSimplifier::optimizeStrNCpy(CallInst *CI, IRBuilderBase &B) { // strncpy(a, "a", 4) - > memcpy(a, "a\0\0\0", 4) if (Len > SrcLen + 1) { - StringRef Str; - if (!getConstantStringInfo(Src, Str)) + if (Len <= 128) { + StringRef Str; + if (!getConstantStringInfo(Src, Str)) + return nullptr; + std::string SrcStr = Str.str(); + SrcStr.resize(Len, '\0'); + Src = B.CreateGlobalString(SrcStr, "str"); + } else { return nullptr; - std::string SrcStr = Str.str(); - SrcStr.resize(Len, '\0'); - Src = B.CreateGlobalString(SrcStr, "str"); + } } Type *PT = Callee->getFunctionType()->getParamType(0); diff --git a/llvm/test/Transforms/InstCombine/strncpy-3.ll b/llvm/test/Transforms/InstCombine/strncpy-3.ll index 744f1e4169e052..28d27a4f339671 100644 --- a/llvm/test/Transforms/InstCombine/strncpy-3.ll +++ b/llvm/test/Transforms/InstCombine/strncpy-3.ll @@ -38,3 +38,21 @@ define void @fill_with_zeros3(i8* %dst) { tail call i8* @strncpy(i8* %dst, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @str3, i64 0, i64 0), i64 4) ret void } + +define void @fill_with_zeros4(i8* %dst) { +; CHECK-LABEL: @fill_with_zeros4( +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* nonnull align 1 dereferenceable(128) [[DST:%.*]], i8* nonnull align 1 dereferenceable(128) getelementptr inbounds ([129 x i8], [129 x i8]* @str.2, i64 0, i64 0), i64 128, i1 false) +; CHECK-NEXT: ret void +; + tail call i8* @strncpy(i8* %dst, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @str3, i64 0, i64 0), i64 128) + ret void +} + +define void @no_simplify(i8* %dst) { +; CHECK-LABEL: @no_simplify( +; CHECK-NEXT: [[TMP1:%.*]] = tail call i8* @strncpy(i8* nonnull dereferenceable(1) [[DST:%.*]], i8* nonnull dereferenceable(5) getelementptr inbounds ([4 x i8], [4 x i8]* @str3, i64 0, i64 0), i64 129) +; CHECK-NEXT: ret void +; + tail call i8* @strncpy(i8* %dst, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @str3, i64 0, i64 0), i64 129) + ret void +}