diff options
author | Bill Wendling <isanbard@gmail.com> | 2011-12-14 02:18:26 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2011-12-14 02:18:26 +0000 |
commit | dbdc616ed5eb1c92d75465333b0d96b0185f8c8f (patch) | |
tree | 0cf9ae3bbf23968b95228334ecacdd69c8ecf306 /lib | |
parent | e08643be3a203a3691c4e8346f3e229dc591c288 (diff) | |
download | external_llvm-dbdc616ed5eb1c92d75465333b0d96b0185f8c8f.zip external_llvm-dbdc616ed5eb1c92d75465333b0d96b0185f8c8f.tar.gz external_llvm-dbdc616ed5eb1c92d75465333b0d96b0185f8c8f.tar.bz2 |
Revert r146481 to review possible miscompilations.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146546 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/CodeGen/SjLjEHPrepare.cpp | 39 |
1 files changed, 6 insertions, 33 deletions
diff --git a/lib/CodeGen/SjLjEHPrepare.cpp b/lib/CodeGen/SjLjEHPrepare.cpp index ac99cca..c865192 100644 --- a/lib/CodeGen/SjLjEHPrepare.cpp +++ b/lib/CodeGen/SjLjEHPrepare.cpp @@ -69,8 +69,6 @@ namespace { private: bool setupEntryBlockAndCallSites(Function &F); - void substituteLPadValues(LandingPadInst *LPI, Value *ExnVal, - Value *SelVal, IRBuilder<> &Builder); Value *setupFunctionContext(Function &F, ArrayRef<LandingPadInst*> LPads); void lowerIncomingArguments(Function &F); void lowerAcrossUnwindEdges(Function &F, ArrayRef<InvokeInst*> Invokes); @@ -140,36 +138,6 @@ static void MarkBlocksLiveIn(BasicBlock *BB, MarkBlocksLiveIn(*PI, LiveBBs); } -/// substituteLPadValues - Substitute the values returned by the landingpad -/// instruction with those returned by the personality function. -void SjLjEHPass::substituteLPadValues(LandingPadInst *LPI, Value *ExnVal, - Value *SelVal, IRBuilder<> &Builder) { - SmallVector<Value*, 8> UseWorkList(LPI->use_begin(), LPI->use_end()); - while (!UseWorkList.empty()) { - Value *Val = UseWorkList.pop_back_val(); - ExtractValueInst *EVI = dyn_cast<ExtractValueInst>(Val); - if (!EVI) continue; - if (EVI->getNumIndices() != 1) continue; - if (*EVI->idx_begin() == 0) - EVI->replaceAllUsesWith(ExnVal); - else if (*EVI->idx_begin() == 1) - EVI->replaceAllUsesWith(SelVal); - if (EVI->getNumUses() == 0) - EVI->eraseFromParent(); - } - - if (LPI->getNumUses() == 0) return; - - // There are still some uses of LPI. Construct an aggregate with the exception - // values and replace the LPI with that aggregate. - Type *LPadType = LPI->getType(); - Value *LPadVal = UndefValue::get(LPadType); - LPadVal = Builder.CreateInsertValue(LPadVal, ExnVal, 0, "lpad.val"); - LPadVal = Builder.CreateInsertValue(LPadVal, SelVal, 1, "lpad.val"); - - LPI->replaceAllUsesWith(LPadVal); -} - /// setupFunctionContext - Allocate the function context on the stack and fill /// it with all of the data that we know at this point. Value *SjLjEHPass:: @@ -221,7 +189,12 @@ setupFunctionContext(Function &F, ArrayRef<LandingPadInst*> LPads) { ExnVal = Builder.CreateIntToPtr(ExnVal, Type::getInt8PtrTy(F.getContext())); Value *SelVal = Builder.CreateLoad(SelectorAddr, true, "exn_selector_val"); - substituteLPadValues(LPI, ExnVal, SelVal, Builder); + Type *LPadType = LPI->getType(); + Value *LPadVal = UndefValue::get(LPadType); + LPadVal = Builder.CreateInsertValue(LPadVal, ExnVal, 0, "lpad.val"); + LPadVal = Builder.CreateInsertValue(LPadVal, SelVal, 1, "lpad.val"); + + LPI->replaceAllUsesWith(LPadVal); } // Personality function |