[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