[clang] [llvm] [IR] Allow fast math flags on fptrunc and fpext (PR #115894)

John Brawn via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 14 04:09:50 PST 2024


================
@@ -1875,13 +1873,17 @@ Instruction *InstCombinerImpl::visitFPTrunc(FPTruncInst &FPT) {
       // fptrunc (select Cond, (fpext X), Y --> select Cond, X, (fptrunc Y)
       Value *NarrowY = Builder.CreateFPTrunc(Y, Ty);
       Value *Sel = Builder.CreateSelect(Cond, X, NarrowY, "narrow.sel", Op);
+      if (auto *I = dyn_cast<Instruction>(Sel))
+        I->setFastMathFlags(Op->getFastMathFlags());
       return replaceInstUsesWith(FPT, Sel);
     }
     if (match(Op, m_Select(m_Value(Cond), m_Value(Y), m_FPExt(m_Value(X)))) &&
         X->getType() == Ty) {
       // fptrunc (select Cond, Y, (fpext X) --> select Cond, (fptrunc Y), X
       Value *NarrowY = Builder.CreateFPTrunc(Y, Ty);
       Value *Sel = Builder.CreateSelect(Cond, NarrowY, X, "narrow.sel", Op);
+      if (auto *I = dyn_cast<Instruction>(Sel))
+        I->setFastMathFlags(Op->getFastMathFlags());
----------------
john-brawn-arm wrote:

IRBuilder::CreateSelect uses the default fast math flags of the IRBuilder, which will be the flags of the fptrunc. So we need this to make sure the new select has the same flags as the old select.

https://github.com/llvm/llvm-project/pull/115894


More information about the cfe-commits mailing list