<div dir="ltr">Hi Ahmed,<div><br></div><div>Question inline:</div><div><br><div class="gmail_quote">On Tue Jan 27 2015 at 1:58:17 PM 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">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></blockquote><div><br></div><div>This seems... somewhat concerning.</div><div><br></div><div>-eric</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<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: <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>
==============================<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 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 Func);<br>
+  Value *optimizeStrpNCpyChk(CallInst *CI, IRBuilder<> &B, LibFunc::Func Func);<br>
<br>
   /// \brief Checks whether the call \p CI to a fortified libcall is foldable<br>
   /// to the non-fortified version.<br>
<br>
Modified: llvm/trunk/lib/Transforms/<u></u>Utils/SimplifyLibCalls.cpp<br>
URL: <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>
==============================<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 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>
+        // If we were able to further simplify, remove the now redundant 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, IRBuilder<> &B) {<br>
+Value *FortifiedLibCallSimplifier::<u></u>optimizeStrpCpyChk(CallInst *CI,<br>
+                                                      IRBuilder<> &B,<br>
+                                                      LibFunc::Func Func) {<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>
     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, IRBuilder<> &B) {<br>
+Value *FortifiedLibCallSimplifier::<u></u>optimizeStrpNCpyChk(CallInst *CI,<br>
+                                                       IRBuilder<> &B,<br>
+                                                       LibFunc::Func Func) {<br>
   Function *Callee = CI->getCalledFunction();<br>
   StringRef Name = Callee->getName();<br>
-  LibFunc::Func Func =<br>
-      Name.startswith("str") ? LibFunc::strncpy_chk : 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: <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>
==============================<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 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 (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T2* @t2 to i8*), i64 1824, 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 (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T3* @t3 to i8*), i64 1824, 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 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 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: <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>
==============================<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 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 (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T2* @t2 to i8*), i64 1824, 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 (%struct.T1* @t1 to i8*), i8* bitcast (%struct.T3* @t3 to i8*), i64 1824, 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 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 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: <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>
==============================<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 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 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 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 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 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 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: <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>
==============================<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 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x 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 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x 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 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x 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 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 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b, i32 0, 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i1 false)<br>
+; CHECK-NEXT: %1 = call i8* @__memcpy_chk(i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8]* @.str, i32 0, i32 0), i32 12, i32 %len)<br>
+; CHECK-NEXT: ret i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32 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 x i8]* @a, i32 0, i32 0))<br>
+; CHECK-NEXT: %1 = getelementptr inbounds [60 x i8]* @a, i32 0, i32 %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 ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b, 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: <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>
==============================<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 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x 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 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x 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 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x 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 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 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b, i32 0, 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i1 false)<br>
+; CHECK-NEXT: %1 = call i8* @__memcpy_chk(i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8]* @.str, i32 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i1 false)<br>
+; CHECK-NEXT: %ret = call i8* @__strcpy_chk(i8* getelementptr inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @a, 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 ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b, 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: <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>
==============================<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 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x 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 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 inbounds ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x 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 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 ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b, 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 ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8]* @.str, 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 ([60 x i8]* @a, i32 0, i32 0), i8* getelementptr inbounds ([60 x i8]* @b, 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>