[llvm] f62de7c - [SLC] Transform strncpy(dst, "text", C) to memcpy(dst, "text\0\0\0", C) for C <= 128 only
Dávid Bolvanský via llvm-commits
llvm-commits at lists.llvm.org
Fri Aug 14 16:53:43 PDT 2020
Author: Dávid Bolvanský
Date: 2020-08-15T01:53:32+02:00
New Revision: f62de7c9c71134af060a3a1686e30e69d439e785
URL: https://github.com/llvm/llvm-project/commit/f62de7c9c71134af060a3a1686e30e69d439e785
DIFF: https://github.com/llvm/llvm-project/commit/f62de7c9c71134af060a3a1686e30e69d439e785.diff
LOG: [SLC] Transform strncpy(dst, "text", C) to memcpy(dst, "text\0\0\0", C) for C <= 128 only
Transformation creates big strings for big C values, so bail out for C > 128.
Reviewed By: efriedma
Differential Revision: https://reviews.llvm.org/D86004
Added:
Modified:
llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
llvm/test/Transforms/InstCombine/strncpy-3.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 1a7654983e9f..db7078b9283f 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 744f1e4169e0..28d27a4f3396 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
+}
More information about the llvm-commits
mailing list