diff options
author | Bill Wendling <isanbard@gmail.com> | 2012-01-20 00:53:28 +0000 |
---|---|---|
committer | Bill Wendling <isanbard@gmail.com> | 2012-01-20 00:53:28 +0000 |
commit | 924926185879585e27fd8c032f5c33c25c967d4b (patch) | |
tree | 8f1335dadc13e71a899f0a3b869c361bf310eebc /llvm/lib/CodeGen | |
parent | 3b754b25bde4914e5ab693e7db9533c3260e926e (diff) | |
download | bcm5719-llvm-924926185879585e27fd8c032f5c33c25c967d4b.tar.gz bcm5719-llvm-924926185879585e27fd8c032f5c33c25c967d4b.zip |
When lowering the 'resume' instruction, look to see if we can eliminate the
'insertvalue' instructions that recreate the structure returned by the
'landingpad' instruction. Because the 'insertvalue' instruction isn't supported
by FastISel, this can save a bit of time during -O0 compilation.
llvm-svn: 148520
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/DwarfEHPrepare.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/DwarfEHPrepare.cpp b/llvm/lib/CodeGen/DwarfEHPrepare.cpp index aa442233e5c..f2b29772751 100644 --- a/llvm/lib/CodeGen/DwarfEHPrepare.cpp +++ b/llvm/lib/CodeGen/DwarfEHPrepare.cpp @@ -101,10 +101,40 @@ bool DwarfEHPrepare::InsertUnwindResumeCalls(Function &Fn) { I = Resumes.begin(), E = Resumes.end(); I != E; ++I) { ResumeInst *RI = *I; BranchInst::Create(UnwindBB, RI->getParent()); - ExtractValueInst *ExnObj = ExtractValueInst::Create(RI->getOperand(0), - 0, "exn.obj", 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; } |