mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Correct the value of LowBits in srem and urem handling in
ComputeMaskedBits. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50692 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
703bfe6909
commit
23e1df8b8d
@ -1560,7 +1560,7 @@ void SelectionDAG::ComputeMaskedBits(SDOperand Op, const APInt &Mask,
|
|||||||
if (ConstantSDNode *Rem = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
|
if (ConstantSDNode *Rem = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
|
||||||
APInt RA = Rem->getAPIntValue();
|
APInt RA = Rem->getAPIntValue();
|
||||||
if (RA.isPowerOf2() || (-RA).isPowerOf2()) {
|
if (RA.isPowerOf2() || (-RA).isPowerOf2()) {
|
||||||
APInt LowBits = RA.isStrictlyPositive() ? ((RA - 1) | RA) : ~RA;
|
APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) : ~RA;
|
||||||
APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
|
APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
|
||||||
ComputeMaskedBits(Op.getOperand(0), Mask2,KnownZero2,KnownOne2,Depth+1);
|
ComputeMaskedBits(Op.getOperand(0), Mask2,KnownZero2,KnownOne2,Depth+1);
|
||||||
|
|
||||||
@ -1581,8 +1581,8 @@ void SelectionDAG::ComputeMaskedBits(SDOperand Op, const APInt &Mask,
|
|||||||
case ISD::UREM: {
|
case ISD::UREM: {
|
||||||
if (ConstantSDNode *Rem = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
|
if (ConstantSDNode *Rem = dyn_cast<ConstantSDNode>(Op.getOperand(1))) {
|
||||||
APInt RA = Rem->getAPIntValue();
|
APInt RA = Rem->getAPIntValue();
|
||||||
if (RA.isStrictlyPositive() && RA.isPowerOf2()) {
|
if (RA.isPowerOf2()) {
|
||||||
APInt LowBits = (RA - 1) | RA;
|
APInt LowBits = (RA - 1);
|
||||||
APInt Mask2 = LowBits & Mask;
|
APInt Mask2 = LowBits & Mask;
|
||||||
KnownZero |= ~LowBits & Mask;
|
KnownZero |= ~LowBits & Mask;
|
||||||
ComputeMaskedBits(Op.getOperand(0), Mask2, KnownZero, KnownOne,Depth+1);
|
ComputeMaskedBits(Op.getOperand(0), Mask2, KnownZero, KnownOne,Depth+1);
|
||||||
|
@ -965,7 +965,7 @@ void InstCombiner::ComputeMaskedBits(Value *V, const APInt &Mask,
|
|||||||
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||||
APInt RA = Rem->getValue();
|
APInt RA = Rem->getValue();
|
||||||
if (RA.isPowerOf2() || (-RA).isPowerOf2()) {
|
if (RA.isPowerOf2() || (-RA).isPowerOf2()) {
|
||||||
APInt LowBits = RA.isStrictlyPositive() ? ((RA - 1) | RA) : ~RA;
|
APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) : ~RA;
|
||||||
APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
|
APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
|
||||||
ComputeMaskedBits(I->getOperand(0), Mask2,KnownZero2,KnownOne2,Depth+1);
|
ComputeMaskedBits(I->getOperand(0), Mask2,KnownZero2,KnownOne2,Depth+1);
|
||||||
|
|
||||||
@ -986,8 +986,8 @@ void InstCombiner::ComputeMaskedBits(Value *V, const APInt &Mask,
|
|||||||
case Instruction::URem: {
|
case Instruction::URem: {
|
||||||
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||||
APInt RA = Rem->getValue();
|
APInt RA = Rem->getValue();
|
||||||
if (RA.isStrictlyPositive() && RA.isPowerOf2()) {
|
if (RA.isPowerOf2()) {
|
||||||
APInt LowBits = (RA - 1) | RA;
|
APInt LowBits = (RA - 1);
|
||||||
APInt Mask2 = LowBits & Mask;
|
APInt Mask2 = LowBits & Mask;
|
||||||
KnownZero |= ~LowBits & Mask;
|
KnownZero |= ~LowBits & Mask;
|
||||||
ComputeMaskedBits(I->getOperand(0), Mask2, KnownZero, KnownOne,Depth+1);
|
ComputeMaskedBits(I->getOperand(0), Mask2, KnownZero, KnownOne,Depth+1);
|
||||||
@ -1728,7 +1728,7 @@ bool InstCombiner::SimplifyDemandedBits(Value *V, APInt DemandedMask,
|
|||||||
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||||
APInt RA = Rem->getValue();
|
APInt RA = Rem->getValue();
|
||||||
if (RA.isPowerOf2() || (-RA).isPowerOf2()) {
|
if (RA.isPowerOf2() || (-RA).isPowerOf2()) {
|
||||||
APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) | RA : ~RA;
|
APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) : ~RA;
|
||||||
APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
|
APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
|
||||||
if (SimplifyDemandedBits(I->getOperand(0), Mask2,
|
if (SimplifyDemandedBits(I->getOperand(0), Mask2,
|
||||||
LHSKnownZero, LHSKnownOne, Depth+1))
|
LHSKnownZero, LHSKnownOne, Depth+1))
|
||||||
@ -1749,8 +1749,8 @@ bool InstCombiner::SimplifyDemandedBits(Value *V, APInt DemandedMask,
|
|||||||
case Instruction::URem: {
|
case Instruction::URem: {
|
||||||
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
|
||||||
APInt RA = Rem->getValue();
|
APInt RA = Rem->getValue();
|
||||||
if (RA.isStrictlyPositive() && RA.isPowerOf2()) {
|
if (RA.isPowerOf2()) {
|
||||||
APInt LowBits = (RA - 1) | RA;
|
APInt LowBits = (RA - 1);
|
||||||
APInt Mask2 = LowBits & DemandedMask;
|
APInt Mask2 = LowBits & DemandedMask;
|
||||||
KnownZero |= ~LowBits & DemandedMask;
|
KnownZero |= ~LowBits & DemandedMask;
|
||||||
if (SimplifyDemandedBits(I->getOperand(0), Mask2,
|
if (SimplifyDemandedBits(I->getOperand(0), Mask2,
|
||||||
|
9
test/Transforms/InstCombine/srem-simplify-bug.ll
Normal file
9
test/Transforms/InstCombine/srem-simplify-bug.ll
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ret i1 false}
|
||||||
|
; PR2276
|
||||||
|
|
||||||
|
define i1 @f(i32 %x) {
|
||||||
|
%A = or i32 %x, 1
|
||||||
|
%B = srem i32 %A, 1
|
||||||
|
%C = icmp ne i32 %B, 0
|
||||||
|
ret i1 %C
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user