diff options
author | Bill Wendling <isanbard@gmail.com> | 2012-01-28 01:10:01 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2012-01-28 01:10:01 +0000 |
commit | afcb5b5ee854474a50dc4642a6e6ecc15acfe8cc (patch) | |
tree | e51503cd79453af255c778e7b60285ee5bcd124d /lib/CodeGen | |
parent | b0064c6d8b50b43f56aabaebfd0e0ac274501a59 (diff) |
Revert r149159 until I can fix tests.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149162 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/DwarfEHPrepare.cpp | 93 |
1 files changed, 32 insertions, 61 deletions
diff --git a/lib/CodeGen/DwarfEHPrepare.cpp b/lib/CodeGen/DwarfEHPrepare.cpp index 22f7b1c6d6..f2b2977275 100644 --- a/lib/CodeGen/DwarfEHPrepare.cpp +++ b/lib/CodeGen/DwarfEHPrepare.cpp @@ -39,7 +39,6 @@ namespace { Constant *RewindFunction; bool InsertUnwindResumeCalls(Function &Fn); - Instruction *GetExceptionObject(ResumeInst *RI); public: static char ID; // Pass identification, replacement for typeid. @@ -65,46 +64,6 @@ FunctionPass *llvm::createDwarfEHPass(const TargetMachine *tm) { return new DwarfEHPrepare(tm); } -/// GetExceptionObject - Return the exception object from the value passed into -/// the 'resume' instruction (typically an aggregate). Clean up any dead -/// instructions, including the 'resume' instruction. -Instruction *DwarfEHPrepare::GetExceptionObject(ResumeInst *RI) { - Value *V = RI->getOperand(0); - Instruction *ExnObj = 0; - InsertValueInst *SelIVI = dyn_cast<InsertValueInst>(V); - LoadInst *SelLoad = 0; - InsertValueInst *ExcIVI = 0; - bool EraseIVIs = false; - - if (SelIVI) { - if (SelIVI->getNumIndices() == 1 && *SelIVI->idx_begin() == 1) { - ExcIVI = dyn_cast<InsertValueInst>(SelIVI->getOperand(0)); - if (ExcIVI && isa<UndefValue>(ExcIVI->getOperand(0)) && - ExcIVI->getNumIndices() == 1 && *ExcIVI->idx_begin() == 0) { - ExnObj = cast<Instruction>(ExcIVI->getOperand(1)); - SelLoad = dyn_cast<LoadInst>(SelIVI->getOperand(1)); - EraseIVIs = true; - } - } - } - - if (!ExnObj) - ExnObj = ExtractValueInst::Create(RI->getOperand(0), 0, "exn.obj", RI); - - RI->eraseFromParent(); - - if (EraseIVIs) { - if (SelIVI->getNumUses() == 0) - SelIVI->eraseFromParent(); - if (ExcIVI->getNumUses() == 0) - ExcIVI->eraseFromParent(); - if (SelLoad && SelLoad->getNumUses() == 0) - SelLoad->eraseFromParent(); - } - - return ExnObj; -} - /// InsertUnwindResumeCalls - Convert the ResumeInsts that are still present /// into calls to the appropriate _Unwind_Resume function. bool DwarfEHPrepare::InsertUnwindResumeCalls(Function &Fn) { @@ -132,26 +91,8 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls(Function &Fn) { // Create the basic block where the _Unwind_Resume call will live. LLVMContext &Ctx = Fn.getContext(); - unsigned ResumesSize = Resumes.size(); - - if (ResumesSize == 1) { - // Instead of creating a new BB and PHI node, just append the call to - // _Unwind_Resume to the end of the single resume block. - ResumeInst *RI = Resumes.front(); - BasicBlock *UnwindBB = RI->getParent(); - Instruction *ExnObj = GetExceptionObject(RI); - - // Call the _Unwind_Resume function. - CallInst *CI = CallInst::Create(RewindFunction, ExnObj, "", UnwindBB); - CI->setCallingConv(TLI->getLibcallCallingConv(RTLIB::UNWIND_RESUME)); - - // We never expect _Unwind_Resume to return. - new UnreachableInst(Ctx, UnwindBB); - return true; - } - BasicBlock *UnwindBB = BasicBlock::Create(Ctx, "unwind_resume", &Fn); - PHINode *PN = PHINode::Create(Type::getInt8PtrTy(Ctx), ResumesSize, + PHINode *PN = PHINode::Create(Type::getInt8PtrTy(Ctx), Resumes.size(), "exn.obj", UnwindBB); // Extract the exception object from the ResumeInst and add it to the PHI node @@ -161,8 +102,38 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls(Function &Fn) { ResumeInst *RI = *I; BranchInst::Create(UnwindBB, RI->getParent()); - Instruction *ExnObj = GetExceptionObject(RI); + Value *V = RI->getOperand(0); + Instruction *ExnObj = 0; + InsertValueInst *SelIVI = dyn_cast<InsertValueInst>(V); + LoadInst *SelLoad = 0; + InsertValueInst *ExcIVI = 0; + bool EraseIVIs = false; + if (SelIVI) { + if (SelIVI->getNumIndices() == 1 && *SelIVI->idx_begin() == 1) { + ExcIVI = dyn_cast<InsertValueInst>(SelIVI->getOperand(0)); + if (ExcIVI && isa<UndefValue>(ExcIVI->getOperand(0)) && + ExcIVI->getNumIndices() == 1 && *ExcIVI->idx_begin() == 0) { + ExnObj = cast<Instruction>(ExcIVI->getOperand(1)); + SelLoad = dyn_cast<LoadInst>(SelIVI->getOperand(1)); + EraseIVIs = true; + } + } + } + + if (!ExnObj) + ExnObj = ExtractValueInst::Create(RI->getOperand(0), 0, "exn.obj", RI); + PN->addIncoming(ExnObj, RI->getParent()); + RI->eraseFromParent(); + + if (EraseIVIs) { + if (SelIVI->getNumUses() == 0) + SelIVI->eraseFromParent(); + if (ExcIVI->getNumUses() == 0) + ExcIVI->eraseFromParent(); + if (SelLoad && SelLoad->getNumUses() == 0) + SelLoad->eraseFromParent(); + } ++NumResumesLowered; } |