change the preferred canonical form for a sign extension to be
lshr+ashr instead of trunc+sext.  We want to avoid type 
conversions whenever possible, it is easier to codegen expressions
without truncates and extensions.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93107 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/InstCombine/InstCombineCasts.cpp b/lib/Transforms/InstCombine/InstCombineCasts.cpp
index 01c4f8c..b0d017e 100644
--- a/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ b/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -680,6 +680,8 @@
   // types and if the sizes are just right we can convert this into a logical
   // 'and' which will be much cheaper than the pair of casts.
   if (TruncInst *CSrc = dyn_cast<TruncInst>(Src)) {   // A->B->C cast
+    // TODO: Subsume this into EvaluateInDifferentType.
+    
     // Get the sizes of the types involved.  We know that the intermediate type
     // will be smaller than A or C, but don't know the relation between A and C.
     Value *A = CSrc->getOperand(0);
@@ -707,7 +709,7 @@
       APInt AndValue(APInt::getLowBitsSet(DstSize, MidSize));
       return BinaryOperator::CreateAnd(Trunc, 
                                        ConstantInt::get(Trunc->getType(),
-                                                               AndValue));
+                                                        AndValue));
     }
   }
 
@@ -927,6 +929,7 @@
     // always do the transformation.
     if (NumCastsRemoved >= 2 ||
         NumBitsSExt > DestBitSize-SrcBitSize) {
+      
       // Okay, we can transform this!  Insert the new expression now.
       DEBUG(dbgs() << "ICE: EvaluateInDifferentType converting expression type"
             " to avoid sign extend: " << CI);
@@ -939,8 +942,10 @@
           ComputeNumSignBits(Res) > DestBitSize - SrcBitSize)
         return ReplaceInstUsesWith(CI, Res);
       
-      // We need to emit a cast to truncate, then a cast to sext.
-      return new SExtInst(Builder->CreateTrunc(Res, Src->getType()), DestTy);
+      // We need to emit a shl + ashr to do the sign extend.
+      Value *ShAmt = ConstantInt::get(DestTy, DestBitSize-SrcBitSize);
+      return BinaryOperator::CreateAShr(Builder->CreateShl(Res, ShAmt, "sext"),
+                                        ShAmt);
     }
   }