summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorBenjamin Kramer <benny.kra@googlemail.com>2011-02-20 15:20:01 +0000
committerBenjamin Kramer <benny.kra@googlemail.com>2011-02-20 15:20:01 +0000
commit5b7a4e01952ee454392243496b0577ef2496ed37 (patch)
treea177d048facddab26b41956c43f20e693616b0e6 /llvm/lib
parentd5d7f37beb9f561b70fa31ee89efd2dad5b60be5 (diff)
downloadbcm5719-llvm-5b7a4e01952ee454392243496b0577ef2496ed37.tar.gz
bcm5719-llvm-5b7a4e01952ee454392243496b0577ef2496ed37.zip
Move "A | ~(A & ?) -> -1" from InstCombine to InstructionSimplify.
llvm-svn: 126082
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp10
-rw-r--r--llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp24
2 files changed, 18 insertions, 16 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index a2f9862383f..982dacb50bf 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -1161,6 +1161,16 @@ static Value *SimplifyOrInst(Value *Op0, Value *Op1, const TargetData *TD,
(A == Op0 || B == Op0))
return Op0;
+ // ~(A & ?) | A = -1
+ if (match(Op0, m_Not(m_And(m_Value(A), m_Value(B)))) &&
+ (A == Op1 || B == Op1))
+ return Constant::getAllOnesValue(Op1->getType());
+
+ // A | ~(A & ?) = -1
+ if (match(Op1, m_Not(m_And(m_Value(A), m_Value(B)))) &&
+ (A == Op0 || B == Op0))
+ return Constant::getAllOnesValue(Op0->getType());
+
// Try some generic simplifications for associative operations.
if (Value *V = SimplifyAssociativeBinOp(Instruction::Or, Op0, Op1, TD, DT,
MaxRecurse))
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 07069ada9a2..7986d1aca76 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -1919,24 +1919,16 @@ Instruction *InstCombiner::visitOr(BinaryOperator &I) {
// A | ~(A | B) -> A | ~B
// A | ~(A ^ B) -> A | ~B
- // A | ~(A & B) -> -1
if (match(Op1, m_Not(m_Value(A))))
if (BinaryOperator *B = dyn_cast<BinaryOperator>(A))
- if (Op0 == B->getOperand(0) || Op0 == B->getOperand(1))
- switch (B->getOpcode()) {
- default: break;
- case Instruction::Or:
- case Instruction::Xor:
- if (Op1->hasOneUse()) {
- Value *NotOp = Op0 == B->getOperand(0) ? B->getOperand(1) :
- B->getOperand(0);
- Value *Not = Builder->CreateNot(NotOp, NotOp->getName()+".not");
- return BinaryOperator::CreateOr(Not, Op0);
- }
- break;
- case Instruction::And:
- return ReplaceInstUsesWith(I, Constant::getAllOnesValue(I.getType()));
- }
+ if ((Op0 == B->getOperand(0) || Op0 == B->getOperand(1)) &&
+ Op1->hasOneUse() && (B->getOpcode() == Instruction::Or ||
+ B->getOpcode() == Instruction::Xor)) {
+ Value *NotOp = Op0 == B->getOperand(0) ? B->getOperand(1) :
+ B->getOperand(0);
+ Value *Not = Builder->CreateNot(NotOp, NotOp->getName()+".not");
+ return BinaryOperator::CreateOr(Not, Op0);
+ }
if (ICmpInst *RHS = dyn_cast<ICmpInst>(I.getOperand(1)))
if (ICmpInst *LHS = dyn_cast<ICmpInst>(I.getOperand(0)))
OpenPOWER on IntegriCloud