[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
Fri Aug 14 19:55:41 PDT 2020


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
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list