* Implement more powerful expr analysis of cast instructions
authorChris Lattner <sabre@nondot.org>
Mon, 26 Nov 2001 16:53:50 +0000 (16:53 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 26 Nov 2001 16:53:50 +0000 (16:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1335 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/Expressions.cpp

index ed04f1d818a93f02635ddc82872a4eb38486cd2a..dd9221249699274eeee14c46cd7fc02481faab57 100644 (file)
@@ -284,21 +284,30 @@ ExprType analysis::ClassifyExpression(Value *Expr) {
 
   case Instruction::Cast: {
     ExprType Src(ClassifyExpression(I->getOperand(0)));
-    if (Src.ExprTy != ExprType::Constant)
-      return I;
-    const ConstPoolInt *Offs = Src.Offset;
-    if (Offs == 0) return ExprType();
-
     const Type *DestTy = I->getType();
     if (DestTy->isPointerType())
       DestTy = Type::ULongTy;  // Pointer types are represented as ulong
 
-    assert(DestTy->isIntegral() && "Can only handle integral types!");
-
-    const ConstPoolVal *CPV =ConstRules::get(*Offs)->castTo(Offs, DestTy);
-    if (!CPV) return I;
-    assert(CPV->getType()->isIntegral() && "Must have an integral type!");
-    return cast<ConstPoolInt>(CPV);
+    /*
+    if (!Src.getExprType(0)->isLosslesslyConvertableTo(DestTy)) {
+      if (Src.ExprTy != ExprType::Constant)
+        return I;  // Converting cast, and not a constant value...
+    }
+    */
+
+    const ConstPoolInt *Offset = Src.Offset;
+    const ConstPoolInt *Scale  = Src.Scale;
+    if (Offset) {
+      const ConstPoolVal *CPV = ConstantFoldCastInstruction(Offset, DestTy);
+      if (!CPV) return I;
+      Offset = cast<ConstPoolInt>(CPV);
+    }
+    if (Scale) {
+      const ConstPoolVal *CPV = ConstantFoldCastInstruction(Scale, DestTy);
+      if (!CPV) return I;
+      Scale = cast<ConstPoolInt>(CPV);
+    }
+    return ExprType(Scale, Src.Var, Offset);
   } // end case Instruction::Cast
     // TODO: Handle SUB, SHR?