clean up this xform by using m_Trunc.
authorChris Lattner <sabre@nondot.org>
Sun, 10 Jan 2010 01:04:31 +0000 (01:04 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 10 Jan 2010 01:04:31 +0000 (01:04 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93092 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/InstCombine/InstCombineCasts.cpp

index 4bea64d9a6f8f9e948318a94af031aff160087f9..8a2e8447ab77fdc607f12dd0a1f144f55f0e76c5 100644 (file)
@@ -1035,20 +1035,17 @@ Instruction *InstCombiner::visitSExt(SExtInst &CI) {
   //   %a = shl i32 %i, 30
   //   %d = ashr i32 %a, 30
   Value *A = 0;
-  // FIXME: GENERALIZE WITH SIGN BITS.
+  // TODO: Eventually this could be subsumed by EvaluateInDifferentType.
   ConstantInt *BA = 0, *CA = 0;
-  if (match(Src, m_AShr(m_Shl(m_Value(A), m_ConstantInt(BA)),
+  if (match(Src, m_AShr(m_Shl(m_Trunc(m_Value(A)), m_ConstantInt(BA)),
                         m_ConstantInt(CA))) &&
-      BA == CA && isa<TruncInst>(A)) {
-    Value *I = cast<TruncInst>(A)->getOperand(0);
-    if (I->getType() == CI.getType()) {
-      unsigned MidSize = Src->getType()->getScalarSizeInBits();
-      unsigned SrcDstSize = CI.getType()->getScalarSizeInBits();
-      unsigned ShAmt = CA->getZExtValue()+SrcDstSize-MidSize;
-      Constant *ShAmtV = ConstantInt::get(CI.getType(), ShAmt);
-      I = Builder->CreateShl(I, ShAmtV, CI.getName());
-      return BinaryOperator::CreateAShr(I, ShAmtV);
-    }
+      BA == CA && A->getType() == CI.getType()) {
+    unsigned MidSize = Src->getType()->getScalarSizeInBits();
+    unsigned SrcDstSize = CI.getType()->getScalarSizeInBits();
+    unsigned ShAmt = CA->getZExtValue()+SrcDstSize-MidSize;
+    Constant *ShAmtV = ConstantInt::get(CI.getType(), ShAmt);
+    A = Builder->CreateShl(A, ShAmtV, CI.getName());
+    return BinaryOperator::CreateAShr(A, ShAmtV);
   }
   
   return 0;