diff options
author | Alon Zakai <alonzakai@gmail.com> | 2014-01-29 15:51:55 -0800 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2014-01-29 15:51:55 -0800 |
commit | 7ee97e87772545a66a574239ae8420cd60fe6ac9 (patch) | |
tree | 8029e656bb0b243176910ef0a7d6b8933565b4d3 | |
parent | f8c813aeeb36b07ef27a118892e4d8d64c6a32d1 (diff) |
legalize phis >64 bits
-rw-r--r-- | lib/Transforms/NaCl/ExpandI64.cpp | 32 |
1 files changed, 16 insertions, 16 deletions
diff --git a/lib/Transforms/NaCl/ExpandI64.cpp b/lib/Transforms/NaCl/ExpandI64.cpp index 46f225bb82..08a16b4f04 100644 --- a/lib/Transforms/NaCl/ExpandI64.cpp +++ b/lib/Transforms/NaCl/ExpandI64.cpp @@ -513,17 +513,16 @@ void ExpandI64::splitInst(Instruction *I, DataLayout& DL) { break; } case Instruction::PHI: { - assert(I->getOperand(0)->getType() == i64); - 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); + int Num = getNumChunks(I->getType()); + PHINode *Parent = dyn_cast<PHINode>(I); + int PhiNum = Parent->getNumIncomingValues(); 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 + PHINode *P = PHINode::Create(i32, PhiNum, "", I); CopyDebug(P, I); + for (int j = 0; j < PhiNum; j++) { + P->addIncoming(Zero, Parent->getIncomingBlock(j)); // will be fixed + } + Split.Chunks.push_back(P); } - Split.Chunks.push_back(L); - Split.Chunks.push_back(H); break; } case Instruction::And: @@ -936,14 +935,15 @@ void ExpandI64::finalizeInst(Instruction *I) { break; } case Instruction::PHI: { - PHINode *P = dyn_cast<PHINode>(I); - int Num = P->getNumIncomingValues(); - PHINode *L = dyn_cast<PHINode>(Split.Chunks[0]); - PHINode *H = dyn_cast<PHINode>(Split.Chunks[1]); + int Num = getNumChunks(I->getType()); + PHINode *Parent = dyn_cast<PHINode>(I); + int PhiNum = Parent->getNumIncomingValues(); for (int i = 0; i < Num; i++) { - ChunksVec Chunks = getChunks(P->getIncomingValue(i)); - L->setIncomingValue(i, Chunks[0]); - H->setIncomingValue(i, Chunks[1]); + PHINode *P = cast<PHINode>(Split.Chunks[i]); + for (int j = 0; j < PhiNum; j++) { + ChunksVec Chunks = getChunks(Parent->getIncomingValue(j)); + P->setIncomingValue(j, Chunks[i]); + } } break; } |