this logic is broken for trunc to bool, replace the folding logic for trunc
authorChris Lattner <sabre@nondot.org>
Fri, 1 Dec 2006 19:22:41 +0000 (19:22 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 1 Dec 2006 19:22:41 +0000 (19:22 +0000)
completely, as it is trivial.  We should probably do this for the rest of the
cast operations.  This fixes ConstProp/2006-12-01-TruncBoolBug.ll.

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

lib/VMCore/ConstantFold.cpp

index 79f0f577420adb8556f1071786b6eeb558bf7520..48d84e5ac542053bf2ca16f8c9af3eb201a3fae6 100644 (file)
@@ -860,10 +860,10 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
   // We actually have to do a cast now, but first, we might need to fix up
   // the value of the operand.
   switch (opc) {
+  case Instruction::PtrToInt:
   case Instruction::FPTrunc:
-  case Instruction::Trunc:
   case Instruction::FPExt:
-    break; // floating point input & output, no fixup needed
+    break;
   case Instruction::FPToUI: {
     ConstRules &Rules = ConstRules::get(V, V);
     V = Rules.castToULong(V); // make sure we get an unsigned value first 
@@ -891,9 +891,12 @@ Constant *llvm::ConstantFoldCastInstruction(unsigned opc, const Constant *V,
       V = ConstantInt::get(SrcTy->getSignedVersion(), 
                            cast<ConstantIntegral>(V)->getSExtValue());
     break;
-
-  case Instruction::PtrToInt:
-    break;
+  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))
+      return ConstantIntegral::get(DestTy, CI->getZExtValue());
+    return 0;
   case Instruction::BitCast:
     // Check to see if we are casting a pointer to an aggregate to a pointer to
     // the first element.  If so, return the appropriate GEP instruction.