Move "A | ~(A & ?) -> -1" from InstCombine to InstructionSimplify.
authorBenjamin Kramer <benny.kra@googlemail.com>
Sun, 20 Feb 2011 15:20:01 +0000 (15:20 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Sun, 20 Feb 2011 15:20:01 +0000 (15:20 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@126082 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/InstructionSimplify.cpp
lib/Transforms/InstCombine/InstCombineAndOrXor.cpp

index a2f9862383fd813ddcd1b283270cdb2228caf7ae..982dacb50bfc4f53c982b5f7ad7d58c853bf1101 100644 (file)
@@ -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))
index 07069ada9a297d1b1b1a0a5166391737e4b424b2..7986d1aca7623d31877acfe045d054f27b031b46 100644 (file)
@@ -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)))