1. Make more use of getLowBitsSet/getHighBitsSet.
authorZhou Sheng <zhousheng00@gmail.com>
Wed, 28 Mar 2007 09:19:01 +0000 (09:19 +0000)
committerZhou Sheng <zhousheng00@gmail.com>
Wed, 28 Mar 2007 09:19:01 +0000 (09:19 +0000)
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

lib/Transforms/Scalar/InstructionCombining.cpp

index 1c39f050f5013603b60ecc3d653300433035c3a8..29640e4b3987387d2ef9721aaa4dabf5ede8621d 100644 (file)
@@ -6304,8 +6304,7 @@ Instruction *InstCombiner::commonIntCastTransforms(CastInst &CI) {
       case Instruction::ZExt: {
         // We need to emit an AND to clear the high bits.
         assert(SrcBitSize < DestBitSize && "Not a zext?");
-        Constant *C = ConstantInt::get(APInt::getAllOnesValue(SrcBitSize));
-        C = ConstantExpr::getZExt(C, DestTy);
+        Constant *C = ConstantInt::get(APInt::getLowBitsSet(DestBitSize, SrcBitSize));
         return BinaryOperator::createAnd(Res, C);
       }
       case Instruction::SExt:
@@ -6487,8 +6486,7 @@ Instruction *InstCombiner::visitTrunc(CastInst &CI) {
         unsigned ShAmt = ShAmtV->getZExtValue();
         
         // Get a mask for the bits shifting in.
-        APInt Mask(APInt::getAllOnesValue(SrcBitWidth).lshr(
-                     SrcBitWidth-ShAmt).shl(DestBitWidth));
+        APInt Mask(APInt::getLowBitsSet(SrcBitWidth, ShAmt).shl(DestBitWidth));
         Value* SrcIOp0 = SrcI->getOperand(0);
         if (SrcI->hasOneUse() && MaskedValueIsZero(SrcIOp0, Mask)) {
           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 (MidSize < DstSize && SrcSize == DstSize) {
         // 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);
         Instruction *And = 
           BinaryOperator::createAnd(CSrc->getOperand(0), AndConst);