Skip to content

Commit c609c40

Browse files
committed
[flang] review update
Procedure ieee_support_standard is an inquiry function, not an elemental function. Account for that, and make similar adjustments for other inquiry and transformational functions.
1 parent 2bb801f commit c609c40

File tree

3 files changed

+30
-31
lines changed

3 files changed

+30
-31
lines changed

flang/include/flang/Optimizer/Builder/IntrinsicCall.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,8 @@ struct IntrinsicLibrary {
313313
llvm::ArrayRef<fir::ExtendedValue>);
314314
fir::ExtendedValue genIeeeSupportHalting(mlir::Type,
315315
llvm::ArrayRef<fir::ExtendedValue>);
316-
mlir::Value genIeeeSupportRounding(mlir::Type, llvm::ArrayRef<mlir::Value>);
316+
fir::ExtendedValue genIeeeSupportRounding(mlir::Type,
317+
llvm::ArrayRef<fir::ExtendedValue>);
317318
fir::ExtendedValue genIeeeSupportStandard(mlir::Type,
318319
llvm::ArrayRef<fir::ExtendedValue>);
319320
template <mlir::arith::CmpIPredicate pred>

flang/lib/Evaluate/intrinsics.cpp

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,45 +1022,35 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
10221022
{"__builtin_ieee_next_up", {{"x", SameReal}}, SameReal},
10231023
{"__builtin_ieee_real", {{"a", AnyIntOrReal}, DefaultingKIND}, KINDReal},
10241024
{"__builtin_ieee_support_datatype",
1025-
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
1026-
DefaultLogical},
1025+
{{"x", AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
10271026
{"__builtin_ieee_support_denormal",
1028-
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
1029-
DefaultLogical},
1027+
{{"x", AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
10301028
{"__builtin_ieee_support_divide",
1031-
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
1032-
DefaultLogical},
1029+
{{"x", AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
10331030
{"__builtin_ieee_support_flag",
10341031
{{"flag", IeeeFlagType, Rank::scalar},
1035-
{"x", AnyReal, Rank::elemental, Optionality::optional}},
1032+
{"x", AnyReal, Rank::known, Optionality::optional}},
10361033
DefaultLogical},
10371034
{"__builtin_ieee_support_halting", {{"flag", IeeeFlagType, Rank::scalar}},
10381035
DefaultLogical},
10391036
{"__builtin_ieee_support_inf",
1040-
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
1041-
DefaultLogical},
1037+
{{"x", AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
10421038
{"__builtin_ieee_support_io",
1043-
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
1044-
DefaultLogical},
1039+
{{"x", AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
10451040
{"__builtin_ieee_support_nan",
1046-
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
1047-
DefaultLogical},
1041+
{{"x", AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
10481042
{"__builtin_ieee_support_rounding",
10491043
{{"round_value", IeeeRoundType, Rank::scalar},
1050-
{"x", AnyReal, Rank::elemental, Optionality::optional}},
1044+
{"x", AnyReal, Rank::known, Optionality::optional}},
10511045
DefaultLogical},
10521046
{"__builtin_ieee_support_sqrt",
1053-
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
1054-
DefaultLogical},
1047+
{{"x", AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
10551048
{"__builtin_ieee_support_standard",
1056-
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
1057-
DefaultLogical},
1049+
{{"x", AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
10581050
{"__builtin_ieee_support_subnormal",
1059-
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
1060-
DefaultLogical},
1051+
{{"x", AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
10611052
{"__builtin_ieee_support_underflow_control",
1062-
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
1063-
DefaultLogical},
1053+
{{"x", AnyReal, Rank::known, Optionality::optional}}, DefaultLogical},
10641054
{"__builtin_numeric_storage_size", {}, DefaultInt},
10651055
};
10661056

flang/lib/Optimizer/Builder/IntrinsicCall.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -456,9 +456,18 @@ static constexpr IntrinsicHandler handlers[]{
456456
&I::genIeeeSupportFlag,
457457
{{{"flag", asValue}, {"x", asInquired, handleDynamicOptional}}},
458458
/*isElemental=*/false},
459-
{"ieee_support_halting", &I::genIeeeSupportHalting},
460-
{"ieee_support_rounding", &I::genIeeeSupportRounding},
461-
{"ieee_support_standard", &I::genIeeeSupportStandard},
459+
{"ieee_support_halting",
460+
&I::genIeeeSupportHalting,
461+
{{{"flag", asValue}}},
462+
/*isElemental=*/false},
463+
{"ieee_support_rounding",
464+
&I::genIeeeSupportRounding,
465+
{{{"round_value", asValue}, {"x", asInquired, handleDynamicOptional}}},
466+
/*isElemental=*/false},
467+
{"ieee_support_standard",
468+
&I::genIeeeSupportStandard,
469+
{{{"flag", asValue}, {"x", asInquired, handleDynamicOptional}}},
470+
/*isElemental=*/false},
462471
{"ieee_unordered", &I::genIeeeUnordered},
463472
{"ieee_value", &I::genIeeeValue},
464473
{"ieor", &I::genIeor},
@@ -5614,7 +5623,7 @@ IntrinsicLibrary::genIeeeSupportFlag(mlir::Type resultType,
56145623
// is therefore ignored. Standard flags are all supported. The nonstandard
56155624
// DENORM extension is not supported, at least for now.
56165625
assert(args.size() == 1 || args.size() == 2);
5617-
auto [fieldRef, fieldTy] = getFieldRef(builder, loc, fir::getBase(args[0]));
5626+
auto [fieldRef, fieldTy] = getFieldRef(builder, loc, getBase(args[0]));
56185627
mlir::Value flag = builder.create<fir::LoadOp>(loc, fieldRef);
56195628
mlir::Value mask = builder.createIntegerConstant( // values are powers of 2
56205629
loc, fieldTy,
@@ -5646,9 +5655,8 @@ fir::ExtendedValue IntrinsicLibrary::genIeeeSupportHalting(
56465655
}
56475656

56485657
// IEEE_SUPPORT_ROUNDING
5649-
mlir::Value
5650-
IntrinsicLibrary::genIeeeSupportRounding(mlir::Type resultType,
5651-
llvm::ArrayRef<mlir::Value> args) {
5658+
fir::ExtendedValue IntrinsicLibrary::genIeeeSupportRounding(
5659+
mlir::Type resultType, llvm::ArrayRef<fir::ExtendedValue> args) {
56525660
// Check if floating point rounding mode ROUND_VALUE is supported.
56535661
// Rounding is supported either for all type kinds or none.
56545662
// An optional X kind argument is therefore ignored.
@@ -5659,7 +5667,7 @@ IntrinsicLibrary::genIeeeSupportRounding(mlir::Type resultType,
56595667
// 3 - toward negative infinity [supported]
56605668
// 4 - to nearest, ties away from zero [not supported]
56615669
assert(args.size() == 1 || args.size() == 2);
5662-
auto [fieldRef, fieldTy] = getFieldRef(builder, loc, args[0]);
5670+
auto [fieldRef, fieldTy] = getFieldRef(builder, loc, getBase(args[0]));
56635671
mlir::Value mode = builder.create<fir::LoadOp>(loc, fieldRef);
56645672
mlir::Value lbOk = builder.create<mlir::arith::CmpIOp>(
56655673
loc, mlir::arith::CmpIPredicate::sge, mode,

0 commit comments

Comments
 (0)