Changes in directory llvm/lib/Transforms/Scalar:
InstructionCombining.cpp updated: 1.710 -> 1.711 --- Log message: 1. Make sure the use of ConstantInt::getZExtValue() for getting shift amount is safe. 2. Use new method on ConstantInt instead of (? :) operator. 3. Use new method uge() on ConstantInt to simplify codes. --- Diffs of the changes: (+25 -27) InstructionCombining.cpp | 52 ++++++++++++++++++++++------------------------- 1 files changed, 25 insertions(+), 27 deletions(-) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.710 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.711 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.710 Fri Mar 30 00:45:18 2007 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Fri Mar 30 04:29:48 2007 @@ -541,8 +541,7 @@ if ((CST = dyn_cast<ConstantInt>(I->getOperand(1)))) { // The multiplier is really 1 << CST. uint32_t BitWidth = cast<IntegerType>(V->getType())->getBitWidth(); - uint32_t CSTVal = CST->getValue().getActiveBits() > 64 ? - BitWidth : CST->getZExtValue(); + uint32_t CSTVal = CST->getLimitedValue(BitWidth); CST = ConstantInt::get(APInt(BitWidth, 1).shl(CSTVal)); return I->getOperand(0); } @@ -745,7 +744,7 @@ case Instruction::Shl: // (shl X, C1) & C2 == 0 iff (X & C2 >>u C1) == 0 if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) { - uint64_t ShiftAmt = SA->getZExtValue(); + uint64_t ShiftAmt = SA->getLimitedValue(BitWidth); APInt Mask2(Mask.lshr(ShiftAmt)); ComputeMaskedBits(I->getOperand(0), Mask2, KnownZero, KnownOne, Depth+1); assert((KnownZero & KnownOne) == 0 && "Bits known to be one AND zero?"); @@ -759,7 +758,7 @@ // (ushr X, C1) & C2 == 0 iff (-1 >> C1) & C2 == 0 if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) { // Compute the new bits that are at the top now. - uint64_t ShiftAmt = SA->getZExtValue(); + uint64_t ShiftAmt = SA->getLimitedValue(BitWidth); // Unsigned shift right. APInt Mask2(Mask.shl(ShiftAmt)); @@ -776,7 +775,7 @@ // (ashr X, C1) & C2 == 0 iff (-1 >> C1) & C2 == 0 if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) { // Compute the new bits that are at the top now. - uint64_t ShiftAmt = SA->getZExtValue(); + uint64_t ShiftAmt = SA->getLimitedValue(BitWidth); // Signed shift right. APInt Mask2(Mask.shl(ShiftAmt)); @@ -1306,7 +1305,7 @@ break; case Instruction::Shl: if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) { - uint64_t ShiftAmt = SA->getZExtValue(); + uint64_t ShiftAmt = SA->getLimitedValue(BitWidth); APInt DemandedMaskIn(DemandedMask.lshr(ShiftAmt)); if (SimplifyDemandedBits(I->getOperand(0), DemandedMaskIn, RHSKnownZero, RHSKnownOne, Depth+1)) @@ -1323,7 +1322,7 @@ case Instruction::LShr: // For a logical shift right if (ConstantInt *SA = dyn_cast<ConstantInt>(I->getOperand(1))) { - unsigned ShiftAmt = SA->getZExtValue(); + uint64_t ShiftAmt = SA->getLimitedValue(BitWidth); // Unsigned shift right. APInt DemandedMaskIn(DemandedMask.shl(ShiftAmt)); @@ -2984,8 +2983,7 @@ // the anded constant includes them, clear them now! // uint32_t BitWidth = AndRHS->getType()->getBitWidth(); - uint32_t OpRHSVal = OpRHS->getValue().getActiveBits() > 64 ? - BitWidth : OpRHS->getZExtValue(); + uint32_t OpRHSVal = OpRHS->getLimitedValue(BitWidth); APInt ShlMask(APInt::getHighBitsSet(BitWidth, BitWidth-OpRHSVal)); ConstantInt *CI = ConstantInt::get(AndRHS->getValue() & ShlMask); @@ -3005,8 +3003,7 @@ // unsigned shifts, because a signed shr may bring in set bits! // uint32_t BitWidth = AndRHS->getType()->getBitWidth(); - uint32_t OpRHSVal = OpRHS->getValue().getActiveBits() > 64 ? - BitWidth : OpRHS->getZExtValue(); + uint32_t OpRHSVal = OpRHS->getLimitedValue(BitWidth); APInt ShrMask(APInt::getLowBitsSet(BitWidth, BitWidth - OpRHSVal)); ConstantInt *CI = ConstantInt::get(AndRHS->getValue() & ShrMask); @@ -3025,8 +3022,7 @@ // with an and. if (Op->hasOneUse()) { uint32_t BitWidth = AndRHS->getType()->getBitWidth(); - uint32_t OpRHSVal = OpRHS->getValue().getActiveBits() > 64 ? - BitWidth : OpRHS->getZExtValue(); + uint32_t OpRHSVal = OpRHS->getLimitedValue(BitWidth); APInt ShrMask(APInt::getLowBitsSet(BitWidth, BitWidth - OpRHSVal)); Constant *C = ConstantInt::get(AndRHS->getValue() & ShrMask); if (C == AndRHS) { // Masking out bits shifted in. @@ -3541,11 +3537,12 @@ return CollectBSwapParts(I->getOperand(0), ByteValues) || CollectBSwapParts(I->getOperand(1), ByteValues); + uint32_t BitWidth = I->getType()->getPrimitiveSizeInBits(); // If this is a shift by a constant int, and it is "24", then its operand // defines a byte. We only handle unsigned types here. if (I->isShift() && isa<ConstantInt>(I->getOperand(1))) { // Not shifting the entire input by N-1 bytes? - if (cast<ConstantInt>(I->getOperand(1))->getZExtValue() != + if (cast<ConstantInt>(I->getOperand(1))->getLimitedValue(BitWidth) != 8*(ByteValues.size()-1)) return true; @@ -3576,14 +3573,17 @@ Instruction *SI = cast<Instruction>(Shift); // Make sure that the shift amount is by a multiple of 8 and isn't too big. - if (ShiftAmt->getZExtValue() & 7 || - ShiftAmt->getZExtValue() > 8*ByteValues.size()) + if (ShiftAmt->getLimitedValue(BitWidth) & 7 || + ShiftAmt->getLimitedValue(BitWidth) > 8*ByteValues.size()) return true; // Turn 0xFF -> 0, 0xFF00 -> 1, 0xFF0000 -> 2, etc. unsigned DestByte; + if (AndAmt->getValue().getActiveBits() > 64) + return true; + uint64_t AndAmtVal = AndAmt->getZExtValue(); for (DestByte = 0; DestByte != ByteValues.size(); ++DestByte) - if (AndAmt->getZExtValue() == uint64_t(0xFF) << 8*DestByte) + if (AndAmtVal == uint64_t(0xFF) << 8*DestByte) break; // Unknown mask for bswap. if (DestByte == ByteValues.size()) return true; @@ -4868,7 +4868,7 @@ // Check that the shift amount is in range. If not, don't perform // undefined shifts. When the shift is visited it will be // simplified. - if (ShAmt->getZExtValue() >= TypeBits) + if (ShAmt->uge(TypeBits)) break; // If we are comparing against bits always shifted out, the @@ -4906,7 +4906,7 @@ // undefined shifts. When the shift is visited it will be // simplified. unsigned TypeBits = CI->getType()->getPrimitiveSizeInBits(); - if (ShAmt->getZExtValue() >= TypeBits) + if (ShAmt->uge(TypeBits)) break; // If we are comparing against bits always shifted out, the @@ -5610,7 +5610,7 @@ // shl uint X, 32 = 0 and shr ubyte Y, 9 = 0, ... just don't eliminate shr // of a signed value. // - if (Op1->getValue().getActiveBits() > 64 || Op1->getZExtValue() >= TypeBits) { + if (Op1->uge(TypeBits)) { if (I.getOpcode() != Instruction::AShr) return ReplaceInstUsesWith(I, Constant::getNullValue(Op0->getType())); else { @@ -5778,10 +5778,8 @@ if (ShiftOp && isa<ConstantInt>(ShiftOp->getOperand(1))) { ConstantInt *ShiftAmt1C = cast<ConstantInt>(ShiftOp->getOperand(1)); - uint32_t ShiftAmt1 = ShiftAmt1C->getValue().getActiveBits() > 64 ? - TypeBits : (uint32_t)ShiftAmt1C->getZExtValue(); - uint32_t ShiftAmt2 = Op1->getValue().getActiveBits() > 64 ? - TypeBits : (uint32_t)Op1->getZExtValue(); + uint32_t ShiftAmt1 = ShiftAmt1C->getLimitedValue(TypeBits); + uint32_t ShiftAmt2 = Op1->getLimitedValue(TypeBits); assert(ShiftAmt2 != 0 && "Should have been simplified earlier"); if (ShiftAmt1 == 0) return 0; // Will be simplified in the future. Value *X = ShiftOp->getOperand(0); @@ -8129,9 +8127,9 @@ } else if (Instruction *Inst =dyn_cast<Instruction>(GEP.getOperand(1))){ if (Inst->getOpcode() == Instruction::Shl && isa<ConstantInt>(Inst->getOperand(1))) { - unsigned ShAmt = - cast<ConstantInt>(Inst->getOperand(1))->getZExtValue(); - Scale = ConstantInt::get(Inst->getType(), 1ULL << ShAmt); + ConstantInt *ShAmt = cast<ConstantInt>(Inst->getOperand(1)); + uint32_t ShAmtVal = ShAmt->getLimitedValue(64); + Scale = ConstantInt::get(Inst->getType(), 1ULL << ShAmtVal); NewIdx = Inst->getOperand(0); } else if (Inst->getOpcode() == Instruction::Mul && isa<ConstantInt>(Inst->getOperand(1))) { _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits