diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp')
| -rw-r--r-- | contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 17 | 
1 files changed, 9 insertions, 8 deletions
diff --git a/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index 68c4156af2c4..85a7abe211b3 100644 --- a/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/contrib/llvm-project/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -3221,11 +3221,6 @@ Instruction *InstCombinerImpl::visitXor(BinaryOperator &I) {        }      } -    // ~(X - Y) --> ~X + Y -    if (match(NotVal, m_Sub(m_Value(X), m_Value(Y)))) -      if (isa<Constant>(X) || NotVal->hasOneUse()) -        return BinaryOperator::CreateAdd(Builder.CreateNot(X), Y); -      // ~(~X >>s Y) --> (X >>s Y)      if (match(NotVal, m_AShr(m_Not(m_Value(X)), m_Value(Y))))        return BinaryOperator::CreateAShr(X, Y); @@ -3256,9 +3251,15 @@ Instruction *InstCombinerImpl::visitXor(BinaryOperator &I) {        return BinaryOperator::CreateAShr(ConstantExpr::getNot(C), Y);      } -    // ~(X + C) --> -(C + 1) - X -    if (match(Op0, m_Add(m_Value(X), m_Constant(C)))) -      return BinaryOperator::CreateSub(ConstantExpr::getNeg(AddOne(C)), X); +    // ~(X + C) --> ~C - X +    if (match(NotVal, m_c_Add(m_Value(X), m_ImmConstant(C)))) +      return BinaryOperator::CreateSub(ConstantExpr::getNot(C), X); + +    // ~(X - Y) --> ~X + Y +    // FIXME: is it really beneficial to sink the `not` here? +    if (match(NotVal, m_Sub(m_Value(X), m_Value(Y)))) +      if (isa<Constant>(X) || NotVal->hasOneUse()) +        return BinaryOperator::CreateAdd(Builder.CreateNot(X), Y);      // ~(~X + Y) --> X - Y      if (match(NotVal, m_c_Add(m_Not(m_Value(X)), m_Value(Y))))  | 
