[llvm] f62de7c - [SLC] Transform strncpy(dst, "text", C) to memcpy(dst, "text\0\0\0", C) for C <= 128 only
Philip Reames via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 17 08:17:52 PDT 2020
Shows you how often I use the c level routines these days...
Philip
On 8/15/20 3:01 AM, Dávid Bolvanský wrote:
> Right, strncpy does zeroing, so we need to preserve it.
>
>> Dňa 15. 8. 2020 o 5:19 užívateľ Craig Topper <craig.topper at gmail.com>
>> napísal:
>>
>>
>> Doesn't strncpy promise that any bytes past the end of the
>> source string are zeroed in the destination?
>>
>> ~Craig
>>
>>
>> On Fri, Aug 14, 2020 at 7:55 PM Philip Reames via llvm-commits
>> <llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>> wrote:
>>
>> Looking at your example, I'm confused by the need to pad. In the
>> examples, both the source string length and C are constant. If
>> we know
>> the source doesn't contain an embedded zero, why not just do a
>> memcpy
>> for min(Src.length, C)?
>>
>> Philip
>>
>> On 8/14/20 4:53 PM, Dávid Bolvanský via llvm-commits wrote:
>> > 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
>> > +}
>> >
>> >
>> >
>> > _______________________________________________
>> > llvm-commits mailing list
>> > llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org <mailto:llvm-commits at lists.llvm.org>
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200817/eb1a9470/attachment.html>
More information about the llvm-commits
mailing list