<div dir="ltr">*nod* It makes sense. This is OK for 3.6 as well.<div><br></div><div>Thanks!</div><div><br></div><div>-eric<br><br><div class="gmail_quote">On Wed Jan 28 2015 at 9:22:38 AM Ahmed Bougacha <<a href="mailto:ahmed.bougacha@gmail.com">ahmed.bougacha@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Tue, Jan 27, 2015 at 7:19 PM, Eric Christopher <<a href="mailto:echristo@gmail.com" target="_blank">echristo@gmail.com</a>> wrote:<br>
> Hi Ahmed,<br>
><br>
> Question inline:<br>
><br>
> On Tue Jan 27 2015 at 1:58:17 PM Ahmed Bougacha <<a href="mailto:ahmed.bougacha@gmail.com" target="_blank">ahmed.bougacha@gmail.com</a>><br>
> wrote:<br>
>><br>
>> Author: ab<br>
>> Date: Tue Jan 27 15:52:16 2015<br>
>> New Revision: 227250<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=227250&view=rev" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project?rev=227250&view=rev</a><br>
>> Log:<br>
>> [SimplifyLibCalls] Don't confuse strcpy_chk for stpcpy_chk.<br>
>><br>
>> This was introduced in a faulty refactoring (r225640, mea culpa):<br>
>> the tests weren't testing the return values, so, for both<br>
>> __strcpy_chk and __stpcpy_chk, we would return the end of the<br>
>> buffer (matching stpcpy) instead of the beginning (for strcpy).<br>
>><br>
>> The root cause was the prefix "__" being ignored when comparing,<br>
>> which made us always pick LibFunc::stpcpy_chk.<br>
>> Pass the LibFunc::Func directly to avoid this kind of error.<br>
>> Also, make the testcases as explicit as possible to prevent this.<br>
>><br>
>> The now-useful testcases expose another, entangled, stpcpy problem,<br>
>> with the further simplification.  This was introduced in a<br>
>> refactoring (r225640) to match the original behavior.<br>
>><br>
>> However, this leads to problems when successive simplifications<br>
>> generate several similar instructions, none of which are removed<br>
>> by the custom replaceAllUsesWith.<br>
>><br>
>> For instance, InstCombine (the main user) doesn't erase the<br>
>> instruction in its custom RAUW.  When trying to simplify say<br>
>> __stpcpy_chk:<br>
>> - first, an stpcpy is created (fortified simplifier),<br>
>> - second, a memcpy is created (normal simplifier), but the<br>
>>   stpcpy call isn't removed.<br>
>> - third, InstCombine later revisits the instructions,<br>
>>   and simplifies the first stpcpy to a memcpy.  We now have<br>
>>   two memcpys.<br>
>><br>
><br>
> This seems... somewhat concerning.<br>
<br>
Indeed, but in case that wasn't clear, it's fixed by this commit.<br>
<br>
Ideally, we wouldn't need to delete the intermediate instruction:<br>
the main problem I can think of is that some of those simplifications<br>
return several instructions (the libcall, + a GEP for the return value).<br>
<br>
Here, this isn't a problem, because the GEP wouldn't trigger further<br>
simplification.<br>
<br>
This part is still on my todo list though, so I'll try to merge both<br>
simplifiers together at the next round.<br>
<br>
-Ahmed<br>
<br>
> -eric<br>
><br>
>><br>
>><br>
>> Modified:<br>
>>     llvm/trunk/include/llvm/<u></u>Transforms/Utils/<u></u>SimplifyLibCalls.h<br>
>>     llvm/trunk/lib/Transforms/<u></u>Utils/SimplifyLibCalls.cpp<br>
>>     llvm/trunk/test/Transforms/<u></u>InstCombine/memcpy_chk-1.ll<br>
>>     llvm/trunk/test/Transforms/<u></u>InstCombine/memmove_chk-1.ll<br>
>>     llvm/trunk/test/Transforms/<u></u>InstCombine/memset_chk-1.ll<br>
>>     llvm/trunk/test/Transforms/<u></u>InstCombine/stpcpy_chk-1.ll<br>
>>     llvm/trunk/test/Transforms/<u></u>InstCombine/strcpy_chk-1.ll<br>
>>     llvm/trunk/test/Transforms/<u></u>InstCombine/strncpy_chk-1.ll<br>
>><br>
>> Modified: llvm/trunk/include/llvm/<u></u>Transforms/Utils/<u></u>SimplifyLibCalls.h<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Utils/SimplifyLibCalls.h?rev=227250&r1=227249&r2=227250&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/include/<u></u>llvm/Transforms/Utils/<u></u>SimplifyLibCalls.h?rev=227250&<u></u>r1=227249&r2=227250&view=diff</a><br>
>><br>
>> ==============================<u></u>==============================<u></u>==================<br>
>> --- llvm/trunk/include/llvm/<u></u>Transforms/Utils/<u></u>SimplifyLibCalls.h (original)<br>
>> +++ llvm/trunk/include/llvm/<u></u>Transforms/Utils/<u></u>SimplifyLibCalls.h Tue Jan 27<br>
>> 15:52:16 2015<br>
>> @@ -16,6 +16,7 @@<br>
>>  #define LLVM_TRANSFORMS_UTILS_<u></u>SIMPLIFYLIBCALLS_H<br>
>><br>
>>  #include "llvm/ADT/StringRef.h"<br>
>> +#include "llvm/Analysis/<u></u>TargetLibraryInfo.h"<br>
>>  #include "llvm/IR/IRBuilder.h"<br>
>><br>
>>  namespace llvm {<br>
>> @@ -53,8 +54,10 @@ private:<br>
>>    Value *optimizeMemCpyChk(CallInst *CI, IRBuilder<> &B);<br>
>>    Value *optimizeMemMoveChk(CallInst *CI, IRBuilder<> &B);<br>
>>    Value *optimizeMemSetChk(CallInst *CI, IRBuilder<> &B);<br>
>> -  Value *optimizeStrCpyChk(CallInst *CI, IRBuilder<> &B);<br>
>> -  Value *optimizeStrNCpyChk(CallInst *CI, IRBuilder<> &B);<br>
>> +<br>
>> +  // Str/Stp cpy are similar enough to be handled in the same functions.<br>
>> +  Value *optimizeStrpCpyChk(CallInst *CI, IRBuilder<> &B, LibFunc::Func<br>
>> Func);<br>
>> +  Value *optimizeStrpNCpyChk(CallInst *CI, IRBuilder<> &B, LibFunc::Func<br>
>> Func);<br>
>><br>
>>    /// \brief Checks whether the call \p CI to a fortified libcall is<br>
>> foldable<br>
>>    /// to the non-fortified version.<br>
>><br>
>> Modified: llvm/trunk/lib/Transforms/<u></u>Utils/SimplifyLibCalls.cpp<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp?rev=227250&r1=227249&r2=227250&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/lib/<u></u>Transforms/Utils/<u></u>SimplifyLibCalls.cpp?rev=<u></u>227250&r1=227249&r2=227250&<u></u>view=diff</a><br>
>><br>
>> ==============================<u></u>==============================<u></u>==================<br>
>> --- llvm/trunk/lib/Transforms/<u></u>Utils/SimplifyLibCalls.cpp (original)<br>
>> +++ llvm/trunk/lib/Transforms/<u></u>Utils/SimplifyLibCalls.cpp Tue Jan 27<br>
>> 15:52:16 2015<br>
>> @@ -1968,8 +1968,12 @@ Value *LibCallSimplifier::<u></u>optimizeCall(C<br>
>>      // Try to further simplify the result.<br>
>>      CallInst *SimplifiedCI = dyn_cast<CallInst>(<u></u>SimplifiedFortifiedCI);<br>
>>      if (SimplifiedCI && SimplifiedCI-><u></u>getCalledFunction())<br>
>> -      if (Value *V = optimizeStringMemoryLibCall(<u></u>SimplifiedCI, Builder))<br>
>> +      if (Value *V = optimizeStringMemoryLibCall(<u></u>SimplifiedCI, Builder))<br>
>> {<br>
>> +        // If we were able to further simplify, remove the now redundant<br>
>> call.<br>
>> +        SimplifiedCI-><u></u>replaceAllUsesWith(V);<br>
>> +        SimplifiedCI->eraseFromParent(<u></u>);<br>
>>          return V;<br>
>> +      }<br>
>>      return SimplifiedFortifiedCI;<br>
>>    }<br>
>><br>
>> @@ -2222,11 +2226,11 @@ Value *FortifiedLibCallSimplifier::<u></u>optim<br>
>>    return nullptr;<br>
>>  }<br>
>><br>
>> -Value *FortifiedLibCallSimplifier::<u></u>optimizeStrCpyChk(CallInst *CI,<br>
>> IRBuilder<> &B) {<br>
>> +Value *FortifiedLibCallSimplifier::<u></u>optimizeStrpCpyChk(CallInst *CI,<br>
>> +                                                      IRBuilder<> &B,<br>
>> +                                                      LibFunc::Func Func)<br>
>> {<br>
>>    Function *Callee = CI->getCalledFunction();<br>
>>    StringRef Name = Callee->getName();<br>
>> -  LibFunc::Func Func =<br>
>> -      Name.startswith("str") ? LibFunc::strcpy_chk : LibFunc::stpcpy_chk;<br>
>><br>
>>    if (!<u></u>checkStringCopyLibFuncSignatur<u></u>e(Callee, Func, DL))<br>
>>      return nullptr;<br>
>> @@ -2235,7 +2239,7 @@ Value *FortifiedLibCallSimplifier::<u></u>optim<br>
>>          *ObjSize = CI->getArgOperand(2);<br>
>><br>
>>    // __stpcpy_chk(x,x,...)  -> x+strlen(x)<br>
>> -  if (!OnlyLowerUnknownSize && Dst == Src) {<br>
>> +  if (Func == LibFunc::stpcpy_chk && !OnlyLowerUnknownSize && Dst == Src)<br>
>> {<br>
>>      Value *StrLen = EmitStrLen(Src, B, DL, TLI);<br>
>>      return StrLen ? B.CreateInBoundsGEP(Dst, StrLen) : nullptr;<br>
>>    }<br>
>> @@ -2270,11 +2274,11 @@ Value *FortifiedLibCallSimplifier::<u></u>optim<br>
>>    return nullptr;<br>
>>  }<br>
>><br>
>> -Value *FortifiedLibCallSimplifier::<u></u>optimizeStrNCpyChk(CallInst *CI,<br>
>> IRBuilder<> &B) {<br>
>> +Value *FortifiedLibCallSimplifier::<u></u>optimizeStrpNCpyChk(CallInst *CI,<br>
>> +                                                       IRBuilder<> &B,<br>
>> +                                                       LibFunc::Func<br>
>> Func) {<br>
>>    Function *Callee = CI->getCalledFunction();<br>
>>    StringRef Name = Callee->getName();<br>
>> -  LibFunc::Func Func =<br>
>> -      Name.startswith("str") ? LibFunc::strncpy_chk :<br>
>> LibFunc::stpncpy_chk;<br>
>><br>
>>    if (!<u></u>checkStringCopyLibFuncSignatur<u></u>e(Callee, Func, DL))<br>
>>      return nullptr;<br>
>> @@ -2314,10 +2318,10 @@ Value *FortifiedLibCallSimplifier::<u></u>optim<br>
>>      return optimizeMemSetChk(CI, Builder);<br>
>>    case LibFunc::stpcpy_chk:<br>
>>    case LibFunc::strcpy_chk:<br>
>> -    return optimizeStrCpyChk(CI, Builder);<br>
>> +    return optimizeStrpCpyChk(CI, Builder, Func);<br>
>>    case LibFunc::stpncpy_chk:<br>
>>    case LibFunc::strncpy_chk:<br>
>> -    return optimizeStrNCpyChk(CI, Builder);<br>
>> +    return optimizeStrpNCpyChk(CI, Builder, Func);<br>
>>    default:<br>
>>      break;<br>
>>    }<br>
>><br>
>> Modified: llvm/trunk/test/Transforms/<u></u>InstCombine/memcpy_chk-1.ll<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/memcpy_chk-1.ll?rev=227250&r1=227249&r2=227250&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/<u></u>Transforms/InstCombine/memcpy_<u></u>chk-1.ll?rev=227250&r1=227249&<u></u>r2=227250&view=diff</a><br>
>><br>
>> ==============================<u></u>==============================<u></u>==================<br>
>> --- llvm/trunk/test/Transforms/<u></u>InstCombine/memcpy_chk-1.ll (original)<br>
>> +++ llvm/trunk/test/Transforms/<u></u>InstCombine/memcpy_chk-1.ll Tue Jan 27<br>
>> 15:52:16 2015<br>
>> @@ -15,46 +15,50 @@ target datalayout = "e-p:64:64:64-i1:8:8<br>
>><br>
>>  ; Check cases where dstlen >= len.<br>
>><br>
>> -define void @test_simplify1() {<br>
>> +define i8* @test_simplify1() {<br>
>>  ; CHECK-LABEL: @test_simplify1(<br>
>>    %dst = bitcast %struct.T1* @t1 to i8*<br>
>>    %src = bitcast %struct.T2* @t2 to i8*<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64<br>
>> -  call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1824, i64 1824)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast<br>
>> (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T2* @t2 to i8*), i64 1824,<br>
>> i32 4, i1 false)<br>
>> +; CHECK-NEXT: ret i8* bitcast (%struct.T1* @t1 to i8*)<br>
>> +  %ret = call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1824, i64 1824)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_simplify2() {<br>
>> +define i8* @test_simplify2() {<br>
>>  ; CHECK-LABEL: @test_simplify2(<br>
>>    %dst = bitcast %struct.T1* @t1 to i8*<br>
>>    %src = bitcast %struct.T3* @t3 to i8*<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64<br>
>> -  call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1824, i64 2848)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* bitcast<br>
>> (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T3* @t3 to i8*), i64 1824,<br>
>> i32 4, i1 false)<br>
>> +; CHECK-NEXT: ret i8* bitcast (%struct.T1* @t1 to i8*)<br>
>> +  %ret = call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1824, i64 2848)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  ; Check cases where dstlen < len.<br>
>><br>
>> -define void @test_no_simplify1() {<br>
>> +define i8* @test_no_simplify1() {<br>
>>  ; CHECK-LABEL: @test_no_simplify1(<br>
>>    %dst = bitcast %struct.T3* @t3 to i8*<br>
>>    %src = bitcast %struct.T1* @t1 to i8*<br>
>><br>
>> -; CHECK-NEXT: call i8* @__memcpy_chk<br>
>> -  call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 2848, i64 1824)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %ret = call i8* @__memcpy_chk(i8* bitcast (%struct.T3* @t3<br>
>> to i8*), i8* bitcast (%struct.T1* @t1 to i8*), i64 2848, i64 1824)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>> +  %ret = call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 2848, i64 1824)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_no_simplify2() {<br>
>> +define i8* @test_no_simplify2() {<br>
>>  ; CHECK-LABEL: @test_no_simplify2(<br>
>>    %dst = bitcast %struct.T1* @t1 to i8*<br>
>>    %src = bitcast %struct.T2* @t2 to i8*<br>
>><br>
>> -; CHECK-NEXT: call i8* @__memcpy_chk<br>
>> -  call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1024, i64 0)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %ret = call i8* @__memcpy_chk(i8* bitcast (%struct.T1* @t1<br>
>> to i8*), i8* bitcast (%struct.T2* @t2 to i8*), i64 1024, i64 0)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>> +  %ret = call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1024, i64 0)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  define i8* @test_simplify_return_indcall(<u></u>i8* ()* %alloc) {<br>
>><br>
>> Modified: llvm/trunk/test/Transforms/<u></u>InstCombine/memmove_chk-1.ll<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/memmove_chk-1.ll?rev=227250&r1=227249&r2=227250&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/<u></u>Transforms/InstCombine/<u></u>memmove_chk-1.ll?rev=227250&<u></u>r1=227249&r2=227250&view=diff</a><br>
>><br>
>> ==============================<u></u>==============================<u></u>==================<br>
>> --- llvm/trunk/test/Transforms/<u></u>InstCombine/memmove_chk-1.ll (original)<br>
>> +++ llvm/trunk/test/Transforms/<u></u>InstCombine/memmove_chk-1.ll Tue Jan 27<br>
>> 15:52:16 2015<br>
>> @@ -15,46 +15,50 @@ target datalayout = "e-p:64:64:64-i1:8:8<br>
>><br>
>>  ; Check cases where dstlen >= len.<br>
>><br>
>> -define void @test_simplify1() {<br>
>> +define i8* @test_simplify1() {<br>
>>  ; CHECK-LABEL: @test_simplify1(<br>
>>    %dst = bitcast %struct.T1* @t1 to i8*<br>
>>    %src = bitcast %struct.T2* @t2 to i8*<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memmove.p0i8.p0i8.i64<br>
>> -  call i8* @__memmove_chk(i8* %dst, i8* %src, i64 1824, i64 1824)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memmove.p0i8.p0i8.i64(<u></u>i8* bitcast<br>
>> (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T2* @t2 to i8*), i64 1824,<br>
>> i32 4, i1 false)<br>
>> +; CHECK-NEXT: ret i8* bitcast (%struct.T1* @t1 to i8*)<br>
>> +  %ret = call i8* @__memmove_chk(i8* %dst, i8* %src, i64 1824, i64 1824)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_simplify2() {<br>
>> +define i8* @test_simplify2() {<br>
>>  ; CHECK-LABEL: @test_simplify2(<br>
>>    %dst = bitcast %struct.T1* @t1 to i8*<br>
>>    %src = bitcast %struct.T3* @t3 to i8*<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memmove.p0i8.p0i8.i64<br>
>> -  call i8* @__memmove_chk(i8* %dst, i8* %src, i64 1824, i64 2848)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memmove.p0i8.p0i8.i64(<u></u>i8* bitcast<br>
>> (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T3* @t3 to i8*), i64 1824,<br>
>> i32 4, i1 false)<br>
>> +; CHECK-NEXT: ret i8* bitcast (%struct.T1* @t1 to i8*)<br>
>> +  %ret = call i8* @__memmove_chk(i8* %dst, i8* %src, i64 1824, i64 2848)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  ; Check cases where dstlen < len.<br>
>><br>
>> -define void @test_no_simplify1() {<br>
>> +define i8* @test_no_simplify1() {<br>
>>  ; CHECK-LABEL: @test_no_simplify1(<br>
>>    %dst = bitcast %struct.T3* @t3 to i8*<br>
>>    %src = bitcast %struct.T1* @t1 to i8*<br>
>><br>
>> -; CHECK-NEXT: call i8* @__memmove_chk<br>
>> -  call i8* @__memmove_chk(i8* %dst, i8* %src, i64 2848, i64 1824)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %ret = call i8* @__memmove_chk(i8* bitcast (%struct.T3* @t3<br>
>> to i8*), i8* bitcast (%struct.T1* @t1 to i8*), i64 2848, i64 1824)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>> +  %ret = call i8* @__memmove_chk(i8* %dst, i8* %src, i64 2848, i64 1824)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_no_simplify2() {<br>
>> +define i8* @test_no_simplify2() {<br>
>>  ; CHECK-LABEL: @test_no_simplify2(<br>
>>    %dst = bitcast %struct.T1* @t1 to i8*<br>
>>    %src = bitcast %struct.T2* @t2 to i8*<br>
>><br>
>> -; CHECK-NEXT: call i8* @__memmove_chk<br>
>> -  call i8* @__memmove_chk(i8* %dst, i8* %src, i64 1024, i64 0)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %ret = call i8* @__memmove_chk(i8* bitcast (%struct.T1* @t1<br>
>> to i8*), i8* bitcast (%struct.T2* @t2 to i8*), i64 1024, i64 0)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>> +  %ret = call i8* @__memmove_chk(i8* %dst, i8* %src, i64 1024, i64 0)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  declare i8* @__memmove_chk(i8*, i8*, i64, i64)<br>
>><br>
>> Modified: llvm/trunk/test/Transforms/<u></u>InstCombine/memset_chk-1.ll<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/memset_chk-1.ll?rev=227250&r1=227249&r2=227250&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/<u></u>Transforms/InstCombine/memset_<u></u>chk-1.ll?rev=227250&r1=227249&<u></u>r2=227250&view=diff</a><br>
>><br>
>> ==============================<u></u>==============================<u></u>==================<br>
>> --- llvm/trunk/test/Transforms/<u></u>InstCombine/memset_chk-1.ll (original)<br>
>> +++ llvm/trunk/test/Transforms/<u></u>InstCombine/memset_chk-1.ll Tue Jan 27<br>
>> 15:52:16 2015<br>
>> @@ -11,51 +11,56 @@ target datalayout = "e-p:64:64:64-i1:8:8<br>
>><br>
>>  ; Check cases where dstlen >= len.<br>
>><br>
>> -define void @test_simplify1() {<br>
>> +define i8* @test_simplify1() {<br>
>>  ; CHECK-LABEL: @test_simplify1(<br>
>>    %dst = bitcast %struct.T* @t to i8*<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memset.p0i8.i64<br>
>> -  call i8* @__memset_chk(i8* %dst, i32 0, i64 1824, i64 1824)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* bitcast (%struct.T* @t<br>
>> to i8*), i8 0, i64 1824, i32 4, i1 false)<br>
>> +; CHECK-NEXT: ret i8* bitcast (%struct.T* @t to i8*)<br>
>> +  %ret = call i8* @__memset_chk(i8* %dst, i32 0, i64 1824, i64 1824)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_simplify2() {<br>
>> +define i8* @test_simplify2() {<br>
>>  ; CHECK-LABEL: @test_simplify2(<br>
>>    %dst = bitcast %struct.T* @t to i8*<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memset.p0i8.i64<br>
>> -  call i8* @__memset_chk(i8* %dst, i32 0, i64 1824, i64 3648)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* bitcast (%struct.T* @t<br>
>> to i8*), i8 0, i64 1824, i32 4, i1 false)<br>
>> +; CHECK-NEXT: ret i8* bitcast (%struct.T* @t to i8*)<br>
>> +  %ret = call i8* @__memset_chk(i8* %dst, i32 0, i64 1824, i64 3648)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_simplify3() {<br>
>> +define i8* @test_simplify3() {<br>
>>  ; CHECK-LABEL: @test_simplify3(<br>
>>    %dst = bitcast %struct.T* @t to i8*<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memset.p0i8.i64<br>
>> -  call i8* @__memset_chk(i8* %dst, i32 0, i64 1824, i64 -1)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memset.p0i8.i64(i8* bitcast (%struct.T* @t<br>
>> to i8*), i8 0, i64 1824, i32 4, i1 false)<br>
>> +; CHECK-NEXT: ret i8* bitcast (%struct.T* @t to i8*)<br>
>> +  %ret = call i8* @__memset_chk(i8* %dst, i32 0, i64 1824, i64 -1)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  ; Check cases where dstlen < len.<br>
>><br>
>> -define void @test_no_simplify1() {<br>
>> +define i8* @test_no_simplify1() {<br>
>>  ; CHECK-LABEL: @test_no_simplify1(<br>
>>    %dst = bitcast %struct.T* @t to i8*<br>
>><br>
>> -; CHECK-NEXT: call i8* @__memset_chk<br>
>> -  call i8* @__memset_chk(i8* %dst, i32 0, i64 1824, i64 400)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %ret = call i8* @__memset_chk(i8* bitcast (%struct.T* @t to<br>
>> i8*), i32 0, i64 1824, i64 400)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>> +  %ret = call i8* @__memset_chk(i8* %dst, i32 0, i64 1824, i64 400)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_no_simplify2() {<br>
>> +define i8* @test_no_simplify2() {<br>
>>  ; CHECK-LABEL: @test_no_simplify2(<br>
>>    %dst = bitcast %struct.T* @t to i8*<br>
>><br>
>> -; CHECK-NEXT: call i8* @__memset_chk<br>
>> -  call i8* @__memset_chk(i8* %dst, i32 0, i64 1824, i64 0)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %ret = call i8* @__memset_chk(i8* bitcast (%struct.T* @t to<br>
>> i8*), i32 0, i64 1824, i64 0)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>> +  %ret = call i8* @__memset_chk(i8* %dst, i32 0, i64 1824, i64 0)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  declare i8* @__memset_chk(i8*, i32, i64, i64)<br>
>><br>
>> Modified: llvm/trunk/test/Transforms/<u></u>InstCombine/stpcpy_chk-1.ll<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/stpcpy_chk-1.ll?rev=227250&r1=227249&r2=227250&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/<u></u>Transforms/InstCombine/stpcpy_<u></u>chk-1.ll?rev=227250&r1=227249&<u></u>r2=227250&view=diff</a><br>
>><br>
>> ==============================<u></u>==============================<u></u>==================<br>
>> --- llvm/trunk/test/Transforms/<u></u>InstCombine/stpcpy_chk-1.ll (original)<br>
>> +++ llvm/trunk/test/Transforms/<u></u>InstCombine/stpcpy_chk-1.ll Tue Jan 27<br>
>> 15:52:16 2015<br>
>> @@ -11,46 +11,50 @@ target datalayout = "e-p:32:32:32-i1:8:8<br>
>><br>
>>  ; Check cases where slen >= strlen (src).<br>
>><br>
>> -define void @test_simplify1() {<br>
>> +define i8* @test_simplify1() {<br>
>>  ; CHECK-LABEL: @test_simplify1(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32<br>
>> -  call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 60)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x<br>
>> i8]* @.str, i32 0, i32 0), i32 12, i32 1, i1 false)<br>
>> +; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32<br>
>> 11)<br>
>> +  %ret = call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 60)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_simplify2() {<br>
>> +define i8* @test_simplify2() {<br>
>>  ; CHECK-LABEL: @test_simplify2(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32<br>
>> -  call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 12)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x<br>
>> i8]* @.str, i32 0, i32 0), i32 12, i32 1, i1 false)<br>
>> +; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32<br>
>> 11)<br>
>> +  %ret = call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 12)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_simplify3() {<br>
>> +define i8* @test_simplify3() {<br>
>>  ; CHECK-LABEL: @test_simplify3(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32<br>
>> -  call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 -1)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x<br>
>> i8]* @.str, i32 0, i32 0), i32 12, i32 1, i1 false)<br>
>> +; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32<br>
>> 11)<br>
>> +  %ret = call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 -1)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  ; Check cases where there are no string constants.<br>
>><br>
>> -define void @test_simplify4() {<br>
>> +define i8* @test_simplify4() {<br>
>>  ; CHECK-LABEL: @test_simplify4(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [60 x i8]* @b, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call i8* @stpcpy<br>
>> -  call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 -1)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %stpcpy = call i8* @stpcpy(i8* getelementptr inbounds ([60<br>
>> x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b, i32 0,<br>
>> i32 0))<br>
>> +; CHECK-NEXT: ret i8* %stpcpy<br>
>> +  %ret = call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 -1)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  ; Check case where the string length is not constant.<br>
>> @@ -60,10 +64,11 @@ define i8* @test_simplify5() {<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK: @__memcpy_chk<br>
>> +; CHECK-NEXT: %len = call i32 @llvm.objectsize.i32.p0i8(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i1 false)<br>
>> +; CHECK-NEXT: %1 = call i8* @__memcpy_chk(i8* getelementptr inbounds ([60<br>
>> x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8]* @.str, i32<br>
>> 0, i32 0), i32 12, i32 %len)<br>
>> +; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32<br>
>> 11)<br>
>>    %len = call i32 @llvm.objectsize.i32.p0i8(i8* %dst, i1 false)<br>
>>    %ret = call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 %len)<br>
>> -; CHECK: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32 11)<br>
>>    ret i8* %ret<br>
>>  }<br>
>><br>
>> @@ -73,8 +78,9 @@ define i8* @test_simplify6() {<br>
>>  ; CHECK-LABEL: @test_simplify6(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>><br>
>> -; CHECK: [[LEN:%[a-z]+]] = call i32 @strlen<br>
>> -; CHECK-NEXT: getelementptr inbounds [60 x i8]* @a, i32 0, i32 [[LEN]]<br>
>> +; CHECK-NEXT: %strlen = call i32 @strlen(i8* getelementptr inbounds ([60<br>
>> x i8]* @a, i32 0, i32 0))<br>
>> +; CHECK-NEXT: %1 = getelementptr inbounds [60 x i8]* @a, i32 0, i32<br>
>> %strlen<br>
>> +; CHECK-NEXT: ret i8* %1<br>
>>    %len = call i32 @llvm.objectsize.i32.p0i8(i8* %dst, i1 false)<br>
>>    %ret = call i8* @__stpcpy_chk(i8* %dst, i8* %dst, i32 %len)<br>
>>    ret i8* %ret<br>
>> @@ -82,14 +88,15 @@ define i8* @test_simplify6() {<br>
>><br>
>>  ; Check case where slen < strlen (src).<br>
>><br>
>> -define void @test_no_simplify1() {<br>
>> +define i8* @test_no_simplify1() {<br>
>>  ; CHECK-LABEL: @test_no_simplify1(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [60 x i8]* @b, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call i8* @__stpcpy_chk<br>
>> -  call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 8)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %ret = call i8* @__stpcpy_chk(i8* getelementptr inbounds<br>
>> ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b,<br>
>> i32 0, i32 0), i32 8)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>> +  %ret = call i8* @__stpcpy_chk(i8* %dst, i8* %src, i32 8)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  declare i8* @__stpcpy_chk(i8*, i8*, i32) nounwind<br>
>><br>
>> Modified: llvm/trunk/test/Transforms/<u></u>InstCombine/strcpy_chk-1.ll<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/strcpy_chk-1.ll?rev=227250&r1=227249&r2=227250&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/<u></u>Transforms/InstCombine/strcpy_<u></u>chk-1.ll?rev=227250&r1=227249&<u></u>r2=227250&view=diff</a><br>
>><br>
>> ==============================<u></u>==============================<u></u>==================<br>
>> --- llvm/trunk/test/Transforms/<u></u>InstCombine/strcpy_chk-1.ll (original)<br>
>> +++ llvm/trunk/test/Transforms/<u></u>InstCombine/strcpy_chk-1.ll Tue Jan 27<br>
>> 15:52:16 2015<br>
>> @@ -11,59 +11,65 @@ target datalayout = "e-p:32:32:32-i1:8:8<br>
>><br>
>>  ; Check cases where slen >= strlen (src).<br>
>><br>
>> -define void @test_simplify1() {<br>
>> +define i8* @test_simplify1() {<br>
>>  ; CHECK-LABEL: @test_simplify1(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32<br>
>> -  call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 60)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x<br>
>> i8]* @.str, i32 0, i32 0), i32 12, i32 1, i1 false)<br>
>> +; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32<br>
>> 0)<br>
>> +  %ret = call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 60)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_simplify2() {<br>
>> +define i8* @test_simplify2() {<br>
>>  ; CHECK-LABEL: @test_simplify2(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32<br>
>> -  call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 12)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x<br>
>> i8]* @.str, i32 0, i32 0), i32 12, i32 1, i1 false)<br>
>> +; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32<br>
>> 0)<br>
>> +  %ret = call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 12)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_simplify3() {<br>
>> +define i8* @test_simplify3() {<br>
>>  ; CHECK-LABEL: @test_simplify3(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32<br>
>> -  call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 -1)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x<br>
>> i8]* @.str, i32 0, i32 0), i32 12, i32 1, i1 false)<br>
>> +; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32<br>
>> 0)<br>
>> +  %ret = call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 -1)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  ; Check cases where there are no string constants.<br>
>><br>
>> -define void @test_simplify4() {<br>
>> +define i8* @test_simplify4() {<br>
>>  ; CHECK-LABEL: @test_simplify4(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [60 x i8]* @b, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call i8* @strcpy<br>
>> -  call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 -1)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %strcpy = call i8* @strcpy(i8* getelementptr inbounds ([60<br>
>> x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b, i32 0,<br>
>> i32 0))<br>
>> +; CHECK-NEXT: ret i8* %strcpy<br>
>> +  %ret = call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 -1)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  ; Check case where the string length is not constant.<br>
>><br>
>> -define void @test_simplify5() {<br>
>> +define i8* @test_simplify5() {<br>
>>  ; CHECK-LABEL: @test_simplify5(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK: @__memcpy_chk<br>
>> +; CHECK-NEXT: %len = call i32 @llvm.objectsize.i32.p0i8(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i1 false)<br>
>> +; CHECK-NEXT: %1 = call i8* @__memcpy_chk(i8* getelementptr inbounds ([60<br>
>> x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8]* @.str, i32<br>
>> 0, i32 0), i32 12, i32 %len)<br>
>> +; CHECK-NEXT: ret i8* %1<br>
>>    %len = call i32 @llvm.objectsize.i32.p0i8(i8* %dst, i1 false)<br>
>> -  call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 %len)<br>
>> -  ret void<br>
>> +  %ret = call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 %len)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  ; Check case where the source and destination are the same.<br>
>> @@ -72,7 +78,9 @@ define i8* @test_simplify6() {<br>
>>  ; CHECK-LABEL: @test_simplify6(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>><br>
>> -; CHECK: getelementptr inbounds ([60 x i8]* @a, i32 0, i32 0)<br>
>> +; CHECK-NEXT: %len = call i32 @llvm.objectsize.i32.p0i8(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i1 false)<br>
>> +; CHECK-NEXT: %ret = call i8* @__strcpy_chk(i8* getelementptr inbounds<br>
>> ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @a,<br>
>> i32 0, i32 0), i32 %len)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>>    %len = call i32 @llvm.objectsize.i32.p0i8(i8* %dst, i1 false)<br>
>>    %ret = call i8* @__strcpy_chk(i8* %dst, i8* %dst, i32 %len)<br>
>>    ret i8* %ret<br>
>> @@ -80,14 +88,15 @@ define i8* @test_simplify6() {<br>
>><br>
>>  ; Check case where slen < strlen (src).<br>
>><br>
>> -define void @test_no_simplify1() {<br>
>> +define i8* @test_no_simplify1() {<br>
>>  ; CHECK-LABEL: @test_no_simplify1(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [60 x i8]* @b, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call i8* @__strcpy_chk<br>
>> -  call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 8)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %ret = call i8* @__strcpy_chk(i8* getelementptr inbounds<br>
>> ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b,<br>
>> i32 0, i32 0), i32 8)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>> +  %ret = call i8* @__strcpy_chk(i8* %dst, i8* %src, i32 8)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  declare i8* @__strcpy_chk(i8*, i8*, i32) nounwind<br>
>><br>
>> Modified: llvm/trunk/test/Transforms/<u></u>InstCombine/strncpy_chk-1.ll<br>
>> URL:<br>
>> <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/strncpy_chk-1.ll?rev=227250&r1=227249&r2=227250&view=diff" target="_blank">http://llvm.org/viewvc/llvm-<u></u>project/llvm/trunk/test/<u></u>Transforms/InstCombine/<u></u>strncpy_chk-1.ll?rev=227250&<u></u>r1=227249&r2=227250&view=diff</a><br>
>><br>
>> ==============================<u></u>==============================<u></u>==================<br>
>> --- llvm/trunk/test/Transforms/<u></u>InstCombine/strncpy_chk-1.ll (original)<br>
>> +++ llvm/trunk/test/Transforms/<u></u>InstCombine/strncpy_chk-1.ll Tue Jan 27<br>
>> 15:52:16 2015<br>
>> @@ -11,56 +11,61 @@ target datalayout = "e-p:32:32:32-i1:8:8<br>
>><br>
>>  ; Check cases where dstlen >= len<br>
>><br>
>> -define void @test_simplify1() {<br>
>> +define i8* @test_simplify1() {<br>
>>  ; CHECK-LABEL: @test_simplify1(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32<br>
>> -  call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 12, i32 60)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x<br>
>> i8]* @.str, i32 0, i32 0), i32 12, i32 1, i1 false)<br>
>> +; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32<br>
>> 0)<br>
>> +  %ret = call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 12, i32 60)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_simplify2() {<br>
>> +define i8* @test_simplify2() {<br>
>>  ; CHECK-LABEL: @test_simplify2(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32<br>
>> -  call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 12, i32 12)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr<br>
>> inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x<br>
>> i8]* @.str, i32 0, i32 0), i32 12, i32 1, i1 false)<br>
>> +; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32<br>
>> 0)<br>
>> +  %ret = call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 12, i32 12)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_simplify3() {<br>
>> +define i8* @test_simplify3() {<br>
>>  ; CHECK-LABEL: @test_simplify3(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [60 x i8]* @b, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call i8* @strncpy<br>
>> -  call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 12, i32 60)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %strncpy = call i8* @strncpy(i8* getelementptr inbounds<br>
>> ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b,<br>
>> i32 0, i32 0), i32 12)<br>
>> +; CHECK-NEXT: ret i8* %strncpy<br>
>> +  %ret = call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 12, i32 60)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  ; Check cases where dstlen < len<br>
>><br>
>> -define void @test_no_simplify1() {<br>
>> +define i8* @test_no_simplify1() {<br>
>>  ; CHECK-LABEL: @test_no_simplify1(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [12 x i8]* @.str, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call i8* @__strncpy_chk<br>
>> -  call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 8, i32 4)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %ret = call i8* @__strncpy_chk(i8* getelementptr inbounds<br>
>> ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8]* @.str,<br>
>> i32 0, i32 0), i32 8, i32 4)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>> +  %ret = call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 8, i32 4)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>> -define void @test_no_simplify2() {<br>
>> +define i8* @test_no_simplify2() {<br>
>>  ; CHECK-LABEL: @test_no_simplify2(<br>
>>    %dst = getelementptr inbounds [60 x i8]* @a, i32 0, i32 0<br>
>>    %src = getelementptr inbounds [60 x i8]* @b, i32 0, i32 0<br>
>><br>
>> -; CHECK-NEXT: call i8* @__strncpy_chk<br>
>> -  call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 8, i32 0)<br>
>> -  ret void<br>
>> +; CHECK-NEXT: %ret = call i8* @__strncpy_chk(i8* getelementptr inbounds<br>
>> ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b,<br>
>> i32 0, i32 0), i32 8, i32 0)<br>
>> +; CHECK-NEXT: ret i8* %ret<br>
>> +  %ret = call i8* @__strncpy_chk(i8* %dst, i8* %src, i32 8, i32 0)<br>
>> +  ret i8* %ret<br>
>>  }<br>
>><br>
>>  declare i8* @__strncpy_chk(i8*, i8*, i32, i32)<br>
>><br>
>><br>
>> ______________________________<u></u>_________________<br>
>> llvm-commits mailing list<br>
>> <a href="mailto:llvm-commits@cs.uiuc.edu" target="_blank">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/<u></u>mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div>