diff options
author | Bill Wendling <isanbard@gmail.com> | 2011-08-09 01:09:21 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2011-08-09 01:09:21 +0000 |
commit | def94edf696fa6994f9384191249f15e6d042eb0 (patch) | |
tree | a30d017063ba3235b9c83dd98936efb4bd577e6a /llvm/lib/Transforms/Utils/LowerInvoke.cpp | |
parent | 27b625e12f25cd9fb3c141a91cd7d40f5fcaf144 (diff) | |
download | bcm5719-llvm-def94edf696fa6994f9384191249f15e6d042eb0.tar.gz bcm5719-llvm-def94edf696fa6994f9384191249f15e6d042eb0.zip |
Remove an instance where the 'unwind' instruction was created.
The 'unwind' instruction was acting essentially as a placeholder, because it
would be replaced at the end of this function by a branch to the "unwind
handler". The 'unwind' instruction is going away, so use 'unreachable' instead,
which serves the same purpose as a placeholder.
llvm-svn: 137098
Diffstat (limited to 'llvm/lib/Transforms/Utils/LowerInvoke.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LowerInvoke.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/LowerInvoke.cpp b/llvm/lib/Transforms/Utils/LowerInvoke.cpp index eb3037fa92e..3a034ecd901 100644 --- a/llvm/lib/Transforms/Utils/LowerInvoke.cpp +++ b/llvm/lib/Transforms/Utils/LowerInvoke.cpp @@ -406,6 +406,7 @@ bool LowerInvoke::insertExpensiveEHSupport(Function &F) { SmallVector<ReturnInst*,16> Returns; SmallVector<UnwindInst*,16> Unwinds; SmallVector<InvokeInst*,16> Invokes; + SmallVector<UnreachableInst*, 16> Unreachables; for (Function::iterator BB = F.begin(), E = F.end(); BB != E; ++BB) if (ReturnInst *RI = dyn_cast<ReturnInst>(BB->getTerminator())) { @@ -486,9 +487,10 @@ bool LowerInvoke::insertExpensiveEHSupport(Function &F) { // Insert a load in the Catch block, and a switch on its value. By default, // we go to a block that just does an unwind (which is the correct action - // for a standard call). + // for a standard call). We insert an unreachable instruction here and + // modify the block to jump to the correct unwinding pad later. BasicBlock *UnwindBB = BasicBlock::Create(F.getContext(), "unwindbb", &F); - Unwinds.push_back(new UnwindInst(F.getContext(), UnwindBB)); + Unreachables.push_back(new UnreachableInst(F.getContext(), UnwindBB)); Value *CatchLoad = new LoadInst(InvokeNum, "invoke.num", true, CatchBB); SwitchInst *CatchSwitch = @@ -577,6 +579,12 @@ bool LowerInvoke::insertExpensiveEHSupport(Function &F) { Unwinds[i]->eraseFromParent(); } + // Replace all inserted unreachables with a branch to the unwind handler. + for (unsigned i = 0, e = Unreachables.size(); i != e; ++i) { + BranchInst::Create(UnwindHandler, Unreachables[i]); + Unreachables[i]->eraseFromParent(); + } + // Finally, for any returns from this function, if this function contains an // invoke, restore the old jmpbuf pointer to its input value. if (OldJmpBufPtr) { |