diff options
author | David Majnemer <david.majnemer@gmail.com> | 2013-04-18 08:42:33 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2013-04-18 08:42:33 +0000 |
commit | 7754276c4cd257991949231113afa46613c0fdbb (patch) | |
tree | 52ee4c83f19137ad18305a7edf6c58e6cfb8152d /lib/Transforms/InstCombine/InstCombineSelect.cpp | |
parent | a40a3a59818d1fe394f23cda1df940762e30ea65 (diff) | |
download | external_llvm-7754276c4cd257991949231113afa46613c0fdbb.zip external_llvm-7754276c4cd257991949231113afa46613c0fdbb.tar.gz external_llvm-7754276c4cd257991949231113afa46613c0fdbb.tar.bz2 |
Revert "Combine bit test + conditional or into simple math"
It is causing stage2 builds to fail, let's get them running again.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179750 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/InstCombine/InstCombineSelect.cpp')
-rw-r--r-- | lib/Transforms/InstCombine/InstCombineSelect.cpp | 61 |
1 files changed, 0 insertions, 61 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineSelect.cpp b/lib/Transforms/InstCombine/InstCombineSelect.cpp index f5a33ba..f0738b4 100644 --- a/lib/Transforms/InstCombine/InstCombineSelect.cpp +++ b/lib/Transforms/InstCombine/InstCombineSelect.cpp @@ -350,64 +350,6 @@ static Value *SimplifyWithOpReplaced(Value *V, Value *Op, Value *RepOp, return 0; } -/// foldSelectICmpAndOr - We want to turn: -/// (select (icmp eq (and X, C1), 0), Y, (or Y, C2)) -/// into: -/// (or (shl (and X, C1), C3), y) -/// iff: -/// C1 and C2 are both powers of 2 -/// where: -/// C3 = Log(C2) - Log(C1) -/// -/// This transform handles cases where: -/// 1. The icmp predicate is inverted -/// 2. The select operands are reversed -/// 3. The magnitude of C2 and C1 are flipped -static Value *foldSelectICmpAndOr(const SelectInst &SI, Value *TrueVal, - Value *FalseVal, - InstCombiner::BuilderTy *Builder) { - const ICmpInst *IC = dyn_cast<ICmpInst>(SI.getCondition()); - if (!IC || !IC->isEquality()) - return 0; - - Value *CmpLHS = IC->getOperand(0); - Value *CmpRHS = IC->getOperand(1); - - if (!match(CmpRHS, m_Zero())) - return 0; - - Value *X; - const APInt *C1; - if (!match(CmpLHS, m_And(m_Value(X), m_Power2(C1)))) - return 0; - - const APInt *C2; - bool OrOnTrueVal = false; - bool OrOnFalseVal = match(FalseVal, m_Or(m_Specific(TrueVal), m_Power2(C2))); - if (!OrOnFalseVal) - OrOnTrueVal = match(TrueVal, m_Or(m_Specific(FalseVal), m_Power2(C2))); - - if (!OrOnFalseVal && !OrOnTrueVal) - return 0; - - Value *V = CmpLHS; - - unsigned C1Log = C1->logBase2(); - unsigned C2Log = C2->logBase2(); - if (C2Log > C1Log) - V = Builder->CreateShl(V, C2Log - C1Log); - else if (C1Log > C2Log) - V = Builder->CreateLShr(V, C1Log - C2Log); - - ICmpInst::Predicate Pred = IC->getPredicate(); - if ((Pred == ICmpInst::ICMP_NE && OrOnFalseVal) || - (Pred == ICmpInst::ICMP_EQ && OrOnTrueVal)) - V = Builder->CreateXor(V, *C2); - - Value *Y = OrOnFalseVal ? TrueVal : FalseVal; - return Builder->CreateOr(V, Y); -} - /// visitSelectInstWithICmp - Visit a SelectInst that has an /// ICmpInst as its first operand. /// @@ -579,9 +521,6 @@ Instruction *InstCombiner::visitSelectInstWithICmp(SelectInst &SI, } } - if (Value *V = foldSelectICmpAndOr(SI, TrueVal, FalseVal, Builder)) - return ReplaceInstUsesWith(SI, V); - return Changed ? &SI : 0; } |