Skip to content

Commit e95bde0

Browse files
[SYCL] Align nan builtin with the updated specification (#12182)
Specification has been changed in KhronosGroup/SYCL-Docs#519.
1 parent 87de16b commit e95bde0

File tree

9 files changed

+103
-20
lines changed

9 files changed

+103
-20
lines changed

sycl/include/sycl/builtins_legacy_marray_vec.hpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,14 +412,28 @@ __SYCL_MARRAY_MATH_FUNCTION_REMQUO_OVERLOAD(remquo, x[j], y[j])
412412
#undef __SYCL_MARRAY_MATH_FUNCTION_W_GENPTR_ARG_OVERLOAD_IMPL
413413

414414
template <typename T, size_t N>
415-
std::enable_if_t<detail::is_nan_type_v<T>, marray<detail::nan_return_t<T>, N>>
415+
std::enable_if_t<detail::is_nan_type_v<T> &&
416+
detail::is_non_deprecated_nan_type_v<T>,
417+
marray<detail::nan_return_t<T>, N>>
416418
nan(marray<T, N> nancode) {
417419
marray<detail::nan_return_t<T>, N> res;
418420
for (int j = 0; j < N; j++) {
419421
res[j] = nan(nancode[j]);
420422
}
421423
return res;
422424
}
425+
template <typename T, size_t N>
426+
__SYCL_DEPRECATED(
427+
"This is a deprecated argument type for SYCL nan built-in function.")
428+
std::enable_if_t<detail::is_nan_type_v<T> &&
429+
!detail::is_non_deprecated_nan_type_v<T>,
430+
marray<detail::nan_return_t<T>, N>> nan(marray<T, N> nancode) {
431+
marray<detail::nan_return_t<T>, N> res;
432+
for (int j = 0; j < N; j++) {
433+
res[j] = nan(nancode[j]);
434+
}
435+
return res;
436+
}
423437

424438
/* --------------- 4.13.5 Common functions. ---------------------------------*/
425439
// vgenfloath clamp (vgenfloath x, half minval, half maxval)

sycl/include/sycl/builtins_legacy_scalar.hpp

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -322,8 +322,30 @@ modf(T x, T2 iptr) {
322322
return __sycl_std::__invoke_modf<T>(x, iptr);
323323
}
324324

325-
template <typename T, typename = std::enable_if_t<detail::is_nan_type_v<T>, T>>
326-
detail::nan_return_t<T> nan(T nancode) {
325+
namespace detail {
326+
// SYCL 2020, revision 9 modifies accepted overloads to scalar/vec/marray of
327+
// uint16_t/uint32_t/uint64_t.
328+
template <typename T>
329+
inline constexpr bool is_non_deprecated_nan_type_v =
330+
std::is_same_v<get_elem_type_t<T>, uint16_t> ||
331+
std::is_same_v<get_elem_type_t<T>, uint32_t> ||
332+
std::is_same_v<get_elem_type_t<T>, uint64_t>;
333+
} // namespace detail
334+
335+
template <typename T>
336+
std::enable_if_t<detail::is_nan_type_v<T> &&
337+
detail::is_non_deprecated_nan_type_v<T>,
338+
detail::nan_return_t<T>>
339+
nan(T nancode) {
340+
return __sycl_std::__invoke_nan<detail::nan_return_t<T>>(
341+
detail::convert_data_type<T, detail::nan_argument_base_t<T>>()(nancode));
342+
}
343+
template <typename T>
344+
__SYCL_DEPRECATED(
345+
"This is a deprecated argument type for SYCL nan built-in function.")
346+
std::enable_if_t<detail::is_nan_type_v<T> &&
347+
!detail::is_non_deprecated_nan_type_v<T>,
348+
detail::nan_return_t<T>> nan(T nancode) {
327349
return __sycl_std::__invoke_nan<detail::nan_return_t<T>>(
328350
detail::convert_data_type<T, detail::nan_argument_base_t<T>>()(nancode));
329351
}

sycl/include/sycl/builtins_utils_scalar.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,6 @@ template <typename T> struct nan_return_unswizzled {
206206

207207
template <typename T>
208208
using nan_return_unswizzled_t = typename nan_return_unswizzled<T>::type;
209-
210209
} // namespace detail
211210
} // namespace _V1
212211
} // namespace sycl

sycl/source/builtins_generator.py

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -317,12 +317,18 @@ def __str__(self):
317317
Vec(["uint64_t", "unsigned long long"])
318318
] # Fundamental integer types non-standard. Deprecated.
319319

320+
# vuint<N>n name is taken, use "_fixed" suffix.
321+
vuint16n_fixed = [Vec(["uint16_t"])]
322+
vuint32n_fixed = [Vec(["uint32_t"])]
323+
vuint64n_fixed = [Vec(["uint64_t"])]
324+
320325
mint8n = [Marray(["int8_t"])]
321326
mint16n = [Marray(["int16_t"])]
322327
mint32n = [Marray(["int32_t"])]
323328
muint8n = [Marray(["uint8_t"])]
324329
muint16n = [Marray(["uint16_t"])]
325330
muint32n = [Marray(["uint32_t"])]
331+
muint64n = [Marray(["uint64_t"])]
326332
mintn = [Marray(["int"])]
327333
mushortn = [Marray(["unsigned short"])]
328334
muintn = [Marray(["unsigned int"])]
@@ -594,12 +600,16 @@ def __str__(self):
594600
"vuint16n": vuint16n,
595601
"vuint32n": vuint32n,
596602
"vuint64n": vuint64n,
603+
"vuint16n_fixed": vuint16n_fixed,
604+
"vuint32n_fixed": vuint32n_fixed,
605+
"vuint64n_fixed": vuint64n_fixed,
597606
"mint8n": mint8n,
598607
"mint16n": mint16n,
599608
"mint32n": mint32n,
600609
"muint8n": muint8n,
601610
"muint16n": muint16n,
602611
"muint32n": muint32n,
612+
"muint64n": muint64n,
603613
"mintn": mintn,
604614
"mushortn": mushortn,
605615
"muintn": muintn,
@@ -1228,16 +1238,15 @@ def custom_nan_invoke(return_type, arg_types, arg_names):
12281238
Def("half", ["half", "halfptr"]),
12291239
],
12301240
"nan": [
1231-
Def("nanreturn0", ["vuint32n"], custom_invoke=custom_nan_invoke),
1232-
Def("nanreturn0", ["muintn"], marray_use_loop=True),
1233-
Def("nanreturn0", ["unsigned int"], custom_invoke=custom_nan_invoke),
1234-
Def("nanreturn0", ["vuint64n"], custom_invoke=custom_nan_invoke),
1235-
Def("nanreturn0", ["mulongn"], marray_use_loop=True),
1236-
Def("nanreturn0", ["unsigned long"], custom_invoke=custom_nan_invoke),
1237-
Def("nanreturn0", ["unsigned long long"], custom_invoke=custom_nan_invoke),
1238-
Def("nanreturn0", ["vuint16n"], custom_invoke=custom_nan_invoke),
1239-
Def("nanreturn0", ["mushortn"], marray_use_loop=True),
1240-
Def("nanreturn0", ["unsigned short"], custom_invoke=custom_nan_invoke),
1241+
Def("nanreturn0", ["uint16_t"], custom_invoke=custom_nan_invoke),
1242+
Def("nanreturn0", ["vuint16n_fixed"], custom_invoke=custom_nan_invoke),
1243+
Def("nanreturn0", ["muint16n"], marray_use_loop=True),
1244+
Def("nanreturn0", ["uint32_t"], custom_invoke=custom_nan_invoke),
1245+
Def("nanreturn0", ["vuint32n_fixed"], custom_invoke=custom_nan_invoke),
1246+
Def("nanreturn0", ["muint32n"], marray_use_loop=True),
1247+
Def("nanreturn0", ["uint64_t"], custom_invoke=custom_nan_invoke),
1248+
Def("nanreturn0", ["vuint64n_fixed"], custom_invoke=custom_nan_invoke),
1249+
Def("nanreturn0", ["muint64n"], marray_use_loop=True),
12411250
],
12421251
"nextafter": [Def("genfloat", ["genfloat", "genfloat"])],
12431252
"pow": [Def("genfloat", ["genfloat", "genfloat"])],

sycl/test-e2e/Basic/built-ins/marray_math.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,13 @@ int main() {
136136
sycl::marray<int, 3> ma4{1, 1, 1};
137137
sycl::marray<float, 3> ma5{180, -180, -180};
138138
sycl::marray<float, 3> ma6{1.4f, 4.2f, 5.3f};
139+
#ifndef __INTEL_PREVIEW_BREAKING_CHANGES
139140
sycl::marray<unsigned int, 3> ma7{1, 2, 3};
140141
sycl::marray<unsigned long int, 3> ma8{1, 2, 3};
142+
#else
143+
sycl::marray<uint32_t, 3> ma7{1, 2, 3};
144+
sycl::marray<uint64_t, 3> ma8{1, 2, 3};
145+
#endif
141146

142147
TEST(sycl::fabs, float, 3, EXPECTED(float, 180, 180, 180), 0, ma5);
143148
TEST(sycl::ilogb, int, 3, EXPECTED(int, 7, 7, 7), 0, ma3);

sycl/test-e2e/DeviceLib/built-ins/nan.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ template <typename T, typename R> void check_vec_nan(s::queue &Queue) {
4848
}
4949

5050
int main() {
51+
#ifndef __INTEL_PREVIEW_BREAKING_CHANGES
5152
test_nan_call<unsigned short, s::half>();
5253
test_nan_call<unsigned int, float>();
5354
test_nan_call<unsigned long, double>();
@@ -56,6 +57,14 @@ int main() {
5657
test_nan_call<s::uint2, s::float2>();
5758
test_nan_call<s::ulong2, s::double2>();
5859
test_nan_call<s::vec<unsigned long long, 2>, s::double2>();
60+
#else
61+
test_nan_call<uint16_t, s::half>();
62+
test_nan_call<uint32_t, float>();
63+
test_nan_call<uint64_t, double>();
64+
test_nan_call<s::vec<uint16_t, 2>, s::half2>();
65+
test_nan_call<s::vec<uint32_t, 2>, s::float2>();
66+
test_nan_call<s::vec<uint64_t, 2>, s::double2>();
67+
#endif
5968

6069
s::queue Queue([](sycl::exception_list ExceptionList) {
6170
for (std::exception_ptr ExceptionPtr : ExceptionList) {
@@ -70,17 +79,33 @@ int main() {
7079
});
7180

7281
if (Queue.get_device().has(sycl::aspect::fp16)) {
82+
#ifndef __INTEL_PREVIEW_BREAKING_CHANGES
7383
check_scalar_nan<unsigned short, s::half>(Queue);
7484
check_vec_nan<uint16_t, s::half>(Queue);
85+
#else
86+
check_scalar_nan<uint16_t, s::half>(Queue);
87+
check_vec_nan<uint16_t, s::half>(Queue);
88+
#endif
7589
}
7690

91+
#ifndef __INTEL_PREVIEW_BREAKING_CHANGES
7792
check_scalar_nan<unsigned int, float>(Queue);
7893
check_vec_nan<uint32_t, float>(Queue);
94+
#else
95+
check_scalar_nan<uint32_t, float>(Queue);
96+
check_vec_nan<uint32_t, float>(Queue);
97+
#endif
98+
7999
if (Queue.get_device().has(sycl::aspect::fp64)) {
100+
#ifndef __INTEL_PREVIEW_BREAKING_CHANGES
80101
check_scalar_nan<unsigned long, double>(Queue);
81102
check_scalar_nan<unsigned long long, double>(Queue);
82103
check_vec_nan<uint64_t, double>(Queue);
83104
check_vec_nan<unsigned long long, double>(Queue);
105+
#else
106+
check_scalar_nan<uint64_t, double>(Queue);
107+
check_vec_nan<uint64_t, double>(Queue);
108+
#endif
84109
}
85110
return 0;
86111
}

sycl/test/basic_tests/builtins_implicitly_convertible_args.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ template <typename T> struct ImplicitlyConvertibleType {
4343
CHECK_INNER(NUM_ARGS, FUNC_NAME, double)
4444

4545
#define UGENINT_NAN_CHECK(NUM_ARGS, FUNC_NAME) \
46-
CHECK_INNER(NUM_ARGS, FUNC_NAME, unsigned int) \
47-
CHECK_INNER(NUM_ARGS, FUNC_NAME, unsigned short) \
48-
CHECK_INNER(NUM_ARGS, FUNC_NAME, unsigned long)
46+
CHECK_INNER(NUM_ARGS, FUNC_NAME, uint32_t) \
47+
CHECK_INNER(NUM_ARGS, FUNC_NAME, uint16_t) \
48+
CHECK_INNER(NUM_ARGS, FUNC_NAME, uint64_t)
4949

5050
void check() {
5151
GENFLOAT_CHECK(ONE_ARG, acos)

sycl/test/basic_tests/builtins_templates.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@
4545
CHECK_INNER(NUM_ARGS, FUNC_NAME, sycl::vec<uint32_t, 4>) \
4646
CHECK_INNER(NUM_ARGS, FUNC_NAME, sycl::vec<uint16_t, 4>) \
4747
CHECK_INNER(NUM_ARGS, FUNC_NAME, sycl::vec<uint64_t, 4>) \
48-
CHECK_INNER(NUM_ARGS, FUNC_NAME, sycl::marray<unsigned int, 4>) \
49-
CHECK_INNER(NUM_ARGS, FUNC_NAME, sycl::marray<unsigned short, 4>) \
50-
CHECK_INNER(NUM_ARGS, FUNC_NAME, sycl::marray<unsigned long, 4>)
48+
CHECK_INNER(NUM_ARGS, FUNC_NAME, sycl::marray<uint32_t, 4>) \
49+
CHECK_INNER(NUM_ARGS, FUNC_NAME, sycl::marray<uint16_t, 4>) \
50+
CHECK_INNER(NUM_ARGS, FUNC_NAME, sycl::marray<uint64_t, 4>)
5151

5252
#define SGENINT_CHECK(NUM_ARGS, FUNC_NAME) \
5353
CHECK_INNER(NUM_ARGS, FUNC_NAME, signed char) \

sycl/test/warnings/sycl_2020_deprecations.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,5 +454,14 @@ int main() {
454454
std::ignore =
455455
sycl::fast_distance(sycl::vec<double, 2>{0.0}, sycl::vec<double, 2>{1.0});
456456

457+
// clang-format off
458+
// SYCL 2020, revision 9 uses fixed-width integer type, one of these has to be
459+
// deprecated.
460+
// expected-warning-re@+1 {{'nan<{{.*}}>' is deprecated: This is a deprecated argument type for SYCL nan built-in function.}}
461+
std::ignore = (sycl::nan((unsigned long){0}), sycl::nan((unsigned long long){0}));
462+
// expected-warning-re@+1 {{'nan<sycl::vec<{{.*}}, 2>>' is deprecated: This is a deprecated argument type for SYCL nan built-in function.}}
463+
std::ignore = (sycl::nan(sycl::vec<unsigned long, 2>{0}), sycl::nan(sycl::vec<unsigned long long, 2>{0}));
464+
// clang-format on
465+
457466
return 0;
458467
}

0 commit comments

Comments
 (0)