Skip to content

[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

Merged
merged 1 commit into from
Sep 20, 2024

Conversation

klausler
Copy link
Contributor

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.

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.
@klausler klausler requested a review from vdonaldson September 18, 2024 20:31
@llvmbot llvmbot added flang Flang issues not falling into any other category flang:semantics labels Sep 18, 2024
@llvmbot
Copy link
Member

llvmbot commented Sep 18, 2024

@llvm/pr-subscribers-flang-semantics

Author: Peter Klausler (klausler)

Changes

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.


Full diff: https://github.com/llvm/llvm-project/pull/109191.diff

4 Files Affected:

  • (modified) flang/lib/Evaluate/intrinsics.cpp (+4)
  • (modified) flang/module/__fortran_builtins.f90 (+4)
  • (modified) flang/module/ieee_arithmetic.f90 (+4-57)
  • (added) flang/test/Semantics/ieee_int.f90 (+12)
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

Copy link
Contributor

@vdonaldson vdonaldson left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@klausler klausler merged commit 7513892 into llvm:main Sep 20, 2024
11 checks passed
@klausler klausler deleted the bug1724 branch September 20, 2024 20:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
flang:semantics flang Flang issues not falling into any other category
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants