[PruneEH] Don't split musttail call from ret

Summary:
When inserting an `unreachable` after a noreturn call, we must ensure
that it's not a musttail call to avoid breaking the IR invariants for
musttail calls.

Reviewers: fedor.sergeev, majnemer

Reviewed By: majnemer

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D60079

llvm-svn: 357483
This commit is contained in:
Joseph Tremoulet 2019-04-02 15:47:11 +00:00
parent 838bba9c34
commit b69afa8e9b
2 changed files with 17 additions and 1 deletions

View File

@ -203,7 +203,8 @@ static bool SimplifyFunction(Function *F, CallGraph &CG) {
for (BasicBlock::iterator I = BB->begin(), E = BB->end(); I != E; )
if (CallInst *CI = dyn_cast<CallInst>(I++))
if (CI->doesNotReturn() && !isa<UnreachableInst>(I)) {
if (CI->doesNotReturn() && !CI->isMustTailCall() &&
!isa<UnreachableInst>(I)) {
// This call calls a function that cannot return. Insert an
// unreachable instruction after it and simplify the code. Do this
// by splitting the BB, adding the unreachable, then deleting the

View File

@ -0,0 +1,15 @@
; RUN: opt -prune-eh -S < %s | FileCheck %s
declare void @noreturn()
define void @testfn() {
; A musttail call must be followed by (optional bitcast then) ret,
; so make sure we don't insert an unreachable
; CHECK: musttail call void @noreturn
; CHECK-NOT: unreachable
; CHECK-NEXT: ret void
musttail call void @noreturn() #0
ret void
}
attributes #0 = { noreturn }