[SimplifyLibCalls] Don't try to simplify indirect calls.
authorAhmed Bougacha <ahmed.bougacha@gmail.com>
Wed, 14 Jan 2015 00:55:05 +0000 (00:55 +0000)
committerAhmed Bougacha <ahmed.bougacha@gmail.com>
Wed, 14 Jan 2015 00:55:05 +0000 (00:55 +0000)
It turns out, all callsites of the simplifier are guarded by a check for
CallInst::getCalledFunction (i.e., to make sure the callee is direct).

This check wasn't done when trying to further optimize a simplified fortified
libcall, introduced by a refactoring in r225640.

Fix that, add a testcase, and document the requirement.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225895 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/Utils/SimplifyLibCalls.h
lib/Transforms/Utils/SimplifyLibCalls.cpp
test/Transforms/InstCombine/memcpy_chk-1.ll

index 2abf2d1e16aa7075d0f4f4572fd8a945d410fd6e..d2f096fd1efd4773274cf48904ab73d238004684 100644 (file)
@@ -46,6 +46,7 @@ public:
   /// \brief Take the given call instruction and return a more
   /// optimal value to replace the instruction with or 0 if a more
   /// optimal form can't be found.
+  /// The call must not be an indirect call.
   Value *optimizeCall(CallInst *CI);
 
 private:
@@ -83,6 +84,7 @@ public:
   /// be equal to the instruction being optimized.  In this case all
   /// other instructions that use the given instruction were modified
   /// and the given instruction is dead.
+  /// The call must not be an indirect call.
   Value *optimizeCall(CallInst *CI);
 
   /// replaceAllUsesWith - This method is used when the library call
index fac8bb21e7f84abcd3fd7c8b86d3dfb146095054..5b4647ddcb5e81fb3e40ecbfa06251fd8bf11670 100644 (file)
@@ -1966,7 +1966,8 @@ Value *LibCallSimplifier::optimizeCall(CallInst *CI) {
   // Also try to simplify calls to fortified library functions.
   if (Value *SimplifiedFortifiedCI = FortifiedSimplifier.optimizeCall(CI)) {
     // Try to further simplify the result.
-    if (CallInst *SimplifiedCI = dyn_cast<CallInst>(SimplifiedFortifiedCI))
+    CallInst *SimplifiedCI = dyn_cast<CallInst>(SimplifiedFortifiedCI);
+    if (SimplifiedCI && SimplifiedCI->getCalledFunction())
       if (Value *V = optimizeStringMemoryLibCall(SimplifiedCI, Builder))
         return V;
     return SimplifiedFortifiedCI;
index 9216ae7fe95a2be922326de275fd33997081629e..008b838201edcff224dae28b7ba2dc81b5e6580f 100644 (file)
@@ -57,4 +57,17 @@ define void @test_no_simplify2() {
   ret void
 }
 
+define i8* @test_simplify_return_indcall(i8* ()* %alloc) {
+; CHECK-LABEL: @test_simplify_return_indcall(
+  %src = bitcast %struct.T2* @t2 to i8*
+
+; CHECK-NEXT: %dst = call i8* %alloc()
+  %dst = call i8* %alloc()
+
+; CHECK-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64
+  %ret = call i8* @__memcpy_chk(i8* %dst, i8* %src, i64 1824, i64 1824)
+; CHECK-NEXT: ret i8* %dst
+  ret i8* %ret
+}
+
 declare i8* @__memcpy_chk(i8*, i8*, i64, i64)