Clean up ConstantFoldCastInstruction.
authorReid Spencer <rspencer@reidspencer.com>
Tue, 19 Dec 2006 07:41:40 +0000 (07:41 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Tue, 19 Dec 2006 07:41:40 +0000 (07:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32672 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/ConstantFold.cpp

index 29910b7bc90bc4fec43bce7816f6299556fa2bb2..8af5b89522054ad248bd46ac477af2d5a0eae1db 100644 (file)
@@ -680,66 +680,43 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
   switch (opc) {
   case Instruction::FPTrunc:
   case Instruction::FPExt:
-    return ConstantFP::get(DestTy, cast<ConstantFP>(V)->getValue());
-  case Instruction::FPToUI: {
-    double dVal = cast<ConstantFP>(V)->getValue();
-    uint64_t iVal = (uint64_t) dVal;
-    return ConstantIntegral::get(DestTy, iVal);
-  }
-  case Instruction::FPToSI: {
-    double dVal = cast<ConstantFP>(V)->getValue();
-    int64_t iVal = (int64_t) dVal;
-    return ConstantIntegral::get(DestTy, iVal);
-  }
-  case Instruction::IntToPtr: //always treated as unsigned
-    if (V->isNullValue())    // Is it a FP or Integral null value?
+    if (const ConstantFP *FPC = dyn_cast<ConstantFP>(V))
+      return ConstantFP::get(DestTy, FPC->getValue());
+    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 0; // Can't fold.
+  case Instruction::FPToSI:
+    if (const ConstantFP *FPC = dyn_cast<ConstantFP>(V))
+      return ConstantIntegral::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?
       return ConstantPointerNull::get(cast<PointerType>(DestTy));
-    return 0; // Other pointer types cannot be casted
-  case Instruction::PtrToInt: // always treated as unsigned
-    if (V->isNullValue())
+    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 0; // Other pointer types cannot be casted
-  case Instruction::UIToFP: {
-    // First, extract the unsigned integer value
-    uint64_t Val;
-    if (isa<ConstantInt>(V))
-      Val = cast<ConstantIntegral>(V)->getZExtValue();
-    else if (const ConstantBool *CB = dyn_cast<ConstantBool>(V))
-      Val = CB->getValue() ? 1 : 0;
-    // Now generate the equivalent floating point value
-    double dVal = (double) Val;
-    return ConstantFP::get(DestTy, dVal);
-  }
-  case Instruction::SIToFP: {
-    // First, extract the signed integer value
-    int64_t Val;
-    if (isa<ConstantInt>(V))
-      Val = cast<ConstantIntegral>(V)->getSExtValue();
-    else if (const ConstantBool *CB = dyn_cast<ConstantBool>(V))
-      Val = CB->getValue() ? -1 : 0;
-    // Now generate the equivalent floating point value
-    double dVal = (double) Val;
-    return ConstantFP::get(DestTy, dVal);
-  }
+    return 0;                   // Other pointer types cannot be casted
+  case Instruction::UIToFP:
+    if (const ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V))
+      return ConstantFP::get(DestTy, double(CI->getZExtValue()));
+    return 0;
+  case Instruction::SIToFP:
+    if (const ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V))
+      return ConstantFP::get(DestTy, double(CI->getSExtValue()));
+    return 0;
   case Instruction::ZExt:
-    // Handle trunc directly here if it is a ConstantIntegral.
-    if (isa<ConstantInt>(V))
-      return ConstantInt::get(DestTy, cast<ConstantInt>(V)->getZExtValue());
-    else if (const ConstantBool *CB = dyn_cast<ConstantBool>(V))
-      return ConstantInt::get(DestTy, CB->getValue() ? 1 : 0);
+    if (const ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V))
+      return ConstantInt::get(DestTy, CI->getZExtValue());
     return 0;
   case Instruction::SExt:
-    // A SExt always produces a signed value so we need to cast the value
-    // now before we try to cast it to the destiniation type.
-    if (isa<ConstantInt>(V))
-      return ConstantInt::get(DestTy, cast<ConstantInt>(V)->getSExtValue());
-    else if (const ConstantBool *CB = dyn_cast<ConstantBool>(V))
-      return ConstantInt::get(DestTy, CB->getValue() ? -1 : 0);
+    if (const ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V))
+      return ConstantInt::get(DestTy, CI->getSExtValue());
     return 0;
   case Instruction::Trunc:
-    // We just handle trunc directly here.  The code below doesn't work for
-    // trunc to bool.
-    if (const ConstantInt *CI = dyn_cast<ConstantInt>(V))
+    if (const ConstantInt *CI = dyn_cast<ConstantInt>(V)) // Can't trunc a bool
       return ConstantIntegral::get(DestTy, CI->getZExtValue());
     return 0;
   case Instruction::BitCast: