diff --git a/libdevice/fallback-complex-fp64.cpp b/libdevice/fallback-complex-fp64.cpp index 5ca69c0100962..5c4bc67924998 100644 --- a/libdevice/fallback-complex-fp64.cpp +++ b/libdevice/fallback-complex-fp64.cpp @@ -311,8 +311,8 @@ double __complex__ __devicelib_cacos(double __complex__ z) { return CMPLX(z_real, -z_imag); return CMPLX(z_real, z_real); } - if (__spirv_IsInf(z_real)) - return CMPLX(__pi / 2.0, -z_real); + if (__spirv_IsInf(z_imag)) + return CMPLX(__pi / 2.0, -z_imag); if (z_real == 0 && (z_imag == 0 || __spirv_IsNan(z_imag))) return CMPLX(__pi / 2.0, -z_imag); double __complex__ w = diff --git a/sycl/test-e2e/Regression/acos.cpp b/sycl/test-e2e/Regression/acos.cpp new file mode 100644 index 0000000000000..59cb130be0756 --- /dev/null +++ b/sycl/test-e2e/Regression/acos.cpp @@ -0,0 +1,39 @@ +// REQUIRES: aspect-fp64 +// UNSUPPORTED: cuda || hip + +// RUN: %{build} -o %t.out +// RUN: %{run} %t.out +#include +#include +#include + +using namespace sycl; +using T = std::complex; + +int main() { + queue q; + const double pi = std::atan2(+0., -0.); + T data[][2] = {{{-2, -INFINITY}, {pi / 2, INFINITY}}, + {{-0., INFINITY}, {pi / 2, -INFINITY}}}; + int N = std::size(data); + auto *p = malloc_shared(N, q); + + q.single_task([=] { + for (int i = 0; i < N; ++i) { + p[i] = std::acos(data[i][0]); + } + }).wait(); + + int fails = 0; + for (int i = 0; i < N; ++i) { + auto actual = p[i]; + auto expected = data[i][1]; + if (expected != actual) { + std::cout << i << " fail:" + << "expected = " << expected << ", actual = " << actual << "\n"; + ++fails; + } + } + + return fails; +}