<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 1 May 2014 23:53, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@gmail.com" target="_blank">benny.kra@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div class=""><br>
On 02.05.2014, at 06:11, Nick Lewycky <<a href="mailto:nicholas@mxc.ca">nicholas@mxc.ca</a>> wrote:<br>
<br>
> Author: nicholas<br>
> Date: Thu May  1 23:11:45 2014<br>
> New Revision: 207828<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=207828&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=207828&view=rev</a><br>
> Log:<br>
> Fold strlen(expr ? "str1" : "str2") to x ? len1 : len2. This fires about 330 times in a bootstrap of clang.<br>
<br>
</div>Is there anything preventing the strlen folding from being hoisted into the general constant folding logic where we also handle math functions? I think instcombine would give us this kind of folding for free then.<br>

</blockquote><div><br></div><div>Yes, the select would need to be a constexpr, which it can't always be because its condition variable may be an instruction.</div><div><br></div><div>Nick</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<br>
- Ben<br>
<div class="HOEnZb"><div class="h5">><br>
> Modified:<br>
>    llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp<br>
>    llvm/trunk/test/Transforms/InstCombine/strlen-1.ll<br>
><br>
> Modified: llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp?rev=207828&r1=207827&r2=207828&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp?rev=207828&r1=207827&r2=207828&view=diff</a><br>


> ==============================================================================<br>
> --- llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp (original)<br>
> +++ llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp Thu May  1 23:11:45 2014<br>
> @@ -784,10 +784,25 @@ struct StrLenOpt : public LibCallOptimiz<br>
>     if (uint64_t Len = GetStringLength(Src))<br>
>       return ConstantInt::get(CI->getType(), Len-1);<br>
><br>
> +    // strlen(x?"foo":"bars") --> x ? 3 : 4<br>
> +    if (SelectInst *SI = dyn_cast<SelectInst>(Src)) {<br>
> +      uint64_t LenTrue = GetStringLength(SI->getTrueValue());<br>
> +      uint64_t LenFalse = GetStringLength(SI->getFalseValue());<br>
> +      if (LenTrue && LenFalse) {<br>
> +        Context->emitOptimizationRemark(<br>
> +            "simplify-libcalls", *Caller, SI->getDebugLoc(),<br>
> +            "folded strlen(select) to select of constants");<br>
> +        return B.CreateSelect(SI->getCondition(),<br>
> +                              ConstantInt::get(CI->getType(), LenTrue-1),<br>
> +                              ConstantInt::get(CI->getType(), LenFalse-1));<br>
> +      }<br>
> +    }<br>
> +<br>
>     // strlen(x) != 0 --> *x != 0<br>
>     // strlen(x) == 0 --> *x == 0<br>
>     if (isOnlyUsedInZeroEqualityComparison(CI))<br>
>       return B.CreateZExt(B.CreateLoad(Src, "strlenfirst"), CI->getType());<br>
> +<br>
>     return nullptr;<br>
>   }<br>
> };<br>
><br>
> Modified: llvm/trunk/test/Transforms/InstCombine/strlen-1.ll<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/strlen-1.ll?rev=207828&r1=207827&r2=207828&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/strlen-1.ll?rev=207828&r1=207827&r2=207828&view=diff</a><br>


> ==============================================================================<br>
> --- llvm/trunk/test/Transforms/InstCombine/strlen-1.ll (original)<br>
> +++ llvm/trunk/test/Transforms/InstCombine/strlen-1.ll Thu May  1 23:11:45 2014<br>
> @@ -5,6 +5,7 @@<br>
> target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"<br>
><br>
> @hello = constant [6 x i8] c"hello\00"<br>
> +@longer = constant [7 x i8] c"longer\00"<br>
> @null = constant [1 x i8] zeroinitializer<br>
> @null_hello = constant [7 x i8] c"\00hello\00"<br>
> @nullstring = constant i8 0<br>
> @@ -85,6 +86,17 @@ define i1 @test_simplify8() {<br>
> ; CHECK-NEXT: ret i1 false<br>
> }<br>
><br>
> +define i32 @test_simplify9(i1 %x) {<br>
> +; CHECK-LABEL: @test_simplify9<br>
> +  %hello = getelementptr [6 x i8]* @hello, i32 0, i32 0<br>
> +  %longer = getelementptr [7 x i8]* @longer, i32 0, i32 0<br>
> +  %s = select i1 %x, i8* %hello, i8* %longer<br>
> +  %l = call i32 @strlen(i8* %s)<br>
> +; CHECK-NEXT: select i1 %x, i32 5, i32 6<br>
> +  ret i32 %l<br>
> +; CHECK-NEXT: ret<br>
> +}<br>
> +<br>
> ; Check cases that shouldn't be simplified.<br>
><br>
> define i32 @test_no_simplify1() {<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div></div>