mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-25 19:29:53 +00:00
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@236268 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a55dd52dc8
commit
e233e19ac6
@ -1586,6 +1586,19 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {
|
|||||||
CI->getValue() == I.getType()->getPrimitiveSizeInBits() - 1)
|
CI->getValue() == I.getType()->getPrimitiveSizeInBits() - 1)
|
||||||
return BinaryOperator::CreateLShr(X, CI);
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -630,16 +630,6 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,
|
|||||||
// Otherwise just hand the sub off to computeKnownBits to fill in
|
// Otherwise just hand the sub off to computeKnownBits to fill in
|
||||||
// the known zeros and ones.
|
// the known zeros and ones.
|
||||||
computeKnownBits(V, KnownZero, KnownOne, Depth, CxtI);
|
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;
|
break;
|
||||||
case Instruction::Shl:
|
case Instruction::Shl:
|
||||||
if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user