xref: /llvm-project/compiler-rt/test/nsan/vec_sqrt.cpp (revision f1cf09104eddbbe81c75e112a85c4f8dc14d5035)
151365212SAlexander Shaposhnikov // RUN: %clangxx_nsan -O0 -g -mavx %s -o %t
2*f1cf0910SHarini0924 // RUN: env NSAN_OPTIONS=check_nan=true,halt_on_error=0 %run %t 2>&1 | FileCheck %s
351365212SAlexander Shaposhnikov // RUN: %clangxx_nsan -O3 -g -mavx %s -o %t
4*f1cf0910SHarini0924 // RUN: env NSAN_OPTIONS=check_nan=true,halt_on_error=0 %run %t 2>&1 | FileCheck %s
551365212SAlexander Shaposhnikov 
651365212SAlexander Shaposhnikov #include <cmath>
751365212SAlexander Shaposhnikov #include <immintrin.h>
851365212SAlexander Shaposhnikov #include <iostream>
951365212SAlexander Shaposhnikov 
1051365212SAlexander Shaposhnikov void simd_sqrt(const float *input, float *output, size_t size) {
1151365212SAlexander Shaposhnikov   size_t i = 0;
1251365212SAlexander Shaposhnikov   for (; i + 7 < size; i += 8) {
1351365212SAlexander Shaposhnikov     __m256 vec = _mm256_loadu_ps(&input[i]);
1451365212SAlexander Shaposhnikov     __m256 result = _mm256_sqrt_ps(vec);
1551365212SAlexander Shaposhnikov     _mm256_storeu_ps(&output[i], result);
1651365212SAlexander Shaposhnikov   }
1751365212SAlexander Shaposhnikov   for (; i < size; ++i) {
1851365212SAlexander Shaposhnikov     output[i] = std::sqrt(input[i]);
1951365212SAlexander Shaposhnikov     // CHECK: WARNING: NumericalStabilitySanitizer: NaN detected
2051365212SAlexander Shaposhnikov   }
2151365212SAlexander Shaposhnikov }
2251365212SAlexander Shaposhnikov 
2351365212SAlexander Shaposhnikov int main() {
2451365212SAlexander Shaposhnikov   float input[] = {1.0,  2.0,   -3.0,  4.0,   5.0,   6.0,  7.0,
2551365212SAlexander Shaposhnikov                    8.0,  9.0,   -10.0, 11.0,  12.0,  13.0, 14.0,
2651365212SAlexander Shaposhnikov                    15.0, -16.0, 17.0,  -18.0, -19.0, -20.0};
2751365212SAlexander Shaposhnikov   float output[20];
2851365212SAlexander Shaposhnikov   simd_sqrt(input, output, 20);
2951365212SAlexander Shaposhnikov   for (int i = 0; i < 20; ++i) {
3051365212SAlexander Shaposhnikov     std::cout << output[i] << std::endl;
3151365212SAlexander Shaposhnikov     // CHECK: WARNING: NumericalStabilitySanitizer: NaN detected
3251365212SAlexander Shaposhnikov   }
3351365212SAlexander Shaposhnikov   return 0;
3451365212SAlexander Shaposhnikov }
35