From d6ed678c77edc1b42f927d3711b40f2835158cac Mon Sep 17 00:00:00 2001 From: Eugene Epshteyn 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 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() || + exprr.getDefiningOp(); llvm::SmallVector 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 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 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() || - exprr.getDefiningOp(); + bool noReassoc = left.template getDefiningOp() || + right.template getDefiningOp(); llvm::SmallVector typeParams; if constexpr (R::category == Fortran::common::TypeCategory::Character) { binaryOp.genResultTypeParams(loc, builder, left, right, typeParams);