Fix test: Transforms/LevelRaise/2003-11-28-IllegalTypeConversion.ll
authorChris Lattner <sabre@nondot.org>
Sat, 29 Nov 2003 05:31:25 +0000 (05:31 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 29 Nov 2003 05:31:25 +0000 (05:31 +0000)
Some gep generalization changes

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10252 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/ExprTypeConvert.cpp

index 970be52aa418e0a63e06a78aeb870151f2e52226..518a54892756e20033b382808776540473ca0df9 100644 (file)
@@ -257,7 +257,6 @@ bool ExpressionConvertibleToType(Value *V, const Type *Ty,
     // and we could convert this to an appropriate GEP for the new type.
     //
     if (GEP->getNumOperands() == 2 &&
-        GEP->getOperand(1)->getType() == Type::LongTy &&
         GEP->getType() == PointerType::get(Type::SByteTy)) {
 
       // Do not Check to see if our incoming pointer can be converted
@@ -285,7 +284,6 @@ bool ExpressionConvertibleToType(Value *V, const Type *Ty,
     //     getelemenptr [[int] *] * %reg115, long %reg138      ; [int]**
     //
     if (GEP->getNumOperands() == 2 && 
-        GEP->getOperand(1)->getType() == Type::LongTy &&
         PTy->getElementType()->isSized() &&
         TD.getTypeSize(PTy->getElementType()) == 
         TD.getTypeSize(GEP->getType()->getElementType())) {
@@ -466,11 +464,10 @@ Value *ConvertExpressionToType(Value *V, const Type *Ty, ValueMapCache &VMC,
     }
 
     if (Res == 0 && GEP->getNumOperands() == 2 &&
-        GEP->getOperand(1)->getType() == Type::LongTy &&
         GEP->getType() == PointerType::get(Type::SByteTy)) {
       
       // Otherwise, we can convert a GEP from one form to the other iff the
-      // current gep is of the form 'getelementptr [sbyte]*, unsigned N
+      // current gep is of the form 'getelementptr sbyte*, unsigned N
       // and we could convert this to an appropriate GEP for the new type.
       //
       const PointerType *NewSrcTy = PointerType::get(PVTy);
@@ -774,8 +771,12 @@ static bool OperandConvertibleToType(User *U, Value *V, const Type *Ty,
           TD.getTypeSize(ElTy) != TD.getTypeSize(I->getOperand(0)->getType()))
         return false;
 
-      // Can convert store if the incoming value is convertible...
-      return ExpressionConvertibleToType(I->getOperand(0), ElTy, CTMap, TD);
+      // Can convert store if the incoming value is convertible and if the
+      // result will preserve semantics...
+      const Type *Op0Ty = I->getOperand(0)->getType();
+      if (!(Op0Ty->isIntegral() ^ ElTy->isIntegral()) &&
+          !(Op0Ty->isFloatingPoint() ^ ElTy->isFloatingPoint()))
+        return ExpressionConvertibleToType(I->getOperand(0), ElTy, CTMap, TD);
     }
     return false;
   }