Give the longer name to the instruction that will probably be eliminated later
[oota-llvm.git] / lib / Transforms / ExprTypeConvert.cpp
index 9f75198e1ca1bd3b659e15ebdb7973ea8bd9ede7..a1dd7ad9e9cfb2ef3531166dfcc62cdf86e74f07 100644 (file)
@@ -11,7 +11,6 @@
 #include "llvm/iPHINode.h"
 #include "llvm/iMemory.h"
 #include "llvm/ConstantHandling.h"
-#include "llvm/Transforms/Scalar/DCE.h"
 #include "llvm/Analysis/Expressions.h"
 #include "Support/STLExtras.h"
 #include <algorithm>
@@ -62,7 +61,7 @@ static bool MallocConvertableToType(MallocInst *MI, const Type *Ty,
   analysis::ExprType Expr = analysis::ClassifyExpression(MI->getArraySize());
 
   // Get information about the base datatype being allocated, before & after
-  unsigned ReqTypeSize = TD.getTypeSize(Ty);
+  int ReqTypeSize = TD.getTypeSize(Ty);
   unsigned OldTypeSize = TD.getTypeSize(MI->getType()->getElementType());
 
   // Must have a scale or offset to analyze it...
@@ -71,15 +70,11 @@ static bool MallocConvertableToType(MallocInst *MI, const Type *Ty,
   // Get the offset and scale of the allocation...
   int OffsetVal = Expr.Offset ? getConstantValue(Expr.Offset) : 0;
   int ScaleVal = Expr.Scale ? getConstantValue(Expr.Scale) : (Expr.Var ? 1 : 0);
-  if (ScaleVal < 0 || OffsetVal < 0) {
-    cerr << "malloc of a negative number???\n";
-    return false;
-  }
 
   // The old type might not be of unit size, take old size into consideration
   // here...
-  unsigned Offset = (unsigned)OffsetVal * OldTypeSize;
-  unsigned Scale  = (unsigned)ScaleVal  * OldTypeSize;
+  int Offset = OffsetVal * OldTypeSize;
+  int Scale  = ScaleVal  * OldTypeSize;
   
   // In order to be successful, both the scale and the offset must be a multiple
   // of the requested data type's size.
@@ -620,6 +615,15 @@ static bool OperandConvertableToType(User *U, Value *V, const Type *Ty,
         I->getType() == I->getOperand(0)->getType())
       return false;
 
+    // Do not allow a 'cast ushort %V to uint' to have it's first operand be
+    // converted to a 'short' type.  Doing so changes the way sign promotion
+    // happens, and breaks things.  Only allow the cast to take place if the
+    // signedness doesn't change... or if the current cast is not a lossy
+    // conversion.
+    //
+    if (!I->getType()->isLosslesslyConvertableTo(I->getOperand(0)->getType()) &&
+        I->getOperand(0)->getType()->isSigned() != Ty->isSigned())
+      return false;
 
 #if 1
     // We also do not allow conversion of a cast that casts from a ptr to array