diff options
author | Alon Zakai <alonzakai@gmail.com> | 2013-12-07 21:09:25 -0500 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2013-12-07 21:55:18 -0500 |
commit | 3e25ed456815370f3082db5144b47baae5475dce (patch) | |
tree | 0ac99105d1e0118537348167af9b0e29ca647cff /lib/Transforms | |
parent | 0fd538115547d8c3658d00dc2becaeec592b1cb0 (diff) |
progress on icmp
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/NaCl/ExpandI64.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/Transforms/NaCl/ExpandI64.cpp b/lib/Transforms/NaCl/ExpandI64.cpp index 8fb32964e2..4f934d9aed 100644 --- a/lib/Transforms/NaCl/ExpandI64.cpp +++ b/lib/Transforms/NaCl/ExpandI64.cpp @@ -237,9 +237,11 @@ void ExpandI64::splitInst(Instruction *I, DataLayout& DL) { case Instruction::ICmp: { Instruction *L = CopyDebug(new ICmpInst(I, dyn_cast<ICmpInst>(I)->getPredicate(), Zero, Zero), I); Instruction *H = CopyDebug(new ICmpInst(I, dyn_cast<ICmpInst>(I)->getPredicate(), Zero, Zero), I); + Instruction *Combine = CopyDebug(BinaryOperator::Create(Instruction::Xor, L, H, "", I), I); SplitInfo &Split = Splits[I]; Split.ToFix.push_back(L); Split.ToFix.push_back(H); + Split.ToFix.push_back(Combine); break; } case Instruction::Select: { @@ -343,6 +345,7 @@ void ExpandI64::finalizeInst(Instruction *I) { Instruction *H = Split.ToFix[1]; L->setOperand(0, LeftLH.Low); L->setOperand(1, RightLH.Low); H->setOperand(0, LeftLH.High); H->setOperand(1, RightLH.High); + I->replaceAllUsesWith(Split.ToFix[2]); break; } case Instruction::Select: { @@ -429,12 +432,14 @@ bool ExpandI64::runOnModule(Module &M) { for (BasicBlock::iterator Iter = BB->begin(), E = BB->end(); Iter != E; ) { Instruction *I = Iter++; + //dump("consider"); dumpIR(I); // FIXME: this could be optimized, we don't need all Num for all instructions int Num = I->getNumOperands(); for (int i = -1; i < Num; i++) { // -1 is the type of I itself Type *T = i == -1 ? I->getType() : I->getOperand(i)->getType(); if (T->isIntegerTy() && T->getIntegerBitWidth() == 64) { Changed = true; + //dump("split"); dumpIR(I); splitInst(I, DL); break; } @@ -446,12 +451,16 @@ bool ExpandI64::runOnModule(Module &M) { if (Changed) { // Finalize each element for (SplitsMap::iterator I = Splits.begin(); I != Splits.end(); I++) { + //dump("finalize"); dumpIR(I->first); finalizeInst(I->first); } // Remove original illegal values - for (SplitsMap::iterator I = Splits.begin(); I != Splits.end(); I++) { - if (!getenv("I64DEV")) I->first->eraseFromParent(); // XXX during development + if (!getenv("I64DEV")) { // XXX during development + for (SplitsMap::iterator I = Splits.begin(); I != Splits.end(); I++) { + //dump("delete"); dumpIR(I->first); + I->first->eraseFromParent(); + } } } return Changed; |