diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-12-07 20:10:55 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-12-07 20:10:55 -0500 |
commit | 243666486a41e9d029d9337df10d0a28e49df7cd (patch) | |
tree | d887e6ce114b4bcef8f9e3bdb2fe4def60dd1318 /lib/Transforms | |
parent | 2ff2d17013101b24efbed348aaa59fa36ca4a725 (diff) |
legalize phi nodes
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/NaCl/ExpandI64.cpp | 29 |
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); } } |