aboutsummaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-12-07 20:10:55 -0500
committerAlon Zakai <alonzakai@gmail.com>2013-12-07 20:10:55 -0500
commit243666486a41e9d029d9337df10d0a28e49df7cd (patch)
treed887e6ce114b4bcef8f9e3bdb2fe4def60dd1318 /lib/Transforms
parent2ff2d17013101b24efbed348aaa59fa36ca4a725 (diff)
legalize phi nodes
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/NaCl/ExpandI64.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/lib/Transforms/NaCl/ExpandI64.cpp b/lib/Transforms/NaCl/ExpandI64.cpp
index af20c4c818..ba85deaff6 100644
--- a/lib/Transforms/NaCl/ExpandI64.cpp
+++ b/lib/Transforms/NaCl/ExpandI64.cpp
@@ -247,6 +247,23 @@ void ExpandI64::splitInst(Instruction *I, DataLayout& DL) {
Split.LowHigh.High = H;
break;
}
+ case Instruction::PHI: {
+ PHINode *P = dyn_cast<PHINode>(I);
+ int Num = P->getNumIncomingValues();
+
+ PHINode *L = PHINode::Create(i32, Num, "", I); CopyDebug(L, I);
+ PHINode *H = PHINode::Create(i32, Num, "", I); CopyDebug(H, I);
+ for (int i = 0; i < Num; i++) {
+ L->addIncoming(Zero, P->getIncomingBlock(i)); // will be fixed
+ H->addIncoming(Zero, P->getIncomingBlock(i)); // will be fixed
+ }
+ SplitInfo &Split = Splits[I];
+ Split.ToFix.push_back(L);
+ Split.ToFix.push_back(H);
+ Split.LowHigh.Low = L;
+ Split.LowHigh.High = H;
+ break;
+ }
default: {
dumpIR(I);
assert(0 && "some i64 thing we can't legalize yet");
@@ -326,6 +343,18 @@ void ExpandI64::finalizeInst(Instruction *I) {
H->setOperand(1, TrueLH.High); H->setOperand(2, FalseLH.High);
break;
}
+ case Instruction::PHI: {
+ PHINode *P = dyn_cast<PHINode>(I);
+ int Num = P->getNumIncomingValues();
+ PHINode *L = dyn_cast<PHINode>(Split.ToFix[0]);
+ PHINode *H = dyn_cast<PHINode>(Split.ToFix[1]);
+ for (int i = 0; i < Num; i++) {
+ LowHighPair LH = getLowHigh(P->getIncomingValue(i));
+ L->setIncomingValue(i, LH.Low);
+ H->setIncomingValue(i, LH.High);
+ }
+ break;
+ }
default: assert(0);
}
}