Fix a pretty scary bug I introduced into the always inliner with

a single missing character. Somehow, this had gone untested. I've added
tests for returns-twice logic specifically with the always-inliner that
would have caught this, and fixed the bug.

Thanks to Matt for the careful review and spotting this!!! =D

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153832 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth 2012-04-01 10:21:05 +00:00
parent 0b42f9dd2f
commit 6052eef8bd
2 changed files with 39 additions and 1 deletions

View File

@ -83,7 +83,7 @@ static bool isInlineViable(Function &F) {
// Disallow calls which expose returns-twice to a function not previously
// attributed as such.
if (ReturnsTwice && CS.isCall() &&
if (!ReturnsTwice && CS.isCall() &&
cast<CallInst>(CS.getInstruction())->canReturnTwice())
return false;
}

View File

@ -40,3 +40,41 @@ define void @outer2(i32 %N) {
call void @inner2( i32 %N )
ret void
}
declare i32 @a() returns_twice
declare i32 @b() returns_twice
define i32 @inner3() alwaysinline {
entry:
%call = call i32 @a() returns_twice
%add = add nsw i32 1, %call
ret i32 %add
}
define i32 @outer3() {
entry:
; CHECK: @outer3
; CHECK-NOT: call i32 @a
; CHECK: ret
%call = call i32 @inner3()
%add = add nsw i32 1, %call
ret i32 %add
}
define i32 @inner4() alwaysinline returns_twice {
entry:
%call = call i32 @b() returns_twice
%add = add nsw i32 1, %call
ret i32 %add
}
define i32 @outer4() {
entry:
; CHECK: @outer4
; CHECK: call i32 @b()
; CHECK: ret
%call = call i32 @inner4() returns_twice
%add = add nsw i32 1, %call
ret i32 %add
}