aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-12-19 17:24:03 -0800
committerAlon Zakai <alonzakai@gmail.com>2013-12-19 17:24:03 -0800
commit4adafa52157568a798bf27cf9de1c75f6d2087d5 (patch)
tree6d6aa7c593c01a936c56653e99c4ff33ad6887bc /lib/Transforms
parent18185dea5adbb4ff07a1f97525711e0b238fed13 (diff)
fix phis from legalized switches properly, both targets and default target
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/NaCl/ExpandI64.cpp25
1 files changed, 9 insertions, 16 deletions
diff --git a/lib/Transforms/NaCl/ExpandI64.cpp b/lib/Transforms/NaCl/ExpandI64.cpp
index d224e48659..53550db54e 100644
--- a/lib/Transforms/NaCl/ExpandI64.cpp
+++ b/lib/Transforms/NaCl/ExpandI64.cpp
@@ -122,20 +122,6 @@ 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;
}
@@ -579,8 +565,15 @@ 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
+ // We used to go SwitchBB->BB, but now go SwitchBB->NewBB->BB, so make phis think we arrived from SwitchBB. Ditto for DD
+ for (unsigned Which = 0; Which < 2; Which++) {
+ BasicBlock *Target = Which == 0 ? BB : DD;
+ for (BasicBlock::iterator I = Target->begin(); I != Target->end(); ++I) {
+ PHINode *Phi = dyn_cast<PHINode>(I);
+ if (!Phi) break;
+ Phi->addIncoming(Phi->getIncomingValue(Phi->getBasicBlockIndex(SwitchBB)), NewBB);
+ }
+ }
}
}
break;