From: Chris Lattner Date: Tue, 16 Sep 2003 19:42:21 +0000 (+0000) Subject: Fix bug raising allocations whose call sites were invoke instructions. X-Git-Tag: android-x86-6.0-r1~1003^2~59270 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=cc838348fc4eb60b09f6ef9cd248be347112c7a9;p=android-x86%2Fexternal-llvm.git Fix bug raising allocations whose call sites were invoke instructions. Thanks to brg for tracking down the problem so precisely! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8568 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/IPO/RaiseAllocations.cpp b/lib/Transforms/IPO/RaiseAllocations.cpp index 62355be8780..d214d2edfe6 100644 --- a/lib/Transforms/IPO/RaiseAllocations.cpp +++ b/lib/Transforms/IPO/RaiseAllocations.cpp @@ -9,6 +9,7 @@ #include "llvm/Module.h" #include "llvm/DerivedTypes.h" #include "llvm/iMemory.h" +#include "llvm/iTerminators.h" #include "llvm/iOther.h" #include "llvm/Pass.h" #include "llvm/Support/CallSite.h" @@ -130,6 +131,13 @@ bool RaiseAllocations::run(Module &M) { std::string Name(I->getName()); I->setName(""); MallocInst *MI = new MallocInst(Type::SByteTy, Source, Name, I); I->replaceAllUsesWith(MI); + + // If the old instruction was an invoke, add an unconditional branch + // before the invoke, which will become the new terminator. + if (InvokeInst *II = dyn_cast(I)) + new BranchInst(II->getNormalDest(), I); + + // Delete the old call site MI->getParent()->getInstList().erase(I); Changed = true; ++NumRaised; @@ -160,6 +168,13 @@ bool RaiseAllocations::run(Module &M) { Source = new CastInst(Source, PointerType::get(Type::SByteTy), "FreePtrCast", I); new FreeInst(Source, I); + + // If the old instruction was an invoke, add an unconditional branch + // before the invoke, which will become the new terminator. + if (InvokeInst *II = dyn_cast(I)) + new BranchInst(II->getNormalDest(), I); + + // Delete the old call site I->getParent()->getInstList().erase(I); Changed = true; ++NumRaised;