From: Joseph Tremoulet Date: Tue, 2 Apr 2019 15:47:11 +0000 (+0000) Subject: [PruneEH] Don't split musttail call from ret X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5fc1c8d59b35c30ee9912e06894612c177465415;p=llvm [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@357483 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/IPO/PruneEH.cpp b/lib/Transforms/IPO/PruneEH.cpp index 46d42764fd2..ef7b43e8b55 100644 --- a/lib/Transforms/IPO/PruneEH.cpp +++ b/lib/Transforms/IPO/PruneEH.cpp @@ -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(I++)) - if (CI->doesNotReturn() && !isa(I)) { + if (CI->doesNotReturn() && !CI->isMustTailCall() && + !isa(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 diff --git a/test/Transforms/PruneEH/musttail.ll b/test/Transforms/PruneEH/musttail.ll new file mode 100644 index 00000000000..1ad607713c6 --- /dev/null +++ b/test/Transforms/PruneEH/musttail.ll @@ -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 }