Revise APIs for creating constantexpr GEPs to not require the use of vectors.
[oota-llvm.git] / lib / VMCore / ConstantFold.cpp
index d35ace0af15e99b9f6bd2ec4318b018e0862db0f..41078d97f1d8cb0eaf91b54830f1172a9fac6e48 100644 (file)
@@ -23,6 +23,7 @@
 #include "llvm/Instructions.h"
 #include "llvm/DerivedTypes.h"
 #include "llvm/Function.h"
+#include "llvm/ADT/SmallVector.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/GetElementPtrTypeIterator.h"
 #include "llvm/Support/ManagedStatic.h"
@@ -51,7 +52,7 @@ static Constant *CastConstantPacked(ConstantPacked *CP,
     
     // If the src and dest elements are both integers, or both floats, we can 
     // just BitCast each element because the elements are the same size.
-    if ((SrcEltTy->isIntegral() && DstEltTy->isIntegral()) ||
+    if ((SrcEltTy->isInteger() && DstEltTy->isInteger()) ||
         (SrcEltTy->isFloatingPoint() && DstEltTy->isFloatingPoint())) {
       for (unsigned i = 0; i != SrcNumElts; ++i)
         Result.push_back(
@@ -60,7 +61,7 @@ static Constant *CastConstantPacked(ConstantPacked *CP,
     }
     
     // If this is an int-to-fp cast ..
-    if (SrcEltTy->isIntegral()) {
+    if (SrcEltTy->isInteger()) {
       // Ensure that it is int-to-fp cast
       assert(DstEltTy->isFloatingPoint());
       if (DstEltTy->getTypeID() == Type::DoubleTyID) {
@@ -81,7 +82,7 @@ static Constant *CastConstantPacked(ConstantPacked *CP,
     }
     
     // Otherwise, this is an fp-to-int cast.
-    assert(SrcEltTy->isFloatingPoint() && DstEltTy->isIntegral());
+    assert(SrcEltTy->isFloatingPoint() && DstEltTy->isInteger());
     
     if (SrcEltTy->getTypeID() == Type::DoubleTyID) {
       for (unsigned i = 0; i != SrcNumElts; ++i) {
@@ -174,11 +175,11 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
     return 0; // Can't fold.
   case Instruction::FPToUI: 
     if (const ConstantFP *FPC = dyn_cast<ConstantFP>(V))
-      return ConstantIntegral::get(DestTy,(uint64_t) FPC->getValue());
+      return ConstantInt::get(DestTy,(uint64_t) FPC->getValue());
     return 0; // Can't fold.
   case Instruction::FPToSI:
     if (const ConstantFP *FPC = dyn_cast<ConstantFP>(V))
-      return ConstantIntegral::get(DestTy,(int64_t) FPC->getValue());
+      return ConstantInt::get(DestTy,(int64_t) FPC->getValue());
     return 0; // Can't fold.
   case Instruction::IntToPtr:   //always treated as unsigned
     if (V->isNullValue())       // Is it an integral null value?
@@ -186,27 +187,27 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
     return 0;                   // Other pointer types cannot be casted
   case Instruction::PtrToInt:   // always treated as unsigned
     if (V->isNullValue())       // is it a null pointer value?
-      return ConstantIntegral::get(DestTy, 0);
+      return ConstantInt::get(DestTy, 0);
     return 0;                   // Other pointer types cannot be casted
   case Instruction::UIToFP:
-    if (const ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V))
+    if (const ConstantInt *CI = dyn_cast<ConstantInt>(V))
       return ConstantFP::get(DestTy, double(CI->getZExtValue()));
     return 0;
   case Instruction::SIToFP:
-    if (const ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V))
+    if (const ConstantInt *CI = dyn_cast<ConstantInt>(V))
       return ConstantFP::get(DestTy, double(CI->getSExtValue()));
     return 0;
   case Instruction::ZExt:
-    if (const ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V))
+    if (const ConstantInt *CI = dyn_cast<ConstantInt>(V))
       return ConstantInt::get(DestTy, CI->getZExtValue());
     return 0;
   case Instruction::SExt:
-    if (const ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V))
+    if (const ConstantInt *CI = dyn_cast<ConstantInt>(V))
       return ConstantInt::get(DestTy, CI->getSExtValue());
     return 0;
   case Instruction::Trunc:
     if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) // Can't trunc a bool
-      return ConstantIntegral::get(DestTy, CI->getZExtValue());
+      return ConstantInt::get(DestTy, CI->getZExtValue());
     return 0;
   case Instruction::BitCast:
     if (SrcTy == DestTy) 
@@ -216,7 +217,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
     // the first element.  If so, return the appropriate GEP instruction.
     if (const PointerType *PTy = dyn_cast<PointerType>(V->getType()))
       if (const PointerType *DPTy = dyn_cast<PointerType>(DestTy)) {
-        std::vector<Value*> IdxList;
+        SmallVector<Value*, 8> IdxList;
         IdxList.push_back(Constant::getNullValue(Type::Int32Ty));
         const Type *ElTy = PTy->getElementType();
         while (ElTy != DPTy->getElementType()) {
@@ -236,7 +237,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
 
         if (ElTy == DPTy->getElementType())
           return ConstantExpr::getGetElementPtr(
-              const_cast<Constant*>(V),IdxList);
+              const_cast<Constant*>(V), &IdxList[0], IdxList.size());
       }
         
     // Handle casts from one packed constant to another.  We know that the src 
@@ -279,7 +280,7 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
     // Handle integral constant input.
     if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) {
       // Integral -> Integral, must be changing sign.
-      if (DestTy->isIntegral())
+      if (DestTy->isInteger())
         return ConstantInt::get(DestTy, CI->getZExtValue());
 
       if (DestTy->isFloatingPoint()) {
@@ -295,13 +296,8 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
     // Handle ConstantFP input.
     if (const ConstantFP *FP = dyn_cast<ConstantFP>(V)) {
       // FP -> Integral.
-      if (DestTy->isIntegral()) {
-        if (DestTy == Type::Int32Ty)
-          return ConstantInt::get(DestTy, FloatToBits(FP->getValue()));
-        assert(DestTy == Type::Int64Ty && 
-               "Incorrect integer type for bitcast!");
+      if (DestTy->isInteger())
         return ConstantInt::get(DestTy, DoubleToBits(FP->getValue()));
-      }
     }
     return 0;
   default:
@@ -316,8 +312,8 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
 Constant *llvm::ConstantFoldSelectInstruction(const Constant *Cond,
                                               const Constant *V1,
                                               const Constant *V2) {
-  if (const ConstantBool *CB = dyn_cast<ConstantBool>(Cond))
-    return const_cast<Constant*>(CB->getValue() ? V1 : V2);
+  if (const ConstantInt *CB = dyn_cast<ConstantInt>(Cond))
+    return const_cast<Constant*>(CB->getZExtValue() ? V1 : V2);
 
   if (isa<UndefValue>(V1)) return const_cast<Constant*>(V2);
   if (isa<UndefValue>(V2)) return const_cast<Constant*>(V1);
@@ -552,20 +548,7 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
 
   // At this point we know neither constant is an UndefValue nor a ConstantExpr
   // so look at directly computing the value.
-  if (const ConstantBool *CB1 = dyn_cast<ConstantBool>(C1)) {
-    if (const ConstantBool *CB2 = dyn_cast<ConstantBool>(C2)) {
-      switch (Opcode) {
-        default:
-          break;
-        case Instruction::And:
-          return ConstantBool::get(CB1->getValue() & CB2->getValue());
-        case Instruction::Or:
-          return ConstantBool::get(CB1->getValue() | CB2->getValue());
-        case Instruction::Xor:
-          return ConstantBool::get(CB1->getValue() ^ CB2->getValue());
-      }
-    }
-  } else if (const ConstantInt *CI1 = dyn_cast<ConstantInt>(C1)) {
+  if (const ConstantInt *CI1 = dyn_cast<ConstantInt>(C1)) {
     if (const ConstantInt *CI2 = dyn_cast<ConstantInt>(C2)) {
       uint64_t C1Val = CI1->getZExtValue();
       uint64_t C2Val = CI2->getZExtValue();
@@ -610,16 +593,10 @@ Constant *llvm::ConstantFoldBinaryInstruction(unsigned Opcode,
       case Instruction::Xor:
         return ConstantInt::get(C1->getType(), C1Val ^ C2Val);
       case Instruction::Shl:
-        if (C2Val >= CI1->getType()->getPrimitiveSizeInBits())
-          C2Val = CI1->getType()->getPrimitiveSizeInBits() - 1;
         return ConstantInt::get(C1->getType(), C1Val << C2Val);
       case Instruction::LShr:
-        if (C2Val >= CI1->getType()->getPrimitiveSizeInBits())
-          C2Val = CI1->getType()->getPrimitiveSizeInBits() - 1;
         return ConstantInt::get(C1->getType(), C1Val >> C2Val);
       case Instruction::AShr:
-        if (C2Val >= CI1->getType()->getPrimitiveSizeInBits())
-          C2Val = CI1->getType()->getPrimitiveSizeInBits() - 1;
         return ConstantInt::get(C1->getType(), 
                                 CI1->getSExtValue() >> C2Val);
       }
@@ -744,7 +721,7 @@ static int IdxCompare(Constant *C1, Constant *C2, const Type *ElTy) {
     return 1;
 }
 
-/// evaluatFCmpeRelation - This function determines if there is anything we can
+/// evaluateFCmpRelation - This function determines if there is anything we can
 /// decide about the two constants provided.  This doesn't need to handle simple
 /// things like ConstantFP comparisons, but should instead handle ConstantExprs.
 /// If we can determine that the two constants have a particular relation to 
@@ -765,20 +742,20 @@ static FCmpInst::Predicate evaluateFCmpRelation(const Constant *V1,
   if (!isa<ConstantExpr>(V1)) {
     if (!isa<ConstantExpr>(V2)) {
       // We distilled thisUse the standard constant folder for a few cases
-      ConstantBool *R = 0;
+      ConstantInt *R = 0;
       Constant *C1 = const_cast<Constant*>(V1);
       Constant *C2 = const_cast<Constant*>(V2);
-      R = dyn_cast<ConstantBool>(
+      R = dyn_cast<ConstantInt>(
                              ConstantExpr::getFCmp(FCmpInst::FCMP_OEQ, C1, C2));
-      if (R && R->getValue()) 
+      if (R && R->getZExtValue()) 
         return FCmpInst::FCMP_OEQ;
-      R = dyn_cast<ConstantBool>(
+      R = dyn_cast<ConstantInt>(
                              ConstantExpr::getFCmp(FCmpInst::FCMP_OLT, C1, C2));
-      if (R && R->getValue()) 
+      if (R && R->getZExtValue()) 
         return FCmpInst::FCMP_OLT;
-      R = dyn_cast<ConstantBool>(
+      R = dyn_cast<ConstantInt>(
                              ConstantExpr::getFCmp(FCmpInst::FCMP_OGT, C1, C2));
-      if (R && R->getValue()) 
+      if (R && R->getZExtValue()) 
         return FCmpInst::FCMP_OGT;
 
       // Nothing more we can do
@@ -832,20 +809,20 @@ static ICmpInst::Predicate evaluateICmpRelation(const Constant *V1,
     if (!isa<GlobalValue>(V2) && !isa<ConstantExpr>(V2)) {
       // We distilled this down to a simple case, use the standard constant
       // folder.
-      ConstantBool *R = 0;
+      ConstantInt *R = 0;
       Constant *C1 = const_cast<Constant*>(V1);
       Constant *C2 = const_cast<Constant*>(V2);
       ICmpInst::Predicate pred = ICmpInst::ICMP_EQ;
-      R = dyn_cast<ConstantBool>(ConstantExpr::getICmp(pred, C1, C2));
-      if (R && R->getValue()) 
+      R = dyn_cast<ConstantInt>(ConstantExpr::getICmp(pred, C1, C2));
+      if (R && R->getZExtValue()) 
         return pred;
       pred = isSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
-      R = dyn_cast<ConstantBool>(ConstantExpr::getICmp(pred, C1, C2));
-      if (R && R->getValue())
+      R = dyn_cast<ConstantInt>(ConstantExpr::getICmp(pred, C1, C2));
+      if (R && R->getZExtValue())
         return pred;
       pred = isSigned ?  ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
-      R = dyn_cast<ConstantBool>(ConstantExpr::getICmp(pred, C1, C2));
-      if (R && R->getValue())
+      R = dyn_cast<ConstantInt>(ConstantExpr::getICmp(pred, C1, C2));
+      if (R && R->getZExtValue())
         return pred;
       
       // If we couldn't figure it out, bail.
@@ -903,7 +880,7 @@ static ICmpInst::Predicate evaluateICmpRelation(const Constant *V1,
       // If the cast is not actually changing bits, and the second operand is a
       // null pointer, do the comparison with the pre-casted value.
       if (V2->isNullValue() &&
-          (isa<PointerType>(CE1->getType()) || CE1->getType()->isIntegral())) {
+          (isa<PointerType>(CE1->getType()) || CE1->getType()->isInteger())) {
         bool sgnd = CE1->getOpcode() == Instruction::ZExt ? false :
           (CE1->getOpcode() == Instruction::SExt ? true :
            (CE1->getOpcode() == Instruction::PtrToInt ? false : isSigned));
@@ -918,7 +895,7 @@ static ICmpInst::Predicate evaluateICmpRelation(const Constant *V1,
       if (const ConstantExpr *CE2 = dyn_cast<ConstantExpr>(V2))
         if (CE2->isCast() && isa<PointerType>(CE1->getType()) &&
             CE1->getOperand(0)->getType() == CE2->getOperand(0)->getType() &&
-            CE1->getOperand(0)->getType()->isIntegral()) {
+            CE1->getOperand(0)->getType()->isInteger()) {
           bool sgnd = CE1->getOpcode() == Instruction::ZExt ? false :
             (CE1->getOpcode() == Instruction::SExt ? true :
              (CE1->getOpcode() == Instruction::PtrToInt ? false : isSigned));
@@ -1013,14 +990,14 @@ static ICmpInst::Predicate evaluateICmpRelation(const Constant *V1,
             // are non-zero then we have a difference, otherwise we are equal.
             for (; i < CE1->getNumOperands(); ++i)
               if (!CE1->getOperand(i)->isNullValue())
-                if (isa<ConstantIntegral>(CE1->getOperand(i)))
+                if (isa<ConstantInt>(CE1->getOperand(i)))
                   return isSigned ? ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
                 else
                   return ICmpInst::BAD_ICMP_PREDICATE; // Might be equal.
 
             for (; i < CE2->getNumOperands(); ++i)
               if (!CE2->getOperand(i)->isNullValue())
-                if (isa<ConstantIntegral>(CE2->getOperand(i)))
+                if (isa<ConstantInt>(CE2->getOperand(i)))
                   return isSigned ? ICmpInst::ICMP_SLT : ICmpInst::ICMP_ULT;
                 else
                   return ICmpInst::BAD_ICMP_PREDICATE; // Might be equal.
@@ -1042,64 +1019,48 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
 
   // Handle some degenerate cases first
   if (isa<UndefValue>(C1) || isa<UndefValue>(C2))
-    return UndefValue::get(Type::BoolTy);
+    return UndefValue::get(Type::Int1Ty);
 
   // icmp eq/ne(null,GV) -> false/true
   if (C1->isNullValue()) {
     if (const GlobalValue *GV = dyn_cast<GlobalValue>(C2))
       if (!GV->hasExternalWeakLinkage()) // External weak GV can be null
         if (pred == ICmpInst::ICMP_EQ)
-          return ConstantBool::getFalse();
+          return ConstantInt::getFalse();
         else if (pred == ICmpInst::ICMP_NE)
-          return ConstantBool::getTrue();
+          return ConstantInt::getTrue();
   // icmp eq/ne(GV,null) -> false/true
   } else if (C2->isNullValue()) {
     if (const GlobalValue *GV = dyn_cast<GlobalValue>(C1))
       if (!GV->hasExternalWeakLinkage()) // External weak GV can be null
         if (pred == ICmpInst::ICMP_EQ)
-          return ConstantBool::getFalse();
+          return ConstantInt::getFalse();
         else if (pred == ICmpInst::ICMP_NE)
-          return ConstantBool::getTrue();
+          return ConstantInt::getTrue();
   }
 
-  if (isa<ConstantBool>(C1) && isa<ConstantBool>(C2)) {
-    bool C1Val = cast<ConstantBool>(C1)->getValue();
-    bool C2Val = cast<ConstantBool>(C2)->getValue();
-    switch (pred) {
-    default: assert(0 && "Invalid ICmp Predicate"); return 0;
-    case ICmpInst::ICMP_EQ: return ConstantBool::get(C1Val == C2Val);
-    case ICmpInst::ICMP_NE: return ConstantBool::get(C1Val != C2Val);
-    case ICmpInst::ICMP_ULT:return ConstantBool::get(C1Val <  C2Val);
-    case ICmpInst::ICMP_UGT:return ConstantBool::get(C1Val >  C2Val);
-    case ICmpInst::ICMP_ULE:return ConstantBool::get(C1Val <= C2Val);
-    case ICmpInst::ICMP_UGE:return ConstantBool::get(C1Val >= C2Val);
-    case ICmpInst::ICMP_SLT:return ConstantBool::get(C1Val <  C2Val);
-    case ICmpInst::ICMP_SGT:return ConstantBool::get(C1Val >  C2Val);
-    case ICmpInst::ICMP_SLE:return ConstantBool::get(C1Val <= C2Val);
-    case ICmpInst::ICMP_SGE:return ConstantBool::get(C1Val >= C2Val);
-    }
-  } else if (isa<ConstantInt>(C1) && isa<ConstantInt>(C2)) {
+  if (isa<ConstantInt>(C1) && isa<ConstantInt>(C2)) {
     if (ICmpInst::isSignedPredicate(ICmpInst::Predicate(pred))) {
       int64_t V1 = cast<ConstantInt>(C1)->getSExtValue();
       int64_t V2 = cast<ConstantInt>(C2)->getSExtValue();
       switch (pred) {
       default: assert(0 && "Invalid ICmp Predicate"); return 0;
-      case ICmpInst::ICMP_SLT:return ConstantBool::get(V1 <  V2);
-      case ICmpInst::ICMP_SGT:return ConstantBool::get(V1 >  V2);
-      case ICmpInst::ICMP_SLE:return ConstantBool::get(V1 <= V2);
-      case ICmpInst::ICMP_SGE:return ConstantBool::get(V1 >= V2);
+      case ICmpInst::ICMP_SLT:return ConstantInt::get(Type::Int1Ty, V1 <  V2);
+      case ICmpInst::ICMP_SGT:return ConstantInt::get(Type::Int1Ty, V1 >  V2);
+      case ICmpInst::ICMP_SLE:return ConstantInt::get(Type::Int1Ty, V1 <= V2);
+      case ICmpInst::ICMP_SGE:return ConstantInt::get(Type::Int1Ty, V1 >= V2);
       }
     } else {
       uint64_t V1 = cast<ConstantInt>(C1)->getZExtValue();
       uint64_t V2 = cast<ConstantInt>(C2)->getZExtValue();
       switch (pred) {
       default: assert(0 && "Invalid ICmp Predicate"); return 0;
-      case ICmpInst::ICMP_EQ: return ConstantBool::get(V1 == V2);
-      case ICmpInst::ICMP_NE: return ConstantBool::get(V1 != V2);
-      case ICmpInst::ICMP_ULT:return ConstantBool::get(V1 <  V2);
-      case ICmpInst::ICMP_UGT:return ConstantBool::get(V1 >  V2);
-      case ICmpInst::ICMP_ULE:return ConstantBool::get(V1 <= V2);
-      case ICmpInst::ICMP_UGE:return ConstantBool::get(V1 >= V2);
+      case ICmpInst::ICMP_EQ: return ConstantInt::get(Type::Int1Ty, V1 == V2);
+      case ICmpInst::ICMP_NE: return ConstantInt::get(Type::Int1Ty, V1 != V2);
+      case ICmpInst::ICMP_ULT:return ConstantInt::get(Type::Int1Ty, V1 <  V2);
+      case ICmpInst::ICMP_UGT:return ConstantInt::get(Type::Int1Ty, V1 >  V2);
+      case ICmpInst::ICMP_ULE:return ConstantInt::get(Type::Int1Ty, V1 <= V2);
+      case ICmpInst::ICMP_UGE:return ConstantInt::get(Type::Int1Ty, V1 >= V2);
       }
     }
   } else if (isa<ConstantFP>(C1) && isa<ConstantFP>(C2)) {
@@ -1107,22 +1068,48 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
     double C2Val = cast<ConstantFP>(C2)->getValue();
     switch (pred) {
     default: assert(0 && "Invalid FCmp Predicate"); return 0;
-    case FCmpInst::FCMP_FALSE: return ConstantBool::getFalse();
-    case FCmpInst::FCMP_TRUE:  return ConstantBool::getTrue();
+    case FCmpInst::FCMP_FALSE: return ConstantInt::getFalse();
+    case FCmpInst::FCMP_TRUE:  return ConstantInt::getTrue();
     case FCmpInst::FCMP_UNO:
-    case FCmpInst::FCMP_ORD:   break; // Can't fold these
+      return ConstantInt::get(Type::Int1Ty, C1Val != C1Val || C2Val != C2Val);
+    case FCmpInst::FCMP_ORD:
+      return ConstantInt::get(Type::Int1Ty, C1Val == C1Val && C2Val == C2Val);
     case FCmpInst::FCMP_UEQ:
-    case FCmpInst::FCMP_OEQ:   return ConstantBool::get(C1Val == C2Val);
-    case FCmpInst::FCMP_ONE:
-    case FCmpInst::FCMP_UNE:   return ConstantBool::get(C1Val != C2Val);
-    case FCmpInst::FCMP_OLT: 
-    case FCmpInst::FCMP_ULT:   return ConstantBool::get(C1Val < C2Val);
+      if (C1Val != C1Val || C2Val != C2Val)
+        return ConstantInt::getTrue();
+      /* FALL THROUGH */
+    case FCmpInst::FCMP_OEQ:   
+      return ConstantInt::get(Type::Int1Ty, C1Val == C2Val);
+    case FCmpInst::FCMP_UNE:
+      if (C1Val != C1Val || C2Val != C2Val)
+        return ConstantInt::getTrue();
+      /* FALL THROUGH */
+    case FCmpInst::FCMP_ONE:   
+      return ConstantInt::get(Type::Int1Ty, C1Val != C2Val);
+    case FCmpInst::FCMP_ULT: 
+      if (C1Val != C1Val || C2Val != C2Val)
+        return ConstantInt::getTrue();
+      /* FALL THROUGH */
+    case FCmpInst::FCMP_OLT:   
+      return ConstantInt::get(Type::Int1Ty, C1Val < C2Val);
     case FCmpInst::FCMP_UGT:
-    case FCmpInst::FCMP_OGT:   return ConstantBool::get(C1Val > C2Val);
-    case FCmpInst::FCMP_OLE:
-    case FCmpInst::FCMP_ULE:   return ConstantBool::get(C1Val <= C2Val);
+      if (C1Val != C1Val || C2Val != C2Val)
+        return ConstantInt::getTrue();
+      /* FALL THROUGH */
+    case FCmpInst::FCMP_OGT:
+      return ConstantInt::get(Type::Int1Ty, C1Val > C2Val);
+    case FCmpInst::FCMP_ULE:
+      if (C1Val != C1Val || C2Val != C2Val)
+        return ConstantInt::getTrue();
+      /* FALL THROUGH */
+    case FCmpInst::FCMP_OLE: 
+      return ConstantInt::get(Type::Int1Ty, C1Val <= C2Val);
     case FCmpInst::FCMP_UGE:
-    case FCmpInst::FCMP_OGE:   return ConstantBool::get(C1Val >= C2Val);
+      if (C1Val != C1Val || C2Val != C2Val)
+        return ConstantInt::getTrue();
+      /* FALL THROUGH */
+    case FCmpInst::FCMP_OGE: 
+      return ConstantInt::get(Type::Int1Ty, C1Val >= C2Val);
     }
   } else if (const ConstantPacked *CP1 = dyn_cast<ConstantPacked>(C1)) {
     if (const ConstantPacked *CP2 = dyn_cast<ConstantPacked>(C2)) {
@@ -1131,7 +1118,7 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
           Constant *C= ConstantExpr::getFCmp(FCmpInst::FCMP_OEQ,
               const_cast<Constant*>(CP1->getOperand(i)),
               const_cast<Constant*>(CP2->getOperand(i)));
-          if (ConstantBool *CB = dyn_cast<ConstantBool>(C))
+          if (ConstantInt *CB = dyn_cast<ConstantInt>(C))
             return CB;
         }
         // Otherwise, could not decide from any element pairs.
@@ -1141,7 +1128,7 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
           Constant *C = ConstantExpr::getICmp(ICmpInst::ICMP_EQ,
               const_cast<Constant*>(CP1->getOperand(i)),
               const_cast<Constant*>(CP2->getOperand(i)));
-          if (ConstantBool *CB = dyn_cast<ConstantBool>(C))
+          if (ConstantInt *CB = dyn_cast<ConstantInt>(C))
             return CB;
         }
         // Otherwise, could not decide from any element pairs.
@@ -1166,40 +1153,40 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
     case FCmpInst::BAD_FCMP_PREDICATE:
       break; // Couldn't determine anything about these constants.
     case FCmpInst::FCMP_OEQ: // We know that C1 == C2
-      return ConstantBool::get(
+      return ConstantInt::get(Type::Int1Ty,
           pred == FCmpInst::FCMP_UEQ || pred == FCmpInst::FCMP_OEQ ||
           pred == FCmpInst::FCMP_ULE || pred == FCmpInst::FCMP_OLE ||
           pred == FCmpInst::FCMP_UGE || pred == FCmpInst::FCMP_OGE);
     case FCmpInst::FCMP_OLT: // We know that C1 < C2
-      return ConstantBool::get(
+      return ConstantInt::get(Type::Int1Ty,
           pred == FCmpInst::FCMP_UNE || pred == FCmpInst::FCMP_ONE ||
           pred == FCmpInst::FCMP_ULT || pred == FCmpInst::FCMP_OLT ||
           pred == FCmpInst::FCMP_ULE || pred == FCmpInst::FCMP_OLE);
     case FCmpInst::FCMP_OGT: // We know that C1 > C2
-      return ConstantBool::get(
+      return ConstantInt::get(Type::Int1Ty,
           pred == FCmpInst::FCMP_UNE || pred == FCmpInst::FCMP_ONE ||
           pred == FCmpInst::FCMP_UGT || pred == FCmpInst::FCMP_OGT ||
           pred == FCmpInst::FCMP_UGE || pred == FCmpInst::FCMP_OGE);
     case FCmpInst::FCMP_OLE: // We know that C1 <= C2
       // We can only partially decide this relation.
       if (pred == FCmpInst::FCMP_UGT || pred == FCmpInst::FCMP_OGT) 
-        return ConstantBool::getFalse();
+        return ConstantInt::getFalse();
       if (pred == FCmpInst::FCMP_ULT || pred == FCmpInst::FCMP_OLT) 
-        return ConstantBool::getTrue();
+        return ConstantInt::getTrue();
       break;
     case FCmpInst::FCMP_OGE: // We known that C1 >= C2
       // We can only partially decide this relation.
       if (pred == FCmpInst::FCMP_ULT || pred == FCmpInst::FCMP_OLT) 
-        return ConstantBool::getFalse();
+        return ConstantInt::getFalse();
       if (pred == FCmpInst::FCMP_UGT || pred == FCmpInst::FCMP_OGT) 
-        return ConstantBool::getTrue();
+        return ConstantInt::getTrue();
       break;
     case ICmpInst::ICMP_NE: // We know that C1 != C2
       // We can only partially decide this relation.
       if (pred == FCmpInst::FCMP_OEQ || pred == FCmpInst::FCMP_UEQ) 
-        return ConstantBool::getFalse();
+        return ConstantInt::getFalse();
       if (pred == FCmpInst::FCMP_ONE || pred == FCmpInst::FCMP_UNE) 
-        return ConstantBool::getTrue();
+        return ConstantInt::getTrue();
       break;
     }
   } else {
@@ -1211,61 +1198,66 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
     case ICmpInst::ICMP_EQ:   // We know the constants are equal!
       // If we know the constants are equal, we can decide the result of this
       // computation precisely.
-      return ConstantBool::get(pred == ICmpInst::ICMP_EQ  ||
-                               pred == ICmpInst::ICMP_ULE ||
-                               pred == ICmpInst::ICMP_SLE ||
-                               pred == ICmpInst::ICMP_UGE ||
-                               pred == ICmpInst::ICMP_SGE);
+      return ConstantInt::get(Type::Int1Ty, 
+                              pred == ICmpInst::ICMP_EQ  ||
+                              pred == ICmpInst::ICMP_ULE ||
+                              pred == ICmpInst::ICMP_SLE ||
+                              pred == ICmpInst::ICMP_UGE ||
+                              pred == ICmpInst::ICMP_SGE);
     case ICmpInst::ICMP_ULT:
       // If we know that C1 < C2, we can decide the result of this computation
       // precisely.
-      return ConstantBool::get(pred == ICmpInst::ICMP_ULT ||
-                               pred == ICmpInst::ICMP_NE  ||
-                               pred == ICmpInst::ICMP_ULE);
+      return ConstantInt::get(Type::Int1Ty, 
+                              pred == ICmpInst::ICMP_ULT ||
+                              pred == ICmpInst::ICMP_NE  ||
+                              pred == ICmpInst::ICMP_ULE);
     case ICmpInst::ICMP_SLT:
       // If we know that C1 < C2, we can decide the result of this computation
       // precisely.
-      return ConstantBool::get(pred == ICmpInst::ICMP_SLT ||
-                               pred == ICmpInst::ICMP_NE  ||
-                               pred == ICmpInst::ICMP_SLE);
+      return ConstantInt::get(Type::Int1Ty,
+                              pred == ICmpInst::ICMP_SLT ||
+                              pred == ICmpInst::ICMP_NE  ||
+                              pred == ICmpInst::ICMP_SLE);
     case ICmpInst::ICMP_UGT:
       // If we know that C1 > C2, we can decide the result of this computation
       // precisely.
-      return ConstantBool::get(pred == ICmpInst::ICMP_UGT ||
-                               pred == ICmpInst::ICMP_NE  ||
-                               pred == ICmpInst::ICMP_UGE);
+      return ConstantInt::get(Type::Int1Ty, 
+                              pred == ICmpInst::ICMP_UGT ||
+                              pred == ICmpInst::ICMP_NE  ||
+                              pred == ICmpInst::ICMP_UGE);
     case ICmpInst::ICMP_SGT:
       // If we know that C1 > C2, we can decide the result of this computation
       // precisely.
-      return ConstantBool::get(pred == ICmpInst::ICMP_SGT ||
-                               pred == ICmpInst::ICMP_NE  ||
-                               pred == ICmpInst::ICMP_SGE);
+      return ConstantInt::get(Type::Int1Ty, 
+                              pred == ICmpInst::ICMP_SGT ||
+                              pred == ICmpInst::ICMP_NE  ||
+                              pred == ICmpInst::ICMP_SGE);
     case ICmpInst::ICMP_ULE:
       // If we know that C1 <= C2, we can only partially decide this relation.
-      if (pred == ICmpInst::ICMP_UGT) return ConstantBool::getFalse();
-      if (pred == ICmpInst::ICMP_ULT) return ConstantBool::getTrue();
+      if (pred == ICmpInst::ICMP_UGT) return ConstantInt::getFalse();
+      if (pred == ICmpInst::ICMP_ULT) return ConstantInt::getTrue();
       break;
     case ICmpInst::ICMP_SLE:
       // If we know that C1 <= C2, we can only partially decide this relation.
-      if (pred == ICmpInst::ICMP_SGT) return ConstantBool::getFalse();
-      if (pred == ICmpInst::ICMP_SLT) return ConstantBool::getTrue();
+      if (pred == ICmpInst::ICMP_SGT) return ConstantInt::getFalse();
+      if (pred == ICmpInst::ICMP_SLT) return ConstantInt::getTrue();
       break;
 
     case ICmpInst::ICMP_UGE:
       // If we know that C1 >= C2, we can only partially decide this relation.
-      if (pred == ICmpInst::ICMP_ULT) return ConstantBool::getFalse();
-      if (pred == ICmpInst::ICMP_UGT) return ConstantBool::getTrue();
+      if (pred == ICmpInst::ICMP_ULT) return ConstantInt::getFalse();
+      if (pred == ICmpInst::ICMP_UGT) return ConstantInt::getTrue();
       break;
     case ICmpInst::ICMP_SGE:
       // If we know that C1 >= C2, we can only partially decide this relation.
-      if (pred == ICmpInst::ICMP_SLT) return ConstantBool::getFalse();
-      if (pred == ICmpInst::ICMP_SGT) return ConstantBool::getTrue();
+      if (pred == ICmpInst::ICMP_SLT) return ConstantInt::getFalse();
+      if (pred == ICmpInst::ICMP_SGT) return ConstantInt::getTrue();
       break;
 
     case ICmpInst::ICMP_NE:
       // If we know that C1 != C2, we can only partially decide this relation.
-      if (pred == ICmpInst::ICMP_EQ) return ConstantBool::getFalse();
-      if (pred == ICmpInst::ICMP_NE) return ConstantBool::getTrue();
+      if (pred == ICmpInst::ICMP_EQ) return ConstantInt::getFalse();
+      if (pred == ICmpInst::ICMP_NE) return ConstantInt::getTrue();
       break;
     }
 
@@ -1299,48 +1291,35 @@ Constant *llvm::ConstantFoldCompareInstruction(unsigned short pred,
 }
 
 Constant *llvm::ConstantFoldGetElementPtr(const Constant *C,
-                                          const std::vector<Value*> &IdxList) {
-  if (IdxList.size() == 0 ||
-      (IdxList.size() == 1 && cast<Constant>(IdxList[0])->isNullValue()))
+                                          Constant* const *Idxs, 
+                                          unsigned NumIdx) {
+  if (NumIdx == 0 ||
+      (NumIdx == 1 && Idxs[0]->isNullValue()))
     return const_cast<Constant*>(C);
 
   if (isa<UndefValue>(C)) {
-    const Type *Ty = GetElementPtrInst::getIndexedType(C->getType(), IdxList,
+    const Type *Ty = GetElementPtrInst::getIndexedType(C->getType(),
+                                                       (Value**)Idxs, NumIdx,
                                                        true);
     assert(Ty != 0 && "Invalid indices for GEP!");
     return UndefValue::get(PointerType::get(Ty));
   }
 
-  Constant *Idx0 = cast<Constant>(IdxList[0]);
+  Constant *Idx0 = Idxs[0];
   if (C->isNullValue()) {
     bool isNull = true;
-    for (unsigned i = 0, e = IdxList.size(); i != e; ++i)
-      if (!cast<Constant>(IdxList[i])->isNullValue()) {
+    for (unsigned i = 0, e = NumIdx; i != e; ++i)
+      if (!Idxs[i]->isNullValue()) {
         isNull = false;
         break;
       }
     if (isNull) {
-      const Type *Ty = GetElementPtrInst::getIndexedType(C->getType(), IdxList,
+      const Type *Ty = GetElementPtrInst::getIndexedType(C->getType(),
+                                                         (Value**)Idxs, NumIdx,
                                                          true);
       assert(Ty != 0 && "Invalid indices for GEP!");
       return ConstantPointerNull::get(PointerType::get(Ty));
     }
-
-    if (IdxList.size() == 1) {
-      const Type *ElTy = cast<PointerType>(C->getType())->getElementType();
-      if (uint32_t ElSize = ElTy->getPrimitiveSize()) {
-        // gep null, C is equal to C*sizeof(nullty).  If nullty is a known llvm
-        // type, we can statically fold this.
-        Constant *R = ConstantInt::get(Type::Int32Ty, ElSize);
-        // We know R is unsigned, Idx0 is signed because it must be an index
-        // through a sequential type (gep pointer operand) which is always
-        // signed.
-        R = ConstantExpr::getSExtOrBitCast(R, Idx0->getType());
-        R = ConstantExpr::getMul(R, Idx0); // signed multiply
-        // R is a signed integer, C is the GEP pointer so -> IntToPtr
-        return ConstantExpr::getIntToPtr(R, C->getType());
-      }
-    }
   }
 
   if (ConstantExpr *CE = dyn_cast<ConstantExpr>(const_cast<Constant*>(C))) {
@@ -1355,8 +1334,8 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C,
         LastTy = *I;
 
       if ((LastTy && isa<ArrayType>(LastTy)) || Idx0->isNullValue()) {
-        std::vector<Value*> NewIndices;
-        NewIndices.reserve(IdxList.size() + CE->getNumOperands());
+        SmallVector<Value*, 16> NewIndices;
+        NewIndices.reserve(NumIdx + CE->getNumOperands());
         for (unsigned i = 1, e = CE->getNumOperands()-1; i != e; ++i)
           NewIndices.push_back(CE->getOperand(i));
 
@@ -1378,8 +1357,9 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C,
         }
 
         NewIndices.push_back(Combined);
-        NewIndices.insert(NewIndices.end(), IdxList.begin()+1, IdxList.end());
-        return ConstantExpr::getGetElementPtr(CE->getOperand(0), NewIndices);
+        NewIndices.insert(NewIndices.end(), Idxs+1, Idxs+NumIdx);
+        return ConstantExpr::getGetElementPtr(CE->getOperand(0), &NewIndices[0],
+                                              NewIndices.size());
       }
     }
 
@@ -1388,7 +1368,7 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C,
     //                        long 0, long 0)
     // To: int* getelementptr ([3 x int]* %X, long 0, long 0)
     //
-    if (CE->isCast() && IdxList.size() > 1 && Idx0->isNullValue())
+    if (CE->isCast() && NumIdx > 1 && Idx0->isNullValue())
       if (const PointerType *SPT =
           dyn_cast<PointerType>(CE->getOperand(0)->getType()))
         if (const ArrayType *SAT = dyn_cast<ArrayType>(SPT->getElementType()))
@@ -1396,7 +1376,7 @@ Constant *llvm::ConstantFoldGetElementPtr(const Constant *C,
         dyn_cast<ArrayType>(cast<PointerType>(C->getType())->getElementType()))
             if (CAT->getElementType() == SAT->getElementType())
               return ConstantExpr::getGetElementPtr(
-                      (Constant*)CE->getOperand(0), IdxList);
+                      (Constant*)CE->getOperand(0), Idxs, NumIdx);
   }
   return 0;
 }