[llvm] [InstCombine] Eliminate fptrunc/fpext if fast math flags allow it (PR #115027)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Wed Jan 29 07:14:11 PST 2025
================
@@ -1940,6 +1940,31 @@ Instruction *InstCombinerImpl::visitFPExt(CastInst &FPExt) {
return CastInst::Create(FPCast->getOpcode(), FPCast->getOperand(0), Ty);
}
+ // fpext (fptrunc(x)) -> x, if the fast math flags allow it
+ if (auto *Trunc = dyn_cast<FPTruncInst>(Src)) {
+ // Whether this transformation is possible depends on the fast math flags of
+ // both the fpext and fptrunc.
+ FastMathFlags SrcFlags = Trunc->getFastMathFlags();
+ FastMathFlags DstFlags = FPExt.getFastMathFlags();
+ // Trunc can introduce inf and change the encoding of a nan, so the
+ // destination must have the nnan and ninf flags to indicate that we don't
+ // need to care about that. We are also removing a rounding step, and that
+ // requires both the source and destination to allow contraction.
+ if (DstFlags.noNaNs() && DstFlags.noInfs() && SrcFlags.allowContract() &&
----------------
dtcxzyw wrote:
I don't think `contract` is suitable here. Previously, `contract` means the optimizer is allowed to fold fmul+fadd into a fma. But the transformation here is too aggressive since clang may be the first compiler to fold this pattern: https://godbolt.org/z/bYfz334Pr
https://github.com/llvm/llvm-project/pull/115027
More information about the llvm-commits
mailing list