diff --git a/flang/include/flang/Optimizer/Builder/FIRBuilder.h b/flang/include/flang/Optimizer/Builder/FIRBuilder.h index f2252d04079cf..64d27b0706f58 100644 --- a/flang/include/flang/Optimizer/Builder/FIRBuilder.h +++ b/flang/include/flang/Optimizer/Builder/FIRBuilder.h @@ -57,7 +57,13 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener { explicit FirOpBuilder(mlir::Operation *op, fir::KindMapping kindMap, mlir::SymbolTable *symbolTable = nullptr) : OpBuilder{op, /*listener=*/this}, kindMap{std::move(kindMap)}, - symbolTable{symbolTable} {} + symbolTable{symbolTable} { + auto fmi = mlir::dyn_cast(*op); + if (fmi) { + // Set the builder with FastMathFlags attached to the operation. + setFastMathFlags(fmi.getFastMathFlagsAttr().getValue()); + } + } explicit FirOpBuilder(mlir::OpBuilder &builder, fir::KindMapping kindMap, mlir::SymbolTable *symbolTable = nullptr) : OpBuilder(builder), OpBuilder::Listener(), kindMap{std::move(kindMap)}, diff --git a/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp b/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp index 0cfefc2d23ecb..3d506abbaa454 100644 --- a/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp +++ b/flang/lib/Optimizer/HLFIR/Transforms/OptimizedBufferization.cpp @@ -930,9 +930,7 @@ class ReductionConversion : public mlir::OpRewritePattern { llvm_unreachable("unsupported type"); }; - fir::KindMapping kindMap = - fir::getKindMapping(op->template getParentOfType()); - fir::FirOpBuilder builder{op, kindMap}; + fir::FirOpBuilder builder{rewriter, op.getOperation()}; mlir::Value init; GenBodyFn genBodyFn; diff --git a/flang/test/HLFIR/maxval-elemental.fir b/flang/test/HLFIR/maxval-elemental.fir index aa642253b0832..9dc028abe8da3 100644 --- a/flang/test/HLFIR/maxval-elemental.fir +++ b/flang/test/HLFIR/maxval-elemental.fir @@ -82,9 +82,9 @@ func.func @_QPtest_float(%arg0: !fir.box> {fir.bindc_name = "a // CHECK-NEXT: %[[V6:.*]] = fir.do_loop %arg1 = %c1 to %c4 step %c1 iter_args(%arg2 = %cst) -> (f32) { // CHECK-NEXT: %[[V7:.*]] = hlfir.designate %[[V5]] (%arg1) : (!fir.box>, index) -> !fir.ref // CHECK-NEXT: %[[V8:.*]] = fir.load %[[V7]] : !fir.ref -// CHECK-NEXT: %[[V9:.*]] = arith.cmpf ogt, %[[V8]], %arg2 : f32 -// CHECK-NEXT: %[[V10:.*]] = arith.cmpf une, %arg2, %arg2 : f32 -// CHECK-NEXT: %[[V11:.*]] = arith.cmpf oeq, %[[V8]], %[[V8]] : f32 +// CHECK-NEXT: %[[V9:.*]] = arith.cmpf ogt, %[[V8]], %arg2 fastmath : f32 +// CHECK-NEXT: %[[V10:.*]] = arith.cmpf une, %arg2, %arg2 fastmath : f32 +// CHECK-NEXT: %[[V11:.*]] = arith.cmpf oeq, %[[V8]], %[[V8]] fastmath : f32 // CHECK-NEXT: %[[V12:.*]] = arith.andi %[[V10]], %[[V11]] : i1 // CHECK-NEXT: %[[V13:.*]] = arith.ori %[[V9]], %[[V12]] : i1 // CHECK-NEXT: %[[V14:.*]] = arith.select %[[V13]], %[[V8]], %arg2 : f32 diff --git a/flang/test/HLFIR/minval-elemental.fir b/flang/test/HLFIR/minval-elemental.fir index 8da1b1bdf515b..64cd5403ec558 100644 --- a/flang/test/HLFIR/minval-elemental.fir +++ b/flang/test/HLFIR/minval-elemental.fir @@ -82,9 +82,9 @@ func.func @_QPtest_float(%arg0: !fir.box> {fir.bindc_name = "a // CHECK-NEXT: %[[V6:.*]] = fir.do_loop %arg1 = %c1 to %c4 step %c1 iter_args(%arg2 = %cst) -> (f32) { // CHECK-NEXT: %[[V7:.*]] = hlfir.designate %[[V5]] (%arg1) : (!fir.box>, index) -> !fir.ref // CHECK-NEXT: %[[V8:.*]] = fir.load %[[V7]] : !fir.ref -// CHECK-NEXT: %[[V9:.*]] = arith.cmpf olt, %[[V8]], %arg2 : f32 -// CHECK-NEXT: %[[V10:.*]] = arith.cmpf une, %arg2, %arg2 : f32 -// CHECK-NEXT: %[[V11:.*]] = arith.cmpf oeq, %[[V8]], %[[V8]] : f32 +// CHECK-NEXT: %[[V9:.*]] = arith.cmpf olt, %[[V8]], %arg2 fastmath : f32 +// CHECK-NEXT: %[[V10:.*]] = arith.cmpf une, %arg2, %arg2 fastmath : f32 +// CHECK-NEXT: %[[V11:.*]] = arith.cmpf oeq, %[[V8]], %[[V8]] fastmath : f32 // CHECK-NEXT: %[[V12:.*]] = arith.andi %[[V10]], %[[V11]] : i1 // CHECK-NEXT: %[[V13:.*]] = arith.ori %[[V9]], %[[V12]] : i1 // CHECK-NEXT: %[[V14:.*]] = arith.select %[[V13]], %[[V8]], %arg2 : f32