Skip to content

Commit

Permalink
[SimplifyLibCalls] Don't try to simplify indirect calls.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
ahmedbougacha committed Jan 14, 2015
1 parent 7e73dc4 commit 61d6dc4
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 1 deletion.
2 changes: 2 additions & 0 deletions include/llvm/Transforms/Utils/SimplifyLibCalls.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class FortifiedLibCallSimplifier {
/// \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:
Expand Down Expand Up @@ -83,6 +84,7 @@ class LibCallSimplifier {
/// 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
Expand Down
3 changes: 2 additions & 1 deletion lib/Transforms/Utils/SimplifyLibCalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
13 changes: 13 additions & 0 deletions test/Transforms/InstCombine/memcpy_chk-1.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit 61d6dc4

Please sign in to comment.