[flang-commits] [flang] [flang] Unsupported rounding modes (PR #128240)
via flang-commits
flang-commits at lists.llvm.org
Fri Feb 21 14:16:17 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: None (vdonaldson)
<details>
<summary>Changes</summary>
Two new ieee_round_type values were added in f18 beyond the four values defined in f03 and f08: ieee_away and ieee_other. Contemporary hardware typically does not have support for these rounding modes, so flang does not support them. ieee_support_rounding calls for these values return false. Current generated code handles some attempts to set the rounding mode to one of these unsupported values by setting the mode to ieee_nearest. Update the code to explicitly do this in all cases.
---
Patch is 47.80 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/128240.diff
3 Files Affected:
- (modified) flang/lib/Optimizer/Builder/IntrinsicCall.cpp (+22-2)
- (modified) flang/test/Lower/Intrinsics/ieee_rint_int.f90 (+209-174)
- (modified) flang/test/Lower/Intrinsics/ieee_rounding.f90 (+30-23)
``````````diff
diff --git a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
index d98ee58ace2bc..43770877e36a7 100644
--- a/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
+++ b/flang/lib/Optimizer/Builder/IntrinsicCall.cpp
@@ -5450,13 +5450,33 @@ void IntrinsicLibrary::genIeeeSetRoundingMode(
llvm::ArrayRef<fir::ExtendedValue> args) {
// Set the current floating point rounding mode to the value of arg
// ROUNDING_VALUE. Values are llvm.get.rounding encoding values.
- // Generate an error if the value of optional arg RADIX is not 2.
+ // Modes ieee_to_zero, ieee_nearest, ieee_up, and ieee_down are supported.
+ // Modes ieee_away and ieee_other are not supported, and are treated as
+ // ieee_nearest. Generate an error if the optional RADIX arg is not 2.
assert(args.size() == 1 || args.size() == 2);
if (args.size() == 2)
checkRadix(builder, loc, fir::getBase(args[1]), "ieee_set_rounding_mode");
- auto [fieldRef, ignore] = getFieldRef(builder, loc, fir::getBase(args[0]));
+ auto [fieldRef, fieldTy] = getFieldRef(builder, loc, fir::getBase(args[0]));
mlir::func::FuncOp setRound = fir::factory::getLlvmSetRounding(builder);
mlir::Value mode = builder.create<fir::LoadOp>(loc, fieldRef);
+ static_assert(
+ _FORTRAN_RUNTIME_IEEE_TO_ZERO >= 0 &&
+ _FORTRAN_RUNTIME_IEEE_TO_ZERO <= 3 &&
+ _FORTRAN_RUNTIME_IEEE_NEAREST >= 0 &&
+ _FORTRAN_RUNTIME_IEEE_NEAREST <= 3 && _FORTRAN_RUNTIME_IEEE_UP >= 0 &&
+ _FORTRAN_RUNTIME_IEEE_UP <= 3 && _FORTRAN_RUNTIME_IEEE_DOWN >= 0 &&
+ _FORTRAN_RUNTIME_IEEE_DOWN <= 3 && "unexpected rounding mode mapping");
+ mlir::Value mask = builder.create<mlir::arith::ShLIOp>(
+ loc, builder.createAllOnesInteger(loc, fieldTy),
+ builder.createIntegerConstant(loc, fieldTy, 2));
+ mlir::Value modeIsSupported = builder.create<mlir::arith::CmpIOp>(
+ loc, mlir::arith::CmpIPredicate::eq,
+ builder.create<mlir::arith::AndIOp>(loc, mode, mask),
+ builder.createIntegerConstant(loc, fieldTy, 0));
+ mlir::Value nearest = builder.createIntegerConstant(
+ loc, fieldTy, _FORTRAN_RUNTIME_IEEE_NEAREST);
+ mode = builder.create<mlir::arith::SelectOp>(loc, modeIsSupported, mode,
+ nearest);
mode = builder.create<fir::ConvertOp>(
loc, setRound.getFunctionType().getInput(0), mode);
builder.create<fir::CallOp>(loc, setRound, mode);
diff --git a/flang/test/Lower/Intrinsics/ieee_rint_int.f90 b/flang/test/Lower/Intrinsics/ieee_rint_int.f90
index e4b1a5e26f358..86a4aff5005bc 100644
--- a/flang/test/Lower/Intrinsics/ieee_rint_int.f90
+++ b/flang/test/Lower/Intrinsics/ieee_rint_int.f90
@@ -1,4 +1,4 @@
-! RUN: bbc -emit-fir -o - %s | FileCheck %s
+! RUN: bbc -emit-hlfir -o - %s | FileCheck %s
! CHECK-LABEL: c.func @_QQmain
program p
@@ -7,240 +7,275 @@ program p
use ieee_arithmetic, only: ieee_to_zero, ieee_nearest, ieee_up, ieee_away
! CHECK: %[[V_10:[0-9]+]] = fir.alloca i32 {bindc_name = "n", uniq_name = "_QFEn"}
- ! CHECK: %[[V_11:[0-9]+]] = fir.declare %[[V_10]] {uniq_name = "_QFEn"} : (!fir.ref<i32>) -> !fir.ref<i32>
+ ! CHECK: %[[V_11:[0-9]+]]:2 = hlfir.declare %[[V_10]] {uniq_name = "_QFEn"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)
! CHECK: %[[V_12:[0-9]+]] = fir.alloca i128 {bindc_name = "n16", uniq_name = "_QFEn16"}
- ! CHECK: %[[V_13:[0-9]+]] = fir.declare %[[V_12]] {uniq_name = "_QFEn16"} : (!fir.ref<i128>) -> !fir.ref<i128>
+ ! CHECK: %[[V_13:[0-9]+]]:2 = hlfir.declare %[[V_12]] {uniq_name = "_QFEn16"} : (!fir.ref<i128>) -> (!fir.ref<i128>, !fir.ref<i128>)
! CHECK: %[[V_14:[0-9]+]] = fir.alloca i16 {bindc_name = "n2", uniq_name = "_QFEn2"}
- ! CHECK: %[[V_15:[0-9]+]] = fir.declare %[[V_14]] {uniq_name = "_QFEn2"} : (!fir.ref<i16>) -> !fir.ref<i16>
+ ! CHECK: %[[V_15:[0-9]+]]:2 = hlfir.declare %[[V_14]] {uniq_name = "_QFEn2"} : (!fir.ref<i16>) -> (!fir.ref<i16>, !fir.ref<i16>)
! CHECK: %[[V_16:[0-9]+]] = fir.alloca i64 {bindc_name = "n8", uniq_name = "_QFEn8"}
- ! CHECK: %[[V_17:[0-9]+]] = fir.declare %[[V_16]] {uniq_name = "_QFEn8"} : (!fir.ref<i64>) -> !fir.ref<i64>
+ ! CHECK: %[[V_17:[0-9]+]]:2 = hlfir.declare %[[V_16]] {uniq_name = "_QFEn8"} : (!fir.ref<i64>) -> (!fir.ref<i64>, !fir.ref<i64>)
! CHECK: %[[V_18:[0-9]+]] = fir.alloca f32 {bindc_name = "x", uniq_name = "_QFEx"}
- ! CHECK: %[[V_19:[0-9]+]] = fir.declare %[[V_18]] {uniq_name = "_QFEx"} : (!fir.ref<f32>) -> !fir.ref<f32>
+ ! CHECK: %[[V_19:[0-9]+]]:2 = hlfir.declare %[[V_18]] {uniq_name = "_QFEx"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
! CHECK: %[[V_20:[0-9]+]] = fir.alloca f16 {bindc_name = "x2", uniq_name = "_QFEx2"}
- ! CHECK: %[[V_21:[0-9]+]] = fir.declare %[[V_20]] {uniq_name = "_QFEx2"} : (!fir.ref<f16>) -> !fir.ref<f16>
+ ! CHECK: %[[V_21:[0-9]+]]:2 = hlfir.declare %[[V_20]] {uniq_name = "_QFEx2"} : (!fir.ref<f16>) -> (!fir.ref<f16>, !fir.ref<f16>)
! CHECK: %[[V_22:[0-9]+]] = fir.alloca bf16 {bindc_name = "x3", uniq_name = "_QFEx3"}
- ! CHECK: %[[V_23:[0-9]+]] = fir.declare %[[V_22]] {uniq_name = "_QFEx3"} : (!fir.ref<bf16>) -> !fir.ref<bf16>
+ ! CHECK: %[[V_23:[0-9]+]]:2 = hlfir.declare %[[V_22]] {uniq_name = "_QFEx3"} : (!fir.ref<bf16>) -> (!fir.ref<bf16>, !fir.ref<bf16>)
! CHECK: %[[V_24:[0-9]+]] = fir.alloca f32 {bindc_name = "x8", uniq_name = "_QFEx8"}
- ! CHECK: %[[V_25:[0-9]+]] = fir.declare %[[V_24]] {uniq_name = "_QFEx8"} : (!fir.ref<f32>) -> !fir.ref<f32>
+ ! CHECK: %[[V_25:[0-9]+]]:2 = hlfir.declare %[[V_24]] {uniq_name = "_QFEx8"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
! CHECK: %[[V_26:[0-9]+]] = fir.alloca f32 {bindc_name = "y", uniq_name = "_QFEy"}
- ! CHECK: %[[V_27:[0-9]+]] = fir.declare %[[V_26]] {uniq_name = "_QFEy"} : (!fir.ref<f32>) -> !fir.ref<f32>
+ ! CHECK: %[[V_27:[0-9]+]]:2 = hlfir.declare %[[V_26]] {uniq_name = "_QFEy"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
! CHECK: %[[V_28:[0-9]+]] = fir.alloca f16 {bindc_name = "y2", uniq_name = "_QFEy2"}
- ! CHECK: %[[V_29:[0-9]+]] = fir.declare %[[V_28]] {uniq_name = "_QFEy2"} : (!fir.ref<f16>) -> !fir.ref<f16>
+ ! CHECK: %[[V_29:[0-9]+]]:2 = hlfir.declare %[[V_28]] {uniq_name = "_QFEy2"} : (!fir.ref<f16>) -> (!fir.ref<f16>, !fir.ref<f16>)
! CHECK: %[[V_30:[0-9]+]] = fir.alloca bf16 {bindc_name = "y3", uniq_name = "_QFEy3"}
- ! CHECK: %[[V_31:[0-9]+]] = fir.declare %[[V_30]] {uniq_name = "_QFEy3"} : (!fir.ref<bf16>) -> !fir.ref<bf16>
+ ! CHECK: %[[V_31:[0-9]+]]:2 = hlfir.declare %[[V_30]] {uniq_name = "_QFEy3"} : (!fir.ref<bf16>) -> (!fir.ref<bf16>, !fir.ref<bf16>)
! CHECK: %[[V_32:[0-9]+]] = fir.alloca f32 {bindc_name = "y8", uniq_name = "_QFEy8"}
- ! CHECK: %[[V_33:[0-9]+]] = fir.declare %[[V_32]] {uniq_name = "_QFEy8"} : (!fir.ref<f32>) -> !fir.ref<f32>
+ ! CHECK: %[[V_33:[0-9]+]]:2 = hlfir.declare %[[V_32]] {uniq_name = "_QFEy8"} : (!fir.ref<f32>) -> (!fir.ref<f32>, !fir.ref<f32>)
integer(2) n2
integer(8) n8
integer(16) n16
real(2) x2, y2
real(3) x3, y3
- ! CHECK: fir.store %cst{{[_0-9]*}} to %[[V_19]] : !fir.ref<f32>
+ ! CHECK: hlfir.assign %cst{{[_0-9]*}} to %[[V_19]]#0 : f32, !fir.ref<f32>
x = -200.7
- ! CHECK: %[[V_34:[0-9]+]] = fir.address_of(@_QQro._QM__fortran_builtinsT__builtin_ieee_round_type.0)
- ! CHECK: %[[V_35:[0-9]+]] = fir.declare %[[V_34]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QM__fortran_builtinsT__builtin_ieee_round_type.0"}
- ! CHECK: %[[V_36:[0-9]+]] = fir.load %[[V_19]] : !fir.ref<f32>
+ ! CHECK: %[[V_34:[0-9]+]] = fir.address_of(@_QQro._QM__fortran_builtinsT__builtin_ieee_round_type.0) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_round_type{_QM__fortran_builtinsT__builtin_ieee_round_type.mode:i8}>>
+ ! CHECK: %[[V_35:[0-9]+]]:2 = hlfir.declare %[[V_34]]
+ ! CHECK: %[[V_36:[0-9]+]] = fir.load %[[V_19]]#0 : !fir.ref<f32>
! CHECK: %[[V_37:[0-9]+]] = fir.call @llvm.get.rounding() fastmath<contract> : () -> i32
! CHECK: %[[V_38:[0-9]+]] = fir.field_index _QM__fortran_builtinsT__builtin_ieee_round_type.mode, !fir.type<_QM__fortran_builtinsT__builtin_ieee_round_type{_QM__fortran_builtinsT__builtin_ieee_round_type.mode:i8}>
- ! CHECK: %[[V_39:[0-9]+]] = fir.coordinate_of %[[V_35]], %[[V_38]]
+ ! CHECK: %[[V_39:[0-9]+]] = fir.coordinate_of %[[V_35]]#1, %[[V_38]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_round_type{_QM__fortran_builtinsT__builtin_ieee_round_type.mode:i8}>>, !fir.field) -> !fir.ref<i8>
! CHECK: %[[V_40:[0-9]+]] = fir.load %[[V_39]] : !fir.ref<i8>
- ! CHECK: %[[V_41:[0-9]+]] = fir.convert %[[V_40]] : (i8) -> i32
- ! CHECK: fir.call @llvm.set.rounding(%[[V_41]]) fastmath<contract> : (i32) -> ()
- ! CHECK: %[[V_42:[0-9]+]] = fir.call @llvm.nearbyint.f32(%[[V_36]]) fastmath<contract> : (f32) -> f32
+ ! CHECK: %[[V_41:[0-9]+]] = arith.shli %c-1{{.*}}, %c2{{.*}} : i8
+ ! CHECK: %[[V_42:[0-9]+]] = arith.andi %[[V_40]], %[[V_41]] : i8
+ ! CHECK: %[[V_43:[0-9]+]] = arith.cmpi eq, %[[V_42]], %c0{{.*}} : i8
+ ! CHECK: %[[V_44:[0-9]+]] = arith.select %[[V_43]], %[[V_40]], %c1{{.*}} : i8
+ ! CHECK: %[[V_45:[0-9]+]] = fir.convert %[[V_44]] : (i8) -> i32
+ ! CHECK: fir.call @llvm.set.rounding(%[[V_45]]) fastmath<contract> : (i32) -> ()
+ ! CHECK: %[[V_46:[0-9]+]] = fir.call @llvm.nearbyint.f32(%[[V_36]]) fastmath<contract> : (f32) -> f32
+ ! CHECK: %[[V_47:[0-9]+]] = fir.convert %[[V_46]] : (f32) -> f32
! CHECK: fir.call @llvm.set.rounding(%[[V_37]]) fastmath<contract> : (i32) -> ()
- ! CHECK: fir.store %[[V_42]] to %[[V_27]] : !fir.ref<f32>
+ ! CHECK: hlfir.assign %[[V_47]] to %[[V_27]]#0 : f32, !fir.ref<f32>
y = ieee_rint(x, ieee_nearest)
- ! CHECK: %[[V_43:[0-9]+]] = fir.declare %[[V_34]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QM__fortran_builtinsT__builtin_ieee_round_type.0"}
- ! CHECK: %[[V_44:[0-9]+]] = fir.load %[[V_19]] : !fir.ref<f32>
- ! CHECK: %[[V_45:[0-9]+]] = fir.call @llvm.get.rounding() fastmath<contract> : () -> i32
- ! CHECK: %[[V_46:[0-9]+]] = fir.coordinate_of %[[V_43]], %[[V_38]]
- ! CHECK: %[[V_47:[0-9]+]] = fir.load %[[V_46]] : !fir.ref<i8>
- ! CHECK: %[[V_48:[0-9]+]] = fir.convert %[[V_47]] : (i8) -> i32
- ! CHECK: fir.call @llvm.set.rounding(%[[V_48]]) fastmath<contract> : (i32) -> ()
- ! CHECK: %[[V_49:[0-9]+]] = fir.call @llvm.nearbyint.f32(%[[V_44]]) fastmath<contract> : (f32) -> f32
- ! CHECK: fir.call @llvm.set.rounding(%[[V_45]]) fastmath<contract> : (i32) -> ()
- ! CHECK: %[[V_50:[0-9]+]] = fir.convert %c-2147483648{{.*}} : (i32) -> f32
- ! CHECK: %[[V_51:[0-9]+]] = arith.negf %[[V_50]] fastmath<contract> : f32
- ! CHECK: %[[V_52:[0-9]+]] = arith.cmpf oge, %[[V_49]], %[[V_50]] fastmath<contract> : f32
- ! CHECK: %[[V_53:[0-9]+]] = arith.cmpf olt, %[[V_49]], %[[V_51]] fastmath<contract> : f32
- ! CHECK: %[[V_54:[0-9]+]] = arith.andi %[[V_52]], %[[V_53]] : i1
- ! CHECK: %[[V_55:[0-9]+]] = fir.if %[[V_54]] -> (i32) {
- ! CHECK: %[[V_128:[0-9]+]] = arith.cmpf one, %[[V_44]], %[[V_49]] fastmath<contract> : f32
- ! CHECK: fir.if %[[V_128]] {
- ! CHECK: %[[V_130:[0-9]+]] = fir.call @_FortranAMapException(%c32{{.*}}) fastmath<contract> : (i32) -> i32
- ! CHECK: %[[V_131:[0-9]+]] = fir.call @feraiseexcept(%[[V_130]]) fastmath<contract> : (i32) -> i32
+ ! CHECK: %[[V_48:[0-9]+]] = fir.address_of(@_QQro._QM__fortran_builtinsT__builtin_ieee_round_type.0) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_round_type{_QM__fortran_builtinsT__builtin_ieee_round_type.mode:i8}>>
+ ! CHECK: %[[V_49:[0-9]+]]:2 = hlfir.declare %[[V_48]]
+ ! CHECK: %[[V_50:[0-9]+]] = fir.load %[[V_19]]#0 : !fir.ref<f32>
+ ! CHECK: %[[V_51:[0-9]+]] = fir.call @llvm.get.rounding() fastmath<contract> : () -> i32
+ ! CHECK: %[[V_52:[0-9]+]] = fir.field_index _QM__fortran_builtinsT__builtin_ieee_round_type.mode, !fir.type<_QM__fortran_builtinsT__builtin_ieee_round_type{_QM__fortran_builtinsT__builtin_ieee_round_type.mode:i8}>
+ ! CHECK: %[[V_53:[0-9]+]] = fir.coordinate_of %[[V_49]]#1, %[[V_52]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_round_type{_QM__fortran_builtinsT__builtin_ieee_round_type.mode:i8}>>, !fir.field) -> !fir.ref<i8>
+ ! CHECK: %[[V_54:[0-9]+]] = fir.load %[[V_53]] : !fir.ref<i8>
+ ! CHECK: %[[V_55:[0-9]+]] = arith.shli %c-1{{.*}}, %c2{{.*}} : i8
+ ! CHECK: %[[V_56:[0-9]+]] = arith.andi %[[V_54]], %[[V_55]] : i8
+ ! CHECK: %[[V_57:[0-9]+]] = arith.cmpi eq, %[[V_56]], %c0{{.*}} : i8
+ ! CHECK: %[[V_58:[0-9]+]] = arith.select %[[V_57]], %[[V_54]], %c1{{.*}} : i8
+ ! CHECK: %[[V_59:[0-9]+]] = fir.convert %[[V_58]] : (i8) -> i32
+ ! CHECK: fir.call @llvm.set.rounding(%[[V_59]]) fastmath<contract> : (i32) -> ()
+ ! CHECK: %[[V_60:[0-9]+]] = fir.call @llvm.nearbyint.f32(%[[V_50]]) fastmath<contract> : (f32) -> f32
+ ! CHECK: %[[V_61:[0-9]+]] = fir.convert %[[V_60]] : (f32) -> f32
+ ! CHECK: fir.call @llvm.set.rounding(%[[V_51]]) fastmath<contract> : (i32) -> ()
+ ! CHECK: %[[V_62:[0-9]+]] = fir.convert %c-2147483648{{.*}} : (i32) -> f32
+ ! CHECK: %[[V_63:[0-9]+]] = arith.negf %[[V_62]] fastmath<contract> : f32
+ ! CHECK: %[[V_64:[0-9]+]] = arith.cmpf oge, %[[V_61]], %[[V_62]] fastmath<contract> : f32
+ ! CHECK: %[[V_65:[0-9]+]] = arith.cmpf olt, %[[V_61]], %[[V_63]] fastmath<contract> : f32
+ ! CHECK: %[[V_66:[0-9]+]] = arith.andi %[[V_64]], %[[V_65]] : i1
+ ! CHECK: %[[V_67:[0-9]+]] = fir.if %[[V_66]] -> (i32) {
+ ! CHECK: %[[V_163:[0-9]+]] = arith.cmpf one, %[[V_50]], %[[V_61]] fastmath<contract> : f32
+ ! CHECK: fir.if %[[V_163]] {
+ ! CHECK: %[[V_165:[0-9]+]] = fir.call @_FortranAMapException(%c32{{.*}}) fastmath<contract> : (i32) -> i32
+ ! CHECK: %[[V_166:[0-9]+]] = fir.call @feraiseexcept(%[[V_165]]) fastmath<contract> : (i32) -> i32
! CHECK: }
- ! CHECK: %[[V_129:[0-9]+]] = fir.convert %[[V_49]] : (f32) -> i32
- ! CHECK: fir.result %[[V_129]] : i32
+ ! CHECK: %[[V_164:[0-9]+]] = fir.convert %[[V_61]] : (f32) -> i32
+ ! CHECK: fir.result %[[V_164]] : i32
! CHECK: } else {
- ! CHECK: %[[V_128:[0-9]+]] = fir.call @_FortranAMapException(%c1{{.*}}) fastmath<contract> : (i32) -> i32
- ! CHECK: %[[V_129:[0-9]+]] = fir.call @feraiseexcept(%[[V_128]]) fastmath<contract> : (i32) -> i32
- ! CHECK: %[[V_130:[0-9]+]] = arith.select %[[V_52]], %c2147483647{{.*}}, %c-2147483648{{.*}} : i32
- ! CHECK: fir.result %[[V_130]] : i32
+ ! CHECK: %[[V_163:[0-9]+]] = fir.call @_FortranAMapException(%c1{{.*}}) fastmath<contract> : (i32) -> i32
+ ! CHECK: %[[V_164:[0-9]+]] = fir.call @feraiseexcept(%[[V_163]]) fastmath<contract> : (i32) -> i32
+ ! CHECK: %[[V_165:[0-9]+]] = arith.select %[[V_64]], %c2147483647{{.*}}, %c-2147483648{{.*}} : i32
+ ! CHECK: fir.result %[[V_165]] : i32
! CHECK: }
- ! CHECK: fir.store %[[V_55]] to %[[V_11]] : !fir.ref<i32>
+ ! CHECK: hlfir.assign %[[V_67]] to %[[V_11]]#0 : i32, !fir.ref<i32>
n = ieee_int(x, ieee_nearest)
! print*, x, ' -> ', y, ' -> ', n
- ! CHECK: fir.store %cst{{[_0-9]*}} to %[[V_21]] : !fir.ref<f16>
+ ! CHECK: hlfir.assign %cst{{[_0-9]*}} to %[[V_21]]#0 : f16, !fir.ref<f16>
x2 = huge(x2)
- ! CHECK: %[[V_56:[0-9]+]] = fir.address_of(@_QQro._QM__fortran_builtinsT__builtin_ieee_round_type.1)
- ! CHECK: %[[V_57:[0-9]+]] = fir.declare %[[V_56]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QM__fortran_builtinsT__builtin_ieee_round_type.1"}
- ! CHECK: %[[V_58:[0-9]+]] = fir.load %[[V_21]] : !fir.ref<f16>
- ! CHECK: %[[V_59:[0-9]+]] = fir.call @llvm.get.rounding() fastmath<contract> : () -> i32
- ! CHECK: %[[V_60:[0-9]+]] = fir.coordinate_of %[[V_57]], %[[V_38]]
- ! CHECK: %[[V_61:[0-9]+]] = fir.load %[[V_60]] : !fir.ref<i8>
- ! CHECK: %[[V_62:[0-9]+]] = fir.convert %[[V_61]] : (i8) -> i32
- ! CHECK: fir.call @llvm.set.rounding(%[[V_62]]) fastmath<contract> : (i32) -> ()
- ! CHECK: %[[V_63:[0-9]+]] = fir.convert %[[V_58]] : (f16) -> f32
- ! CHECK: %[[V_64:[0-9]+]] = fir.call @llvm.nearbyint.f32(%[[V_63]]) fastmath<contract> : (f32) -> f32
- ! CHECK: %[[V_65:[0-9]+]] = fir.convert %[[V_64]] : (f32) -> f16
- ! CHECK: fir.call @llvm.set.rounding(%[[V_59]]) fastmath<contract> : (i32) -> ()
- ! CHECK: fir.store %[[V_65]] to %[[V_29]] : !fir.ref<f16>
+ ! CHECK: %[[V_68:[0-9]+]] = fir.address_of(@_QQro._QM__fortran_builtinsT__builtin_ieee_round_type.1) : !fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_round_type{_QM__fortran_builtinsT__builtin_ieee_round_type.mode:i8}>>
+ ! CHECK: %[[V_69:[0-9]+]]:2 = hlfir.declare %[[V_68]]
+ ! CHECK: %[[V_70:[0-9]+]] = fir.load %[[V_21]]#0 : !fir.ref<f16>
+ ! CHECK: %[[V_71:[0-9]+]] = fir.call @llvm.get.rounding() fastmath<contract> : () -> i32
+ ! CHECK: %[[V_72:[0-9]+]] = fir.field_index _QM__fortran_builtinsT__builtin_ieee_round_type.mode, !fir.type<_QM__fortran_builtinsT__builtin_ieee_round_type{_QM__fortran_builtinsT__builtin_ieee_round_type.mode:i8}>
+ ! CHECK: %[[V_73:[0-9]+]] = fir.coordinate_of %[[V_69]]#1, %[[V_72]] : (!fir.ref<!fir.type<_QM__fortran_builtinsT__builtin_ieee_round_type{_QM__fortran_builtinsT__builtin_ieee_round_type.mode:i8}>>, !fir.field) -> !fir.ref<i8>
+ ! CHECK: %[[V_74:[0-9]+]] = fir.load %[[V_73]] : !fir.ref<i8>
+ ! CHECK: %[[V_75:[0-9]+]] = arith.shli %c-1{{.*}}, %c2{{.*}} : i8
+ ! CHECK: %[[V_76:[0-9]+]] = arith.andi %[[V_74]], %[[V_75]] : i8
+ ! CHECK: %[[V_77:[0-9]+]] = arith.cmpi eq, %[[V_76]], %c0{{.*}} : i8
+ ! CHECK: %[[V_78:[0-9]+]] = arith.select %[[V_77]], %[[V_74]], %c1{{.*}} : i8
+ ! CHECK: %[[V_79:[0-9]+]] = fir.convert %[[V_78]] : (i8) -> i32
+ ! CHECK: fir.call @llvm.set.rounding(%[[V_79]]) fastmath<contract> : (i32) -> ()
+ ! CHECK: %[[V_80:[0-9]+]] = fir.convert %[[V_70]] : (f16) -> f32
+ ! CHECK: %[[V_81:[0-9]+]] = fir.call @llvm.nearbyint.f32(%[[V_80]]) fastmath<contract> : (f32) -> f32
+ ! CHECK: %[[V_82:[0-9]+]] = fir.convert %[[V_81]] : (f32) -> f16
+ ! CHECK: fir.call @llvm.set.rounding(%[[V_71]]) fastmath<contract> : (i32) -> ()
+ ! CHECK: hlfir.assign %[[V_82]] to %[[V_29]]#0 : f16, !fir.ref<f16>
y2 = ieee_rint(x2, ieee_up)
- ! CHECK: %[[V_66:[0-9]+]] = fir.declare %[[V_56]] {fortran_attrs = #fir.var_attrs<parameter>, uniq_name = "_QQro._QM__fortran_builtinsT__builtin_ieee_round_type.1"}
- ! CHECK: %[[V_67:[0-9]+]] = fir.load %[[V_21]] : !fir.ref<f16>
- ! CHECK: %[[V_68:[0-9]+]] = fir.call @llvm.get.rounding() fastmath<contract> : () -> i32
- ! CHECK: %[[V_69:[0-9]+]] = fir.coordinate_of %[[V_66]], %[[V_38]]
- ! CHECK: %[[V_70:[0-9]+]] = fir.load %[[V_69]] : !fir.ref<i8>
- ! CHECK: %[[V_71:[0-9]+]] = fir.convert %[[V_70]] : (i8) -> i32
- ! CHECK: fir.call @llvm.set.rounding(%[[V_71]]) fastmath<contract> : (i32) -> ()
- ! CHECK: %[[V_72:[0-9]+]] = fir.convert %[[V_67]] : (f16) -> f32
- ! CHECK: %[[V_73:[0-9]+]] = fir.call @llvm.nearbyint.f32(%[[V_72]]) fastmath<contract> : (f32) -> f32
- ! CHECK: %[[V_74:[0-9]+]] = fir.convert %[[V_73]] : (f32) -> f16
- ! CHECK: fir.call @llvm.set.rounding(%[[V_68]]) fastmath<contract> : (i32) -> ()
- ! CHECK: %[[V_75:[0-9]+]] = fir.convert %c-9223372036854775808{{.*}} : (i64) -> f16
- ! CHECK: %[[V_76:[0-9]+]] = arith.negf %[[V_75]] fastmath<contract> : f16
- ! CHECK: %[[V_77:[0-9]+]] = arith.cmpf oge, %[[V_74]], %[[V_75]] fastmath<contract> : f16
- ! CHECK: %[[V_78:[0-9]+]] = arith.cmpf olt, %[[V_74]], %[[V_76]] fastmath<contract> : f16
- ! CHECK: %[[V_79:[0-9]+]] = arith.andi %[[V_77]], %[[V_78]] : i1
- ! CHECK: %[[V_80:[0-9]+]] = fir.if %[[V_79]] -> (i64) {
- ! CHECK: %[[V_128:[0-9]+]] = arith.cmpf one, %[[V_67]], %[[V_74]] fastmath<contract> : f16
- ! CHECK: fir.if %[[V_128]] {
- ! CHECK: %[[V_130:[0-9]+]] = fir.call @_FortranAMapException(%c32{{.*}}) fastmath<contract> : (i32) -> i32
- ! CHECK: %[[V_131:[0-...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/128240
More information about the flang-commits
mailing list