diff options
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp index 7026b24f4df..7ed792af1f3 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp @@ -1420,6 +1420,23 @@ static Constant *fitsInFPType(ConstantFP *CFP, const fltSemantics &Sem) { 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<FPExtInst>(V)) @@ -1428,21 +1445,9 @@ static Value *lookThroughFPExtensions(Value *V) { // 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<ConstantFP>(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<ConstantFP>(V)) + if (Constant *NewCFP = shrinkFPConstant(CFP)) + return NewCFP; return V; } |