From: Bill Wendling Date: Fri, 21 Oct 2011 22:08:56 +0000 (+0000) Subject: Make sure that the landing pads themselves have no PHI instructions in them. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0ad56122e585d3d27ea852115390a9e53cabc9d5;p=oota-llvm.git Make sure that the landing pads themselves have no PHI instructions in them. The assumption in the back-end is that PHIs are not allowed at the start of the landing pad block for SjLj exceptions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@142689 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/SjLjEHPrepare.cpp b/lib/CodeGen/SjLjEHPrepare.cpp index 3ccf39ba245..e5cb1bb6ea2 100644 --- a/lib/CodeGen/SjLjEHPrepare.cpp +++ b/lib/CodeGen/SjLjEHPrepare.cpp @@ -908,6 +908,27 @@ void SjLjEHPass::lowerAcrossUnwindEdges(Function &F, } } } + + // Go through the landing pads and remove any PHIs there. + for (unsigned i = 0, e = Invokes.size(); i != e; ++i) { + BasicBlock *UnwindBlock = Invokes[i]->getUnwindDest(); + LandingPadInst *LPI = UnwindBlock->getLandingPadInst(); + + // Place PHIs into a set to avoid invalidating the iterator. + SmallPtrSet PHIsToDemote; + for (BasicBlock::iterator + PN = UnwindBlock->begin(); isa(PN); ++PN) + PHIsToDemote.insert(cast(PN)); + if (PHIsToDemote.empty()) continue; + + // Demote the PHIs to the stack. + for (SmallPtrSet::iterator + I = PHIsToDemote.begin(), E = PHIsToDemote.end(); I != E; ++I) + DemotePHIToStack(*I); + + // Move the landingpad instruction back to the top of the landing pad block. + LPI->moveBefore(UnwindBlock->begin()); + } } /// setupEntryBlockAndCallSites - Setup the entry block by creating and filling