diff options
author | Eric Christopher <echristo@apple.com> | 2010-09-12 06:09:23 +0000 |
---|---|---|
committer | Eric Christopher <echristo@apple.com> | 2010-09-12 06:09:23 +0000 |
commit | 298c45e845e1743f86b060cd280e8729cd4ba468 (patch) | |
tree | e25c7507802c54b7a70fd6d1cb6f7e6702fae3c3 /lib/Transforms | |
parent | d4b8333d625e9c4989f8966cb1b7f69bbef6993e (diff) |
Revert 113679, it was causing an infinite loop in a testcase that I've sent
on to Owen.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113720 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 35 |
1 files changed, 5 insertions, 30 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index d30655f985..3dc8779879 100644 --- a/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -207,26 +207,12 @@ Instruction *InstCombiner::OptAndOp(Instruction *Op, } break; case Instruction::Or: - if (Op->hasOneUse()){ - if (Together != OpRHS) { - // (X | C1) & C2 --> (X | (C1&C2)) & C2 - Value *Or = Builder->CreateOr(X, Together); - Or->takeName(Op); - return BinaryOperator::CreateAnd(Or, AndRHS); - } - - ConstantInt *TogetherCI = dyn_cast<ConstantInt>(Together); - if (TogetherCI && !TogetherCI->isZero()){ - // (X | C1) & C2 --> (X & (C2^(C1&C2))) | C1 - // NOTE: This reduces the number of bits set in the & mask, which - // can expose opportunities for store narrowing. - Together = ConstantExpr::getXor(AndRHS, Together); - Value *And = Builder->CreateAnd(X, Together); - And->takeName(Op); - return BinaryOperator::CreateOr(And, OpRHS); - } + if (Op->hasOneUse() && Together != OpRHS) { + // (X | C1) & C2 --> (X | (C1&C2)) & C2 + Value *Or = Builder->CreateOr(X, Together); + Or->takeName(Op); + return BinaryOperator::CreateAnd(Or, AndRHS); } - break; case Instruction::Add: if (Op->hasOneUse()) { @@ -1957,17 +1943,6 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) { } } - // Note: If we've gotten to the point of visiting the outer OR, then the - // inner one couldn't be simplified. If it was a constant, then it won't - // be simplified by a later pass either, so we try swapping the inner/outer - // ORs in the hopes that we'll be able to simplify it this way. - // (X|C) | V --> (X|V) | C - if (Op0->hasOneUse() && match(Op0, m_Or(m_Value(A), m_ConstantInt(C1)))) { - Value *Inner = Builder->CreateOr(Op0, Op1); - Inner->takeName(Op0); - return BinaryOperator::CreateOr(Inner, C1); - } - return Changed ? &I : 0; } |