-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[flang] Make IEEE_INT and IEEE_REAL into builtin intrinsic functions #109191
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
For proper error detection of bad KIND= arguments, make IEEE_INT and IEEE_REAL actual intrinsic functions. Lowering will have to check for the new __builtin_ names.
@llvm/pr-subscribers-flang-semantics Author: Peter Klausler (klausler) ChangesFor proper error detection of bad KIND= arguments, make IEEE_INT and IEEE_REAL actual intrinsic functions. Lowering will have to check for the new _builtin names. Full diff: https://github.com/llvm/llvm-project/pull/109191.diff 4 Files Affected:
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp
index 166dae93178c51..637ee5b8923f19 100644
--- a/flang/lib/Evaluate/intrinsics.cpp
+++ b/flang/lib/Evaluate/intrinsics.cpp
@@ -935,12 +935,16 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
{"__builtin_compiler_version", {}, DefaultChar},
{"__builtin_fma", {{"f1", SameReal}, {"f2", SameReal}, {"f3", SameReal}},
SameReal},
+ {"__builtin_ieee_int",
+ {{"a", AnyFloating}, {"round", IeeeRoundType}, DefaultingKIND},
+ KINDInt},
{"__builtin_ieee_is_nan", {{"a", AnyFloating}}, DefaultLogical},
{"__builtin_ieee_is_negative", {{"a", AnyFloating}}, DefaultLogical},
{"__builtin_ieee_is_normal", {{"a", AnyFloating}}, DefaultLogical},
{"__builtin_ieee_next_after", {{"x", SameReal}, {"y", AnyReal}}, SameReal},
{"__builtin_ieee_next_down", {{"x", SameReal}}, SameReal},
{"__builtin_ieee_next_up", {{"x", SameReal}}, SameReal},
+ {"__builtin_ieee_real", {{"a", AnyIntOrReal}, DefaultingKIND}, KINDReal},
{"__builtin_ieee_support_datatype",
{{"x", AnyReal, Rank::elemental, Optionality::optional}},
DefaultLogical},
diff --git a/flang/module/__fortran_builtins.f90 b/flang/module/__fortran_builtins.f90
index d1d4a639e70d72..ef206dfd943102 100644
--- a/flang/module/__fortran_builtins.f90
+++ b/flang/module/__fortran_builtins.f90
@@ -108,11 +108,13 @@
end type
intrinsic :: __builtin_fma
+ intrinsic :: __builtin_ieee_int
intrinsic :: __builtin_ieee_is_nan, __builtin_ieee_is_negative, &
__builtin_ieee_is_normal
intrinsic :: __builtin_ieee_next_after, __builtin_ieee_next_down, &
__builtin_ieee_next_up
intrinsic :: scale ! for ieee_scalb
+ intrinsic :: __builtin_ieee_real
intrinsic :: __builtin_ieee_selected_real_kind
intrinsic :: __builtin_ieee_support_datatype, &
__builtin_ieee_support_denormal, __builtin_ieee_support_divide, &
@@ -123,10 +125,12 @@
__builtin_ieee_support_standard, __builtin_ieee_support_subnormal, &
__builtin_ieee_support_underflow_control
public :: __builtin_fma
+ public :: __builtin_ieee_int
public :: __builtin_ieee_is_nan, __builtin_ieee_is_negative, &
__builtin_ieee_is_normal
public :: __builtin_ieee_next_after, __builtin_ieee_next_down, &
__builtin_ieee_next_up
+ public :: __builtin_ieee_real
public :: scale ! for ieee_scalb
public :: __builtin_ieee_selected_real_kind
public :: __builtin_ieee_support_datatype, &
diff --git a/flang/module/ieee_arithmetic.f90 b/flang/module/ieee_arithmetic.f90
index 7eaa7db55af9f8..0e8d5f1af01e7b 100644
--- a/flang/module/ieee_arithmetic.f90
+++ b/flang/module/ieee_arithmetic.f90
@@ -21,6 +21,7 @@ module ieee_arithmetic
ieee_away => __builtin_ieee_away, &
ieee_down => __builtin_ieee_down, &
ieee_fma => __builtin_fma, &
+ ieee_int => __builtin_ieee_int, &
ieee_is_nan => __builtin_ieee_is_nan, &
ieee_is_negative => __builtin_ieee_is_negative, &
ieee_is_normal => __builtin_ieee_is_normal, &
@@ -29,6 +30,7 @@ module ieee_arithmetic
ieee_next_down => __builtin_ieee_next_down, &
ieee_next_up => __builtin_ieee_next_up, &
ieee_other => __builtin_ieee_other, &
+ ieee_real => __builtin_ieee_real, &
ieee_round_type => __builtin_ieee_round_type, &
ieee_scalb => scale, &
ieee_selected_real_kind => __builtin_ieee_selected_real_kind, &
@@ -57,6 +59,7 @@ module ieee_arithmetic
public :: ieee_away
public :: ieee_down
public :: ieee_fma
+ public :: ieee_int
public :: ieee_is_nan
public :: ieee_is_negative
public :: ieee_is_normal
@@ -65,6 +68,7 @@ module ieee_arithmetic
public :: ieee_next_after
public :: ieee_next_down
public :: ieee_next_up
+ public :: ieee_real
public :: ieee_round_type
public :: ieee_scalb
public :: ieee_selected_real_kind
@@ -303,29 +307,6 @@ end subroutine ieee_get_underflow_mode_l##GKIND;
public :: ieee_get_underflow_mode
#undef IEEE_GET_UNDERFLOW_MODE_L
-! When kind argument is present, kind(result) is value(kind), not kind(kind).
-! That is not known here, so return integer(16).
-#define IEEE_INT_R(AKIND) \
- elemental integer function ieee_int_a##AKIND(a, round); \
- import ieee_round_type; \
- real(AKIND), intent(in) :: a; \
- type(ieee_round_type), intent(in) :: round; \
- end function ieee_int_a##AKIND;
-#define IEEE_INT_RI(AKIND, KKIND) \
- elemental integer(16) function ieee_int_a##AKIND##_i##KKIND(a, round, kind); \
- import ieee_round_type; \
- real(AKIND), intent(in) :: a; \
- type(ieee_round_type), intent(in) :: round; \
- integer(KKIND), intent(in) :: kind; \
- end function ieee_int_a##AKIND##_i##KKIND;
- interface ieee_int
- SPECIFICS_R(IEEE_INT_R)
- SPECIFICS_RI(IEEE_INT_RI)
- end interface ieee_int
- public :: ieee_int
-#undef IEEE_INT_R
-#undef IEEE_INT_RI
-
#define IEEE_IS_FINITE_R(XKIND) \
elemental logical function ieee_is_finite_a##XKIND(x); \
real(XKIND), intent(in) :: x; \
@@ -486,40 +467,6 @@ end function ieee_quiet_ne_a##AKIND;
public :: ieee_quiet_ne
#undef IEEE_QUIET_NE_R
-! When kind argument is present, kind(result) is value(kind), not kind(kind).
-! That is not known here, so return real(16).
-#define IEEE_REAL_I(AKIND) \
- elemental real function ieee_real_i##AKIND(a); \
- integer(AKIND), intent(in) :: a; \
- end function ieee_real_i##AKIND;
-#define IEEE_REAL_R(AKIND) \
- elemental real function ieee_real_a##AKIND(a); \
- real(AKIND), intent(in) :: a; \
- end function ieee_real_a##AKIND;
-#define IEEE_REAL_II(AKIND, KKIND) \
- elemental real(16) function ieee_real_i##AKIND##_i##KKIND(a, kind); \
- integer(AKIND), intent(in) :: a; \
- integer(KKIND), intent(in) :: kind; \
- end function ieee_real_i##AKIND##_i##KKIND;
-#define IEEE_REAL_RI(AKIND, KKIND) \
- elemental real(16) function ieee_real_a##AKIND##_i##KKIND(a, kind); \
- real(AKIND), intent(in) :: a; \
- integer(KKIND), intent(in) :: kind; \
- end function ieee_real_a##AKIND##_i##KKIND;
- interface ieee_real
- SPECIFICS_I(IEEE_REAL_I)
- SPECIFICS_R(IEEE_REAL_R)
-#if FLANG_SUPPORT_R16
- SPECIFICS_II(IEEE_REAL_II)
- SPECIFICS_RI(IEEE_REAL_RI)
-#endif
- end interface ieee_real
- public :: ieee_real
-#undef IEEE_REAL_I
-#undef IEEE_REAL_R
-#undef IEEE_REAL_II
-#undef IEEE_REAL_RI
-
#define IEEE_REM_RR(XKIND, YKIND) \
elemental real(XKIND) function ieee_rem_a##XKIND##_a##YKIND(x, y); \
real(XKIND), intent(in) :: x; \
diff --git a/flang/test/Semantics/ieee_int.f90 b/flang/test/Semantics/ieee_int.f90
new file mode 100644
index 00000000000000..3af554ad8706ae
--- /dev/null
+++ b/flang/test/Semantics/ieee_int.f90
@@ -0,0 +1,12 @@
+! RUN: %python %S/test_errors.py %s %flang_fc1
+use ieee_arithmetic, only: ieee_int, ieee_real, ieee_up
+implicit none
+print *, ieee_int(1.5, ieee_up)
+print *, ieee_int(1.5, ieee_up, 4)
+!ERROR: 'kind=' argument must be a constant scalar integer whose value is a supported kind for the intrinsic result type
+print *, ieee_int(1.5, ieee_up, 3)
+print *, ieee_real(1)
+print *, ieee_real(1, 4)
+!ERROR: 'kind=' argument must be a constant scalar integer whose value is a supported kind for the intrinsic result type
+print *, ieee_real(1, 7)
+end
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks!
For proper error detection of bad KIND= arguments, make IEEE_INT and IEEE_REAL actual intrinsic functions. Lowering will have to check for the new _builtin names.