[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:
parent
838bba9c34
commit
b69afa8e9b
|
@ -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
|
||||
|
|
|
@ -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 }
|
Loading…
Reference in New Issue