1. Make more use of getLowBitsSet/getHighBitsSet.

2. Make the APInt value do the zext/trunc stuff instead of using
   ConstantExpr::getZExt().


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35422 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Zhou Sheng 2007-03-28 09:19:01 +00:00
parent 197d19d11c
commit e82fca09bf

View File

@ -6304,8 +6304,7 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) {
case Instruction::ZExt: { case Instruction::ZExt: {
// We need to emit an AND to clear the high bits. // We need to emit an AND to clear the high bits.
assert(SrcBitSize < DestBitSize && "Not a zext?"); assert(SrcBitSize < DestBitSize && "Not a zext?");
Constant *C = ConstantInt::get(APInt::getAllOnesValue(SrcBitSize)); Constant *C = ConstantInt::get(APInt::getLowBitsSet(DestBitSize, SrcBitSize));
C = ConstantExpr::getZExt(C, DestTy);
return BinaryOperator::createAnd(Res, C); return BinaryOperator::createAnd(Res, C);
} }
case Instruction::SExt: case Instruction::SExt:
@ -6487,8 +6486,7 @@ Instruction *InstCombiner::visitTrunc(CastInst &CI) {
unsigned ShAmt = ShAmtV->getZExtValue(); unsigned ShAmt = ShAmtV->getZExtValue();
// Get a mask for the bits shifting in. // Get a mask for the bits shifting in.
APInt Mask(APInt::getAllOnesValue(SrcBitWidth).lshr( APInt Mask(APInt::getLowBitsSet(SrcBitWidth, ShAmt).shl(DestBitWidth));
SrcBitWidth-ShAmt).shl(DestBitWidth));
Value* SrcIOp0 = SrcI->getOperand(0); Value* SrcIOp0 = SrcI->getOperand(0);
if (SrcI->hasOneUse() && MaskedValueIsZero(SrcIOp0, Mask)) { if (SrcI->hasOneUse() && MaskedValueIsZero(SrcIOp0, Mask)) {
if (ShAmt >= DestBitWidth) // All zeros. if (ShAmt >= DestBitWidth) // All zeros.
@ -6547,7 +6545,7 @@ Instruction *InstCombiner::visitZExt(CastInst &CI) {
// If we're actually extending zero bits and the trunc is a no-op // If we're actually extending zero bits and the trunc is a no-op
if (MidSize < DstSize && SrcSize == DstSize) { if (MidSize < DstSize && SrcSize == DstSize) {
// Replace both of the casts with an And of the type mask. // Replace both of the casts with an And of the type mask.
APInt AndValue(APInt::getAllOnesValue(MidSize).zext(SrcSize)); APInt AndValue(APInt::getLowBitsSet(SrcSize, MidSize));
Constant *AndConst = ConstantInt::get(AndValue); Constant *AndConst = ConstantInt::get(AndValue);
Instruction *And = Instruction *And =
BinaryOperator::createAnd(CSrc->getOperand(0), AndConst); BinaryOperator::createAnd(CSrc->getOperand(0), AndConst);