[llvm-commits] [llvm] r92768 - /llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp

Chris Lattner sabre at nondot.org
Tue Jan 5 12:57:30 PST 2010


Author: lattner
Date: Tue Jan  5 14:57:30 2010
New Revision: 92768

URL: http://llvm.org/viewvc/llvm-project?rev=92768&view=rev
Log:
move a trunc-specific xform out of commonIntCastTransforms into visitTrunc

Modified:
    llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp

Modified: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp?rev=92768&r1=92767&r2=92768&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp (original)
+++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp Tue Jan  5 14:57:30 2010
@@ -28,19 +28,25 @@
     Offset = CI->getZExtValue();
     Scale  = 0;
     return ConstantInt::get(Type::getInt32Ty(Val->getContext()), 0);
-  } else if (BinaryOperator *I = dyn_cast<BinaryOperator>(Val)) {
+  }
+  
+  if (BinaryOperator *I = dyn_cast<BinaryOperator>(Val)) {
     if (ConstantInt *RHS = dyn_cast<ConstantInt>(I->getOperand(1))) {
       if (I->getOpcode() == Instruction::Shl) {
         // This is a value scaled by '1 << the shift amt'.
         Scale = 1U << RHS->getZExtValue();
         Offset = 0;
         return I->getOperand(0);
-      } else if (I->getOpcode() == Instruction::Mul) {
+      }
+      
+      if (I->getOpcode() == Instruction::Mul) {
         // This value is scaled by 'RHS'.
         Scale = RHS->getZExtValue();
         Offset = 0;
         return I->getOperand(0);
-      } else if (I->getOpcode() == Instruction::Add) {
+      }
+      
+      if (I->getOpcode() == Instruction::Add) {
         // We have X+C.  Check to see if we really have (X*C2)+C1, 
         // where C1 is divisible by C2.
         unsigned SubScale;
@@ -650,18 +656,6 @@
                                       ConstantInt::get(CI.getType(), 1));
     }
     break;
-
-  case Instruction::Shl: {
-    // Canonicalize trunc inside shl, if we can.
-    ConstantInt *CI = dyn_cast<ConstantInt>(Op1);
-    if (CI && DestBitSize < SrcBitSize &&
-        CI->getLimitedValue(DestBitSize) < DestBitSize) {
-      Value *Op0c = Builder->CreateTrunc(Op0, DestTy, Op0->getName());
-      Value *Op1c = Builder->CreateTrunc(Op1, DestTy, Op1->getName());
-      return BinaryOperator::CreateShl(Op0c, Op1c);
-    }
-    break;
-  }
   }
   return 0;
 }
@@ -684,7 +678,7 @@
     return new ICmpInst(ICmpInst::ICMP_NE, Src, Zero);
   }
 
-  // Optimize trunc(lshr(), c) to pull the shift through the truncate.
+  // Optimize trunc(lshr(x, c)) to pull the shift through the truncate.
   ConstantInt *ShAmtV = 0;
   Value *ShiftOp = 0;
   if (Src->hasOneUse() &&
@@ -704,6 +698,21 @@
       return BinaryOperator::CreateLShr(V1, V2);
     }
   }
+  
+  // Transform trunc(shl(X, C)) -> shl(trunc(X), C)
+  if (Src->hasOneUse() &&
+      match(Src, m_Shl(m_Value(ShiftOp), m_ConstantInt(ShAmtV)))) {
+    uint32_t ShAmt = ShAmtV->getLimitedValue(SrcBitWidth);
+    if (ShAmt >= DestBitWidth)        // All zeros.
+      return ReplaceInstUsesWith(CI, Constant::getNullValue(Ty));
+      
+    // Okay, we can shrink this.  Truncate the input, then return a new
+    // shift.
+    Value *V1 = Builder->CreateTrunc(ShiftOp, Ty, ShiftOp->getName());
+    Value *V2 = ConstantExpr::getTrunc(ShAmtV, Ty);
+    return BinaryOperator::CreateShl(V1, V2);
+  }
+
  
   return 0;
 }





More information about the llvm-commits mailing list