From 20feca47c1e2fdd90f3f7007a492e4ec18c71c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Valentin=20Clement=20=28=E3=83=90=E3=83=AC=E3=83=B3?= =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=B3=20=E3=82=AF=E3=83=AC=E3=83=A1?= =?UTF-8?q?=E3=83=B3=29?= Date: Wed, 19 Mar 2025 07:20:06 -0700 Subject: [PATCH] [flang][cuda] Allow ieee_arithmetic on the device (#131930) - Allow ieee_arithmetic on the device - Add ignore_tkr(d) to ieee_is_finite --- flang/lib/Semantics/check-cuda.cpp | 8 ++++++++ flang/module/ieee_arithmetic.f90 | 1 + flang/test/Semantics/cuf09.cuf | 12 ++++++++++++ 3 files changed, 21 insertions(+) diff --git a/flang/lib/Semantics/check-cuda.cpp b/flang/lib/Semantics/check-cuda.cpp index cb7a383284e6..dea170f7e099 100644 --- a/flang/lib/Semantics/check-cuda.cpp +++ b/flang/lib/Semantics/check-cuda.cpp @@ -82,6 +82,14 @@ struct DeviceExprChecker } } } + const Symbol &ultimate{sym->GetUltimate()}; + const Scope &scope{ultimate.owner()}; + const Symbol *mod{scope.IsModule() ? scope.symbol() : nullptr}; + // Allow ieee_arithmetic module functions to be called on the device. + // TODO: Check for unsupported ieee_arithmetic on the device. + if (mod && mod->name() == "ieee_arithmetic") { + return {}; + } } else if (x.GetSpecificIntrinsic()) { // TODO(CUDA): Check for unsupported intrinsics here return {}; diff --git a/flang/module/ieee_arithmetic.f90 b/flang/module/ieee_arithmetic.f90 index 45016e84de7a..4e938a2daaa9 100644 --- a/flang/module/ieee_arithmetic.f90 +++ b/flang/module/ieee_arithmetic.f90 @@ -339,6 +339,7 @@ module ieee_arithmetic #define IEEE_IS_FINITE_R(XKIND) \ elemental logical function ieee_is_finite_a##XKIND(x); \ real(XKIND), intent(in) :: x; \ + !dir$ ignore_tkr(d) x; \ end function ieee_is_finite_a##XKIND; interface ieee_is_finite SPECIFICS_R(IEEE_IS_FINITE_R) diff --git a/flang/test/Semantics/cuf09.cuf b/flang/test/Semantics/cuf09.cuf index a8c62db65c6d..b59d02192f61 100644 --- a/flang/test/Semantics/cuf09.cuf +++ b/flang/test/Semantics/cuf09.cuf @@ -209,3 +209,15 @@ subroutine host1() a(i) = a(i) + a(j) - 34.0 end do end + +subroutine ieee_test + use ieee_arithmetic + + real(8), device :: y(100) + logical(4), managed :: ll(100) + + !$cuf kernel do(1)<<<*,*>>> + do i = 1, 100 + ll(i) = ieee_is_finite(y(i)) ! allow ieee_arithmetic functions on the device. + end do +end subroutine