diff options
| author | Reid Kleckner <rnk@google.com> | 2017-03-01 22:41:12 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2017-03-01 22:41:12 +0000 |
| commit | d80b69fa3bbb8571285775798b78c8babd547823 (patch) | |
| tree | e06836f180cd90c9cc6596235a04aadd9b01074a /llvm/lib/Transforms | |
| parent | 683fdd62bb499d6863de47a72847ecd135724d03 (diff) | |
| download | bcm5719-llvm-d80b69fa3bbb8571285775798b78c8babd547823.tar.gz bcm5719-llvm-d80b69fa3bbb8571285775798b78c8babd547823.zip | |
[Constant Hoisting] Avoid inserting instructions before EH pads
Now that terminators can be EH pads, this code needs to iterate over the
immediate dominators of the EH pad to find a valid insertion point.
Fix for PR32107
Patch by Robert Olliff!
Differential Revision: https://reviews.llvm.org/D30511
llvm-svn: 296698
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/ConstantHoisting.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp b/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp index ebe35aac098..ee6333e8871 100644 --- a/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp +++ b/llvm/lib/Transforms/Scalar/ConstantHoisting.cpp @@ -136,8 +136,16 @@ Instruction *ConstantHoistingPass::findMatInsertPt(Instruction *Inst, if (Idx != ~0U && isa<PHINode>(Inst)) return cast<PHINode>(Inst)->getIncomingBlock(Idx)->getTerminator(); - BasicBlock *IDom = DT->getNode(Inst->getParent())->getIDom()->getBlock(); - return IDom->getTerminator(); + // This must be an EH pad. Iterate over immediate dominators until we find a + // non-EH pad. We need to skip over catchswitch blocks, which are both EH pads + // and terminators. + auto IDom = DT->getNode(Inst->getParent())->getIDom(); + while (IDom->getBlock()->isEHPad()) { + assert(Entry != IDom->getBlock() && "eh pad in entry block"); + IDom = IDom->getIDom(); + } + + return IDom->getBlock()->getTerminator(); } /// \brief Find an insertion point that dominates all uses. |

