summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEric Christopher <echristo@apple.com>2010-09-12 06:09:23 +0000
committerEric Christopher <echristo@apple.com>2010-09-12 06:09:23 +0000
commit298c45e845e1743f86b060cd280e8729cd4ba468 (patch)
treee25c7507802c54b7a70fd6d1cb6f7e6702fae3c3 /lib
parentd4b8333d625e9c4989f8966cb1b7f69bbef6993e (diff)
downloadllvm-298c45e845e1743f86b060cd280e8729cd4ba468.tar.gz
llvm-298c45e845e1743f86b060cd280e8729cd4ba468.tar.bz2
llvm-298c45e845e1743f86b060cd280e8729cd4ba468.tar.xz
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')
-rw-r--r--lib/Transforms/InstCombine/InstCombineAndOrXor.cpp35
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;
}