On Dec 18, 2006, at 7:16 PM, Reid Spencer wrote: > Rewrite ConstantFoldCastInstruction so that it doesn't use any of the > ConstRules. Remove the casting rules from ConstRules and > subclasses. This > cleans up ConstantFolding significantly. Passes all tests.
Nice! > 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; ConstantBool is ConstantIntegral. You should be able to do: > + if (ConstantIntegral *CI = dyn_cast<ConstantIntegral>(V)) > + Val = CI->getZExtValue(); to handle both cases. > + // 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; Likewise. > + // Now generate the equivalent floating point value > + double dVal = (double) Val; > + return ConstantFP::get(DestTy, dVal); > + } > 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); Likewise, also, please correct the comment. > + 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); Likewise. > + return 0; > case Instruction::Trunc: > // We just handle trunc directly here. The code below doesn't > work for > // trunc to bool. > @@ -896,7 +743,8 @@ > return ConstantIntegral::get(DestTy, CI->getZExtValue()); > return 0; > case Instruction::BitCast: > - if (SrcTy == DestTy) return (Constant*)V; // no-op cast > + if (SrcTy == DestTy) > + return (Constant*)V; // no-op cast Does this fold (int)4U ? -Chris _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits