Index: llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp =================================================================== --- llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ llvm/trunk/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -1420,6 +1420,23 @@ return nullptr; } +static Constant *shrinkFPConstant(ConstantFP *CFP) { + if (CFP->getType() == Type::getPPC_FP128Ty(CFP->getContext())) + return nullptr; // No constant folding of this. + // See if the value can be truncated to half and then reextended. + if (Constant *NewCFP = fitsInFPType(CFP, APFloat::IEEEhalf())) + return NewCFP; + // See if the value can be truncated to float and then reextended. + if (Constant *NewCFP = fitsInFPType(CFP, APFloat::IEEEsingle())) + return NewCFP; + if (CFP->getType()->isDoubleTy()) + return nullptr; // Won't shrink. + if (Constant *NewCFP = fitsInFPType(CFP, APFloat::IEEEdouble())) + return NewCFP; + // Don't try to shrink to various long double types. + return nullptr; +} + /// Look through floating-point extensions until we get the source value. static Value *lookThroughFPExtensions(Value *V) { while (auto *FPExt = dyn_cast(V)) @@ -1428,21 +1445,9 @@ // If this value is a constant, return the constant in the smallest FP type // that can accurately represent it. This allows us to turn // (float)((double)X+2.0) into x+2.0f. - if (auto *CFP = dyn_cast(V)) { - if (CFP->getType() == Type::getPPC_FP128Ty(V->getContext())) - return V; // No constant folding of this. - // See if the value can be truncated to half and then reextended. - if (Value *V = fitsInFPType(CFP, APFloat::IEEEhalf())) - return V; - // See if the value can be truncated to float and then reextended. - if (Value *V = fitsInFPType(CFP, APFloat::IEEEsingle())) - return V; - if (CFP->getType()->isDoubleTy()) - return V; // Won't shrink. - if (Value *V = fitsInFPType(CFP, APFloat::IEEEdouble())) - return V; - // Don't try to shrink to various long double types. - } + if (auto *CFP = dyn_cast(V)) + if (Constant *NewCFP = shrinkFPConstant(CFP)) + return NewCFP; return V; }