diff options
author | Craig Topper <craig.topper@intel.com> | 2017-08-06 22:17:21 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2017-08-06 22:17:21 +0000 |
commit | 9cbdbefd0fb500df86fc7f0391ffccd532d37b34 (patch) | |
tree | 7c3503bd4a6826aece5b60bfa22d3f73adc0446c /llvm/lib | |
parent | 61bd3a4840f78ab8b3ecfa633d14e92f95acd0e5 (diff) | |
download | bcm5719-llvm-9cbdbefd0fb500df86fc7f0391ffccd532d37b34.tar.gz bcm5719-llvm-9cbdbefd0fb500df86fc7f0391ffccd532d37b34.zip |
[InstCombine] Support '(C - X) ^ signmask -> (C + signmask - X)' and '(X + C) ^ signmask -> (X + C + signmask)' for vector splats.
llvm-svn: 310232
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp | 27 |
1 files changed, 11 insertions, 16 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp index e684f58f0f4..a2666f46349 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp @@ -2430,35 +2430,30 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) { Constant *NewC = ConstantInt::get(I.getType(), -(*C) - 1); return BinaryOperator::CreateAdd(V, NewC); } + if (RHSC->isSignMask()) { + // (C - X) ^ signmask -> (C + signmask - X) + Constant *NewC = ConstantInt::get(I.getType(), *C + *RHSC); + return BinaryOperator::CreateSub(NewC, V); + } } else if (match(Op0, m_Add(m_Value(V), m_APInt(C)))) { // ~(X-c) --> (-c-1)-X if (RHSC->isAllOnesValue()) { Constant *NewC = ConstantInt::get(I.getType(), -(*C) - 1); return BinaryOperator::CreateSub(NewC, V); } + if (RHSC->isSignMask()) { + // (X + C) ^ signmask -> (X + C + signmask) + Constant *NewC = ConstantInt::get(I.getType(), *C + *RHSC); + return BinaryOperator::CreateAdd(V, NewC); + } } } } if (ConstantInt *RHSC = dyn_cast<ConstantInt>(Op1)) { if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0)) { - if (Op0I->getOpcode() == Instruction::Sub) - if (ConstantInt *Op0I0C = dyn_cast<ConstantInt>(Op0I->getOperand(0))) { - // (C - X) ^ signmask -> (C + signmask - X) - if (RHSC->getValue().isSignMask()) { - Constant *C = Builder.getInt(RHSC->getValue() + Op0I0C->getValue()); - return BinaryOperator::CreateSub(C, Op0I->getOperand(1)); - } - } - if (ConstantInt *Op0CI = dyn_cast<ConstantInt>(Op0I->getOperand(1))) { - if (Op0I->getOpcode() == Instruction::Add) { - // (X + C) ^ signmask -> (X + C + signmask) - if (RHSC->getValue().isSignMask()) { - Constant *C = Builder.getInt(RHSC->getValue() + Op0CI->getValue()); - return BinaryOperator::CreateAdd(Op0I->getOperand(0), C); - } - } else if (Op0I->getOpcode() == Instruction::Or) { + if (Op0I->getOpcode() == Instruction::Or) { // (X|C1)^C2 -> X^(C1|C2) iff X&~C1 == 0 if (MaskedValueIsZero(Op0I->getOperand(0), Op0CI->getValue(), 0, &I)) { |