InstCombine: Move Sub->Xor rule from SimplifyDemanded to InstCombine

The rule that turns a sub to xor if the LHS is 2^n-1 and the remaining bits
are known zero, does not use the demanded bits at all: Move it to the
normal InstCombine code path.

Differential Revision: http://reviews.llvm.org/D9417

llvm-svn: 236268
This commit is contained in:
Matthias Braun 2015-04-30 22:04:26 +00:00
parent 868b3f47d2
commit ec6833420f
2 changed files with 13 additions and 10 deletions

View File

@ -1586,6 +1586,19 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {
CI->getValue() == I.getType()->getPrimitiveSizeInBits() - 1)
return BinaryOperator::CreateLShr(X, CI);
}
// Turn this into a xor if LHS is 2^n-1 and the remaining bits are known
// zero.
APInt IntVal = C->getValue();
if ((IntVal + 1).isPowerOf2()) {
unsigned BitWidth = I.getType()->getScalarSizeInBits();
APInt KnownZero(BitWidth, 0);
APInt KnownOne(BitWidth, 0);
computeKnownBits(&I, KnownZero, KnownOne, 0, &I);
if ((IntVal | KnownZero).isAllOnesValue()) {
return BinaryOperator::CreateXor(Op1, C);
}
}
}

View File

@ -630,16 +630,6 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
// Otherwise just hand the sub off to computeKnownBits to fill in
// the known zeros and ones.
computeKnownBits(V, KnownZero, KnownOne, Depth, CxtI);
// Turn this into a xor if LHS is 2^n-1 and the remaining bits are known
// zero.
if (ConstantInt *C0 = dyn_cast<ConstantInt>(I->getOperand(0))) {
APInt I0 = C0->getValue();
if ((I0 + 1).isPowerOf2() && (I0 | KnownZero).isAllOnesValue()) {
Instruction *Xor = BinaryOperator::CreateXor(I->getOperand(1), C0);
return InsertNewInstWith(Xor, *I);
}
}
break;
case Instruction::Shl:
if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) {