aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-12-19 15:56:04 -0800
committerAlon Zakai <alonzakai@gmail.com>2013-12-19 15:56:04 -0800
commit18185dea5adbb4ff07a1f97525711e0b238fed13 (patch)
tree773fa7c63b14b9ef071a209a4ff52bd00bf3d70a /lib/Transforms
parent738bd7451fc9deaf22d694c07fdef5fdfac85eac (diff)
don't break phis with switch legalization
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/NaCl/ExpandI64.cpp16
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;