[flang-commits] [flang] [DRAFT][flang] Initial change from Alexey to turn off FMF (PR #170505)

Eugene Epshteyn via flang-commits flang-commits at lists.llvm.org
Tue Dec 16 07:20:44 PST 2025


https://github.com/eugeneepshteyn updated https://github.com/llvm/llvm-project/pull/170505

>From d6ed678c77edc1b42f927d3711b40f2835158cac Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Wed, 3 Dec 2025 11:30:10 -0500
Subject: [PATCH 1/2] Initial change from Alexey to turn off FMF

---
 flang/lib/Lower/ConvertExprToHLFIR.cpp | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/flang/lib/Lower/ConvertExprToHLFIR.cpp b/flang/lib/Lower/ConvertExprToHLFIR.cpp
index 1eda1f1b61355..47ba5b543752c 100644
--- a/flang/lib/Lower/ConvertExprToHLFIR.cpp
+++ b/flang/lib/Lower/ConvertExprToHLFIR.cpp
@@ -1689,12 +1689,24 @@ class HlfirBuilder {
     BinaryOp<D> binaryOp;
     auto left = hlfir::loadTrivialScalar(loc, builder, gen(op.left()));
     auto right = hlfir::loadTrivialScalar(loc, builder, gen(op.right()));
+         mlir::Value exprl = left;
+         mlir::Value exprr = right;
+
+    bool noReassoc = exprl.getDefiningOp<hlfir::NoReassocOp>() ||
+                     exprr.getDefiningOp<hlfir::NoReassocOp>();
     llvm::SmallVector<mlir::Value, 1> typeParams;
     if constexpr (R::category == Fortran::common::TypeCategory::Character) {
       binaryOp.genResultTypeParams(loc, builder, left, right, typeParams);
     }
-    if (rank == 0)
-      return binaryOp.gen(loc, builder, op.derived(), left, right);
+    if (rank == 0) {
+      auto fmfBackup = builder.getFastMathFlags();
+      if (noReassoc)
+        builder.setFastMathFlags(fmfBackup &
+                                 ~mlir::arith::FastMathFlags::reassoc);
+      auto res = binaryOp.gen(loc, builder, op.derived(), left, right);
+      builder.setFastMathFlags(fmfBackup);
+      return res;
+    }
 
     // Elemental expression.
     mlir::Type elementType =
@@ -1721,9 +1733,14 @@ class HlfirBuilder {
     // nsw is never added to operations on vector subscripts
     // even if -fno-wrapv is enabled.
     builder.setIntegerOverflowFlags(mlir::arith::IntegerOverflowFlags::none);
+    auto fmfBackup = builder.getFastMathFlags();
+    if (noReassoc)
+      builder.setFastMathFlags(fmfBackup &
+                               ~mlir::arith::FastMathFlags::reassoc);
     mlir::Value elemental = hlfir::genElementalOp(loc, builder, elementType,
                                                   shape, typeParams, genKernel,
                                                   /*isUnordered=*/true);
+    builder.setFastMathFlags(fmfBackup);
     builder.setIntegerOverflowFlags(iofBackup);
     fir::FirOpBuilder *bldr = &builder;
     getStmtCtx().attachCleanup(

>From ee93d49d30afa8a3dcfe192ecd956b39f73166f3 Mon Sep 17 00:00:00 2001
From: Eugene Epshteyn <eepshteyn at nvidia.com>
Date: Wed, 3 Dec 2025 21:51:49 -0500
Subject: [PATCH 2/2] A bit of clean-up

---
 flang/lib/Lower/ConvertExprToHLFIR.cpp | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/flang/lib/Lower/ConvertExprToHLFIR.cpp b/flang/lib/Lower/ConvertExprToHLFIR.cpp
index 47ba5b543752c..8907d391a4847 100644
--- a/flang/lib/Lower/ConvertExprToHLFIR.cpp
+++ b/flang/lib/Lower/ConvertExprToHLFIR.cpp
@@ -1689,11 +1689,9 @@ class HlfirBuilder {
     BinaryOp<D> binaryOp;
     auto left = hlfir::loadTrivialScalar(loc, builder, gen(op.left()));
     auto right = hlfir::loadTrivialScalar(loc, builder, gen(op.right()));
-         mlir::Value exprl = left;
-         mlir::Value exprr = right;
 
-    bool noReassoc = exprl.getDefiningOp<hlfir::NoReassocOp>() ||
-                     exprr.getDefiningOp<hlfir::NoReassocOp>();
+    bool noReassoc = left.template getDefiningOp<hlfir::NoReassocOp>() ||
+                     right.template getDefiningOp<hlfir::NoReassocOp>();
     llvm::SmallVector<mlir::Value, 1> typeParams;
     if constexpr (R::category == Fortran::common::TypeCategory::Character) {
       binaryOp.genResultTypeParams(loc, builder, left, right, typeParams);



More information about the flang-commits mailing list