Skip to content

Commit 0c455ee

Browse files
authored
[flang][OpenMP] Use maxnum/minnum for lowering of max/min reduction operators (#89258)
This patch changes the lowering of max and min to be lowered to arith::MaxNumFop and arith::MinNumFOp instead of using arith::MaximumFOp and arith::MinimumFOp. The arith::MaximumFOp and arith::MinimumFOp map to the corresponding intrinsics llvm.maximum.* and llvm.minimum.* intrinsics which conform to the semantics specified in the draft of IEEE 754-2019, which is not supported by all hardware. Instead using arith::MaximumFOp and arith::MinimumFOp will allow code generation for more targets and match the code generated by clang OpenMP. fixes #87955
1 parent c32712d commit 0c455ee

9 files changed

+10
-10
lines changed

flang/lib/Lower/OpenMP/ReductionProcessor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,12 +220,12 @@ mlir::Value ReductionProcessor::createScalarCombiner(
220220
switch (redId) {
221221
case ReductionIdentifier::MAX:
222222
reductionOp =
223-
getReductionOperation<mlir::arith::MaximumFOp, mlir::arith::MaxSIOp>(
223+
getReductionOperation<mlir::arith::MaxNumFOp, mlir::arith::MaxSIOp>(
224224
builder, type, loc, op1, op2);
225225
break;
226226
case ReductionIdentifier::MIN:
227227
reductionOp =
228-
getReductionOperation<mlir::arith::MinimumFOp, mlir::arith::MinSIOp>(
228+
getReductionOperation<mlir::arith::MinNumFOp, mlir::arith::MinSIOp>(
229229
builder, type, loc, op1, op2);
230230
break;
231231
case ReductionIdentifier::IOR:

flang/test/Lower/OpenMP/FIR/wsloop-reduction-max-byref.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
!CHECK: ^bb0(%[[ARG0:.*]]: !fir.ref<f32>, %[[ARG1:.*]]: !fir.ref<f32>):
1212
!CHECK: %[[LD0:.*]] = fir.load %[[ARG0]] : !fir.ref<f32>
1313
!CHECK: %[[LD1:.*]] = fir.load %[[ARG1]] : !fir.ref<f32>
14-
!CHECK: %[[RES:.*]] = arith.maximumf %[[LD0]], %[[LD1]] {{.*}}: f32
14+
!CHECK: %[[RES:.*]] = arith.maxnumf %[[LD0]], %[[LD1]] {{.*}}: f32
1515
!CHECK: fir.store %[[RES]] to %[[ARG0]] : !fir.ref<f32>
1616
!CHECK: omp.yield(%[[ARG0]] : !fir.ref<f32>)
1717

flang/test/Lower/OpenMP/FIR/wsloop-reduction-max.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
!CHECK: omp.yield(%[[MINIMUM_VAL_F]] : f32)
77
!CHECK: combiner
88
!CHECK: ^bb0(%[[ARG0_F:.*]]: f32, %[[ARG1_F:.*]]: f32):
9-
!CHECK: %[[COMB_VAL_F:.*]] = arith.maximumf %[[ARG0_F]], %[[ARG1_F]] {{.*}}: f32
9+
!CHECK: %[[COMB_VAL_F:.*]] = arith.maxnumf %[[ARG0_F]], %[[ARG1_F]] {{.*}}: f32
1010
!CHECK: omp.yield(%[[COMB_VAL_F]] : f32)
1111

1212
!CHECK: omp.declare_reduction @[[MAX_DECLARE_I:.*]] : i32 init {

flang/test/Lower/OpenMP/FIR/wsloop-reduction-min-byref.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
!CHECK: ^bb0(%[[ARG0:.*]]: !fir.ref<f32>, %[[ARG1:.*]]: !fir.ref<f32>):
1212
!CHECK: %[[LD0:.*]] = fir.load %[[ARG0]] : !fir.ref<f32>
1313
!CHECK: %[[LD1:.*]] = fir.load %[[ARG1]] : !fir.ref<f32>
14-
!CHECK: %[[RES:.*]] = arith.minimumf %[[LD0]], %[[LD1]] {{.*}}: f32
14+
!CHECK: %[[RES:.*]] = arith.minnumf %[[LD0]], %[[LD1]] {{.*}}: f32
1515
!CHECK: fir.store %[[RES]] to %[[ARG0]] : !fir.ref<f32>
1616
!CHECK: omp.yield(%[[ARG0]] : !fir.ref<f32>)
1717

flang/test/Lower/OpenMP/FIR/wsloop-reduction-min.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
!CHECK: omp.yield(%[[MAXIMUM_VAL_F]] : f32)
77
!CHECK: combiner
88
!CHECK: ^bb0(%[[ARG0_F:.*]]: f32, %[[ARG1_F:.*]]: f32):
9-
!CHECK: %[[COMB_VAL_F:.*]] = arith.minimumf %[[ARG0_F]], %[[ARG1_F]] {{.*}}: f32
9+
!CHECK: %[[COMB_VAL_F:.*]] = arith.minnumf %[[ARG0_F]], %[[ARG1_F]] {{.*}}: f32
1010
!CHECK: omp.yield(%[[COMB_VAL_F]] : f32)
1111

1212
!CHECK: omp.declare_reduction @[[MIN_DECLARE_I:.*]] : i32 init {

flang/test/Lower/OpenMP/wsloop-reduction-max-byref.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
!CHECK: ^bb0(%[[ARG0:.*]]: !fir.ref<f32>, %[[ARG1:.*]]: !fir.ref<f32>):
1414
!CHECK: %[[LD0:.*]] = fir.load %[[ARG0]] : !fir.ref<f32>
1515
!CHECK: %[[LD1:.*]] = fir.load %[[ARG1]] : !fir.ref<f32>
16-
!CHECK: %[[RES:.*]] = arith.maximumf %[[LD0]], %[[LD1]] {{.*}}: f32
16+
!CHECK: %[[RES:.*]] = arith.maxnumf %[[LD0]], %[[LD1]] {{.*}}: f32
1717
!CHECK: fir.store %[[RES]] to %[[ARG0]] : !fir.ref<f32>
1818
!CHECK: omp.yield(%[[ARG0]] : !fir.ref<f32>)
1919

flang/test/Lower/OpenMP/wsloop-reduction-max.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
! CHECK-LABEL: } combiner {
1212
! CHECK: ^bb0(%[[VAL_0:.*]]: f32, %[[VAL_1:.*]]: f32):
13-
! CHECK: %[[VAL_2:.*]] = arith.maximumf %[[VAL_0]], %[[VAL_1]] fastmath<contract> : f32
13+
! CHECK: %[[VAL_2:.*]] = arith.maxnumf %[[VAL_0]], %[[VAL_1]] fastmath<contract> : f32
1414
! CHECK: omp.yield(%[[VAL_2]] : f32)
1515
! CHECK: }
1616

flang/test/Lower/OpenMP/wsloop-reduction-min-byref.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
!CHECK: ^bb0(%[[ARG0:.*]]: !fir.ref<f32>, %[[ARG1:.*]]: !fir.ref<f32>):
1414
!CHECK: %[[LD0:.*]] = fir.load %[[ARG0]] : !fir.ref<f32>
1515
!CHECK: %[[LD1:.*]] = fir.load %[[ARG1]] : !fir.ref<f32>
16-
!CHECK: %[[RES:.*]] = arith.minimumf %[[LD0]], %[[LD1]] {{.*}}: f32
16+
!CHECK: %[[RES:.*]] = arith.minnumf %[[LD0]], %[[LD1]] {{.*}}: f32
1717
!CHECK: fir.store %[[RES]] to %[[ARG0]] : !fir.ref<f32>
1818
!CHECK: omp.yield(%[[ARG0]] : !fir.ref<f32>)
1919

flang/test/Lower/OpenMP/wsloop-reduction-min.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
! CHECK-LABEL: } combiner {
1212
! CHECK: ^bb0(%[[VAL_0:.*]]: f32, %[[VAL_1:.*]]: f32):
13-
! CHECK: %[[VAL_2:.*]] = arith.minimumf %[[VAL_0]], %[[VAL_1]] fastmath<contract> : f32
13+
! CHECK: %[[VAL_2:.*]] = arith.minnumf %[[VAL_0]], %[[VAL_1]] fastmath<contract> : f32
1414
! CHECK: omp.yield(%[[VAL_2]] : f32)
1515
! CHECK: }
1616

0 commit comments

Comments
 (0)