diff --git a/SingleSource/UnitTests/Vectorizer/common.h b/SingleSource/UnitTests/Vectorizer/common.h new file mode 100644 --- /dev/null +++ b/SingleSource/UnitTests/Vectorizer/common.h @@ -0,0 +1,38 @@ +#include +#include + +#define DEFINE_SCALAR_AND_VECTOR_FN2(Init, Loop) \ + auto ScalarFn = [](auto *A, auto *B, unsigned TC) { \ + Init _Pragma("clang loop vectorize(disable) interleave_count(1)") Loop \ + }; \ + auto VectorFn = [](auto *A, auto *B, unsigned TC) { \ + Init _Pragma("clang loop vectorize(enable)") Loop \ + }; + +#define DEFINE_SCALAR_AND_VECTOR_FN3(Loop) \ + auto ScalarFn = [](auto *A, auto *B, auto *C, unsigned TC) { \ + _Pragma("clang loop vectorize(disable) interleave_count(1)") Loop \ + }; \ + auto VectorFn = [](auto *A, auto *B, auto *C, unsigned TC) { \ + _Pragma("clang loop vectorize(enable)") Loop \ + }; + +static std::mt19937 rng; + +// Initialize arrays A with random numbers. +template +static void init_data(const std::unique_ptr &A, unsigned N) { + std::uniform_int_distribution distrib( + std::numeric_limits::min(), std::numeric_limits::max()); + for (unsigned i = 0; i < N; i++) + A[i] = distrib(rng); +} + +template +static void check(const std::unique_ptr &Reference, + const std::unique_ptr &Tmp, unsigned NumElements) { + if (!std::equal(&Reference[0], &Reference[0] + NumElements, &Tmp[0])) { + std::cerr << "Miscompare\n"; + exit(1); + } +} diff --git a/SingleSource/UnitTests/Vectorizer/recurrences.cpp b/SingleSource/UnitTests/Vectorizer/recurrences.cpp --- a/SingleSource/UnitTests/Vectorizer/recurrences.cpp +++ b/SingleSource/UnitTests/Vectorizer/recurrences.cpp @@ -2,38 +2,11 @@ #include #include #include -#include #include -// Tests for vectorizing loops with recurrences. - -static std::mt19937 rng; - -// Initialize arrays A with random numbers. -template -static void init_data(const std::unique_ptr &A, unsigned N) { - std::uniform_int_distribution distrib( - std::numeric_limits::min(), std::numeric_limits::max()); - for (unsigned i = 0; i < N; i++) - A[i] = distrib(rng); -} +#include "common.h" -template -static void check(const std::unique_ptr &Reference, - const std::unique_ptr &Tmp, unsigned NumElements) { - if (!std::equal(&Reference[0], &Reference[0] + NumElements, &Tmp[0])) { - std::cerr << "Miscompare\n"; - exit(1); - } -} - -#define DEFINE_SCALAR_AND_VECTOR_FN2(Init, Loop) \ - auto ScalarFn = [](auto *A, auto *B, unsigned TC) { \ - Init _Pragma("clang loop vectorize(disable)") Loop \ - }; \ - auto VectorFn = [](auto *A, auto *B, unsigned TC) { \ - Init _Pragma("clang loop vectorize(enable)") Loop \ - }; +// Tests for vectorizing loops with recurrences. template using Fn2Ty = std::function; template diff --git a/SingleSource/UnitTests/Vectorizer/runtime-checks.cpp b/SingleSource/UnitTests/Vectorizer/runtime-checks.cpp --- a/SingleSource/UnitTests/Vectorizer/runtime-checks.cpp +++ b/SingleSource/UnitTests/Vectorizer/runtime-checks.cpp @@ -5,22 +5,13 @@ #include #include +#include "common.h" + // Tests for memory runtime checks generated by the vectorizer. Runs scalar and // vectorized versions of a loop requiring runtime checks on the same inputs // with pointers to the same buffer using various offsets between reads and // writes. Fails if they do not produce the same results. -static std::mt19937 rng; - -// Initialize arrays A with random numbers. -template -static void init_data(const std::unique_ptr &A, unsigned N) { - std::uniform_int_distribution distrib(std::numeric_limits::min(), - std::numeric_limits::max()); - for (unsigned i = 0; i < N; i++) - A[i] = distrib(rng); -} - template static void check(const std::unique_ptr &Reference, const std::unique_ptr &Tmp, unsigned NumElements, @@ -31,22 +22,6 @@ } } -#define DEFINE_SCALAR_AND_VECTOR_FN2(Loop) \ - auto ScalarFn = [](auto *A, auto *B, unsigned TC) { \ - _Pragma("clang loop vectorize(disable)") Loop \ - }; \ - auto VectorFn = [](auto *A, auto *B, unsigned TC) { \ - _Pragma("clang loop vectorize(enable)") Loop \ - }; - -#define DEFINE_SCALAR_AND_VECTOR_FN3(Loop) \ - auto ScalarFn = [](auto *A, auto *B, auto *C, unsigned TC) { \ - _Pragma("clang loop vectorize(disable)") Loop \ - }; \ - auto VectorFn = [](auto *A, auto *B, auto *C, unsigned TC) { \ - _Pragma("clang loop vectorize(enable)") Loop \ - }; - // Helper to call \p f with \p args and acts as optimization barrier for \p f. template __attribute__((optnone)) static void callThroughOptnone(F &&f, Args &&...args) { @@ -137,7 +112,7 @@ rng = std::mt19937(15); { - DEFINE_SCALAR_AND_VECTOR_FN2( + DEFINE_SCALAR_AND_VECTOR_FN2(, for (unsigned i = 0; i < TC; i++) A[i] = B[i] + 10; ); @@ -151,7 +126,7 @@ } { - DEFINE_SCALAR_AND_VECTOR_FN2( + DEFINE_SCALAR_AND_VECTOR_FN2(, for (unsigned i = 0; i < TC; i++) A[i] = B[i + 3] + 10; ); @@ -165,7 +140,7 @@ } { - DEFINE_SCALAR_AND_VECTOR_FN2( + DEFINE_SCALAR_AND_VECTOR_FN2(, for (unsigned i = 3; i < TC; i++) A[i] = B[i - 3] + 10; ); @@ -179,7 +154,7 @@ } { - DEFINE_SCALAR_AND_VECTOR_FN2( + DEFINE_SCALAR_AND_VECTOR_FN2(, for (unsigned i = TC; i > 0; i--) A[i] = B[i] + 10;); @@ -192,7 +167,7 @@ } { - DEFINE_SCALAR_AND_VECTOR_FN2( + DEFINE_SCALAR_AND_VECTOR_FN2(, for (unsigned i = TC; i > 2; i -= 2) A[i] = B[i] + 10; ); @@ -206,7 +181,7 @@ } { - DEFINE_SCALAR_AND_VECTOR_FN2( + DEFINE_SCALAR_AND_VECTOR_FN2(, for (unsigned i = 0, j = 0; i < TC; i++) { A[i] = B[j] + 10; j += 2; @@ -224,7 +199,7 @@ } { - DEFINE_SCALAR_AND_VECTOR_FN2( + DEFINE_SCALAR_AND_VECTOR_FN2(, _Pragma("clang loop unroll(disable)") for (unsigned i = 0; i < TC; i += 2) A[i] = B[i] + 10; @@ -240,7 +215,7 @@ } { - DEFINE_SCALAR_AND_VECTOR_FN2( + DEFINE_SCALAR_AND_VECTOR_FN2(, for (unsigned i = 0, sum = 0; i < TC; i++) { sum += A[i] + 10; B[TC / 2] = sum;