[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