diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2017-05-29 16:25:25 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2017-05-29 16:25:25 +0000 | 
| commit | ab44ce3d598882e51a25eb82eb7ae6308de85ae6 (patch) | |
| tree | 568d786a59d49bef961dcb9bd09d422701b9da5b /lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | |
| parent | b5630dbadf9a2a06754194387d6b0fd9962a67f1 (diff) | |
Notes
Diffstat (limited to 'lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp')
| -rw-r--r-- | lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp | 92 | 
1 files changed, 38 insertions, 54 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp b/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp index 4028a92771a4..5df55f01b83f 100644 --- a/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp +++ b/lib/Transforms/InstCombine/InstCombineSimplifyDemanded.cpp @@ -158,8 +158,8 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,          SimplifyDemandedBits(I, 0, DemandedMask & ~RHSKnown.Zero, LHSKnown,                               Depth + 1))        return I; -    assert(!(RHSKnown.Zero & RHSKnown.One) && "Bits known to be one AND zero?"); -    assert(!(LHSKnown.Zero & LHSKnown.One) && "Bits known to be one AND zero?"); +    assert(!RHSKnown.hasConflict() && "Bits known to be one AND zero?"); +    assert(!LHSKnown.hasConflict() && "Bits known to be one AND zero?");      // Output known-0 are known to be clear if zero in either the LHS | RHS.      APInt IKnownZero = RHSKnown.Zero | LHSKnown.Zero; @@ -192,8 +192,8 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,          SimplifyDemandedBits(I, 0, DemandedMask & ~RHSKnown.One, LHSKnown,                               Depth + 1))        return I; -    assert(!(RHSKnown.Zero & RHSKnown.One) && "Bits known to be one AND zero?"); -    assert(!(LHSKnown.Zero & LHSKnown.One) && "Bits known to be one AND zero?"); +    assert(!RHSKnown.hasConflict() && "Bits known to be one AND zero?"); +    assert(!LHSKnown.hasConflict() && "Bits known to be one AND zero?");      // Output known-0 bits are only known if clear in both the LHS & RHS.      APInt IKnownZero = RHSKnown.Zero & LHSKnown.Zero; @@ -224,8 +224,8 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,      if (SimplifyDemandedBits(I, 1, DemandedMask, RHSKnown, Depth + 1) ||          SimplifyDemandedBits(I, 0, DemandedMask, LHSKnown, Depth + 1))        return I; -    assert(!(RHSKnown.Zero & RHSKnown.One) && "Bits known to be one AND zero?"); -    assert(!(LHSKnown.Zero & LHSKnown.One) && "Bits known to be one AND zero?"); +    assert(!RHSKnown.hasConflict() && "Bits known to be one AND zero?"); +    assert(!LHSKnown.hasConflict() && "Bits known to be one AND zero?");      // Output known-0 bits are known if clear or set in both the LHS & RHS.      APInt IKnownZero = (RHSKnown.Zero & LHSKnown.Zero) | @@ -313,8 +313,8 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,      if (SimplifyDemandedBits(I, 2, DemandedMask, RHSKnown, Depth + 1) ||          SimplifyDemandedBits(I, 1, DemandedMask, LHSKnown, Depth + 1))        return I; -    assert(!(RHSKnown.Zero & RHSKnown.One) && "Bits known to be one AND zero?"); -    assert(!(LHSKnown.Zero & LHSKnown.One) && "Bits known to be one AND zero?"); +    assert(!RHSKnown.hasConflict() && "Bits known to be one AND zero?"); +    assert(!LHSKnown.hasConflict() && "Bits known to be one AND zero?");      // If the operands are constants, see if we can simplify them.      if (ShrinkDemandedConstant(I, 1, DemandedMask) || @@ -325,15 +325,19 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,      Known.One = RHSKnown.One & LHSKnown.One;      Known.Zero = RHSKnown.Zero & LHSKnown.Zero;      break; +  case Instruction::ZExt:    case Instruction::Trunc: { -    unsigned truncBf = I->getOperand(0)->getType()->getScalarSizeInBits(); -    DemandedMask = DemandedMask.zext(truncBf); -    Known = Known.zext(truncBf); -    if (SimplifyDemandedBits(I, 0, DemandedMask, Known, Depth + 1)) +    unsigned SrcBitWidth = I->getOperand(0)->getType()->getScalarSizeInBits(); + +    APInt InputDemandedMask = DemandedMask.zextOrTrunc(SrcBitWidth); +    KnownBits InputKnown(SrcBitWidth); +    if (SimplifyDemandedBits(I, 0, InputDemandedMask, InputKnown, Depth + 1))        return I; -    DemandedMask = DemandedMask.trunc(BitWidth); -    Known = Known.trunc(BitWidth); -    assert(!(Known.Zero & Known.One) && "Bits known to be one AND zero?"); +    Known = Known.zextOrTrunc(BitWidth); +    // Any top bits are known to be zero. +    if (BitWidth > SrcBitWidth) +      Known.Zero.setBitsFrom(SrcBitWidth); +    assert(!Known.hasConflict() && "Bits known to be one AND zero?");      break;    }    case Instruction::BitCast: @@ -355,56 +359,36 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,      if (SimplifyDemandedBits(I, 0, DemandedMask, Known, Depth + 1))        return I; -    assert(!(Known.Zero & Known.One) && "Bits known to be one AND zero?"); -    break; -  case Instruction::ZExt: { -    // Compute the bits in the result that are not present in the input. -    unsigned SrcBitWidth =I->getOperand(0)->getType()->getScalarSizeInBits(); - -    DemandedMask = DemandedMask.trunc(SrcBitWidth); -    Known = Known.trunc(SrcBitWidth); -    if (SimplifyDemandedBits(I, 0, DemandedMask, Known, Depth + 1)) -      return I; -    DemandedMask = DemandedMask.zext(BitWidth); -    Known = Known.zext(BitWidth); -    assert(!(Known.Zero & Known.One) && "Bits known to be one AND zero?"); -    // The top bits are known to be zero. -    Known.Zero.setBitsFrom(SrcBitWidth); +    assert(!Known.hasConflict() && "Bits known to be one AND zero?");      break; -  }    case Instruction::SExt: {      // Compute the bits in the result that are not present in the input. -    unsigned SrcBitWidth =I->getOperand(0)->getType()->getScalarSizeInBits(); +    unsigned SrcBitWidth = I->getOperand(0)->getType()->getScalarSizeInBits(); -    APInt InputDemandedBits = DemandedMask & -                              APInt::getLowBitsSet(BitWidth, SrcBitWidth); +    APInt InputDemandedBits = DemandedMask.trunc(SrcBitWidth); -    APInt NewBits(APInt::getBitsSetFrom(BitWidth, SrcBitWidth));      // If any of the sign extended bits are demanded, we know that the sign      // bit is demanded. -    if ((NewBits & DemandedMask) != 0) +    if (DemandedMask.getActiveBits() > SrcBitWidth)        InputDemandedBits.setBit(SrcBitWidth-1); -    InputDemandedBits = InputDemandedBits.trunc(SrcBitWidth); -    Known = Known.trunc(SrcBitWidth); -    if (SimplifyDemandedBits(I, 0, InputDemandedBits, Known, Depth + 1)) +    KnownBits InputKnown(SrcBitWidth); +    if (SimplifyDemandedBits(I, 0, InputDemandedBits, InputKnown, Depth + 1))        return I; -    InputDemandedBits = InputDemandedBits.zext(BitWidth); -    Known = Known.zext(BitWidth); -    assert(!(Known.Zero & Known.One) && "Bits known to be one AND zero?"); - -    // If the sign bit of the input is known set or clear, then we know the -    // top bits of the result.      // If the input sign bit is known zero, or if the NewBits are not demanded      // convert this into a zero extension. -    if (Known.Zero[SrcBitWidth-1] || (NewBits & ~DemandedMask) == NewBits) { -      // Convert to ZExt cast +    if (InputKnown.isNonNegative() || +        DemandedMask.getActiveBits() <= SrcBitWidth) { +      // Convert to ZExt cast.        CastInst *NewCast = new ZExtInst(I->getOperand(0), VTy, I->getName());        return InsertNewInstWith(NewCast, *I); -    } else if (Known.One[SrcBitWidth-1]) {    // Input sign bit known set -      Known.One |= NewBits; -    } +     } + +    // If the sign bit of the input is known set or clear, then we know the +    // top bits of the result. +    Known = InputKnown.sext(BitWidth); +    assert(!Known.hasConflict() && "Bits known to be one AND zero?");      break;    }    case Instruction::Add: @@ -467,7 +451,7 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,        if (SimplifyDemandedBits(I, 0, DemandedMaskIn, Known, Depth + 1))          return I; -      assert(!(Known.Zero & Known.One) && "Bits known to be one AND zero?"); +      assert(!Known.hasConflict() && "Bits known to be one AND zero?");        Known.Zero <<= ShiftAmt;        Known.One  <<= ShiftAmt;        // low bits known zero. @@ -491,7 +475,7 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,        if (SimplifyDemandedBits(I, 0, DemandedMaskIn, Known, Depth + 1))          return I; -      assert(!(Known.Zero & Known.One) && "Bits known to be one AND zero?"); +      assert(!Known.hasConflict() && "Bits known to be one AND zero?");        Known.Zero.lshrInPlace(ShiftAmt);        Known.One.lshrInPlace(ShiftAmt);        if (ShiftAmt) @@ -535,7 +519,7 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,        if (SimplifyDemandedBits(I, 0, DemandedMaskIn, Known, Depth + 1))          return I; -      assert(!(Known.Zero & Known.One) && "Bits known to be one AND zero?"); +      assert(!Known.hasConflict() && "Bits known to be one AND zero?");        // Compute the new bits that are at the top now.        APInt HighBits(APInt::getHighBitsSet(BitWidth, ShiftAmt));        Known.Zero.lshrInPlace(ShiftAmt); @@ -590,7 +574,7 @@ Value *InstCombiner::SimplifyDemandedUseBits(Value *V, APInt DemandedMask,          if (LHSKnown.isNegative() && LowBits.intersects(LHSKnown.One))            Known.One |= ~LowBits; -        assert(!(Known.Zero & Known.One) && "Bits known to be one AND zero?"); +        assert(!Known.hasConflict() && "Bits known to be one AND zero?");          break;        }      }  | 
