diff options
| author | Alon Zakai <alonzakai@gmail.com> | 2013-12-19 15:56:04 -0800 |
|---|---|---|
| committer | Alon Zakai <alonzakai@gmail.com> | 2013-12-19 15:56:04 -0800 |
| commit | 18185dea5adbb4ff07a1f97525711e0b238fed13 (patch) | |
| tree | 773fa7c63b14b9ef071a209a4ff52bd00bf3d70a /lib/Transforms | |
| parent | 738bd7451fc9deaf22d694c07fdef5fdfac85eac (diff) | |
don't break phis with switch legalization
Diffstat (limited to 'lib/Transforms')
| -rw-r--r-- | lib/Transforms/NaCl/ExpandI64.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/lib/Transforms/NaCl/ExpandI64.cpp b/lib/Transforms/NaCl/ExpandI64.cpp index 63c2328cb2..d224e48659 100644 --- a/lib/Transforms/NaCl/ExpandI64.cpp +++ b/lib/Transforms/NaCl/ExpandI64.cpp @@ -122,6 +122,20 @@ INITIALIZE_PASS(ExpandI64, "expand-i64", // Utilities +static void updateEdge(BasicBlock *Dest, // from PNaClSjLjEH.cpp + BasicBlock *OldIncoming, + BasicBlock *NewIncoming) { + for (BasicBlock::iterator Inst = Dest->begin(); Inst != Dest->end(); ++Inst) { + PHINode *Phi = dyn_cast<PHINode>(Inst); + if (!Phi) + break; + for (unsigned I = 0, E = Phi->getNumIncomingValues(); I < E; ++I) { + if (Phi->getIncomingBlock(I) == OldIncoming) + Phi->setIncomingBlock(I, NewIncoming); + } + } +} + static bool isIllegal(Type *T) { return T->isIntegerTy() && T->getIntegerBitWidth() == 64; } @@ -565,6 +579,8 @@ void ExpandI64::splitInst(Instruction *I, DataLayout& DL) { CopyDebug(BranchInst::Create(BB, DD, CheckHigh, NewBB), I); LowSI->addCase(cast<ConstantInt>(ConstantInt::get(i32, LowBits)), NewBB); + + updateEdge(BB, SwitchBB, NewBB); // make sure phis work properly } } break; |
