diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/InstructionCombining.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 12 | 
1 files changed, 12 insertions, 0 deletions
| diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index d42e0bbdf91..3266ffdae31 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -2439,6 +2439,18 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) {      InsertNewInstBefore(Or, I);      return BinaryOperator::createNot(Or);    } +   +  { +    Value *A = 0, *B = 0; +    ConstantInt *C1 = 0, *C2 = 0; +    if (match(Op0, m_Or(m_Value(A), m_Value(B)))) +      if (A == Op1 || B == Op1)    // (A | ?) & A  --> A +        return ReplaceInstUsesWith(I, Op1); +    if (match(Op1, m_Or(m_Value(A), m_Value(B)))) +      if (A == Op0 || B == Op0)    // A & (A | ?)  --> A +        return ReplaceInstUsesWith(I, Op0); +  } +      if (SetCondInst *RHS = dyn_cast<SetCondInst>(Op1)) {      // (setcc1 A, B) & (setcc2 A, B) --> (setcc3 A, B) | 

