From 2d91c44982888f6554cd88de52ee0bdba2d16bc2 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Tue, 20 Feb 2024 14:42:20 -0800 Subject: [PATCH 01/18] [NFC] Ensuring lowering of llvm.bitreverse is functionally correct Signed-off-by: Lu, John --- .../LLVMIntrinsicLowering/bitreverse.cpp | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp new file mode 100644 index 0000000000000..45f9f7a6d0cb4 --- /dev/null +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -0,0 +1,189 @@ +// Test that llvm.bitreverse is lowered correctly by llvm-spirv + +// RUN: %{build} -o %t.O2.out -O2 +// RUN: %{run} %t.O2.out | FileCheck %s + +// CHECK: Passed bitreverse 8 1 +// CHECK: Passed bitreverse 16 2 +// CHECK: Passed bitreverse 32 4 +// CHECK: Passed bitreverse 64 8 + +// CHECK: Passed bitreverse 8 2 +// CHECK: Passed bitreverse 16 4 +// CHECK: Passed bitreverse 32 8 +// CHECK: Passed bitreverse 64 16 + +// CHECK: Passed bitreverse 8 4 +// CHECK: Passed bitreverse 16 8 +// CHECK: Passed bitreverse 32 16 +// CHECK: Passed bitreverse 64 32 + +#include +#include +#include + +using namespace sycl; + +//////////////////////////////////////////////////////////////////////////////////// +// 8-bit +//////////////////////////////////////////////////////////////////////////////////// +template +__attribute__((optnone, noinline)) UINT8 reference_reverse8(UINT8 a) { + a = ((0x55 & a) << 1) | (0x55 & (a >> 1)); + a = ((0x33 & a) << 2) | (0x33 & (a >> 2)); + return (a << 4) | (a >> 4); +} +template +__attribute__((noinline)) UINT8 reverse8(UINT8 a) { + a = ((0x55 & a) << 1) | (0x55 & (a >> 1)); + a = ((0x33 & a) << 2) | (0x33 & (a >> 2)); + return (a << 4) | (a >> 4); +} +template +void do_bitreverse_test8() { + for (uint8_t u=0 ; u<250; u++) { + UINT8 data=u; + UINT8 ref[1]; + UINT8 opt[1]; + + ref[0] = reference_reverse8(data); + opt[0] = reverse8(data); + if (memcmp(ref,opt,sizeof(UINT8))) return; + } + ext::oneapi::experimental::printf("Passed bitreverse 8 %2d\n",sizeof(UINT8)); +} + +//////////////////////////////////////////////////////////////////////////////////// +// 16-bit +//////////////////////////////////////////////////////////////////////////////////// +template +__attribute__((optnone, noinline)) UINT16 reference_reverse16(UINT16 a) { + a = ((0x5555 & a) << 1) | (0x5555 & (a >> 1)); + a = ((0x3333 & a) << 2) | (0x3333 & (a >> 2)); + a = ((0x0F0F & a) << 4) | (0x0F0F & (a >> 4)); + return (a << 8) | (a >> 8); +} +template +__attribute__((noinline)) UINT16 reverse16(UINT16 a) { + a = ((0x5555 & a) << 1) | (0x5555 & (a >> 1)); + a = ((0x3333 & a) << 2) | (0x3333 & (a >> 2)); + a = ((0x0F0F & a) << 4) | (0x0F0F & (a >> 4)); + return (a << 8) | (a >> 8); +} + +template +void do_bitreverse_test16() { + for (uint16_t u=0 ; u<0xFF00; u+=0x13) { + UINT16 data=u; + UINT16 ref[1]; + UINT16 opt[1]; + + ref[0] = reference_reverse16(data); + opt[0] = reverse16(data); + if (memcmp(ref,opt,sizeof(UINT16))) return; + } + ext::oneapi::experimental::printf("Passed bitreverse 16 %2d\n",sizeof(UINT16)); +} + +//////////////////////////////////////////////////////////////////////////////////// +// 32-bit +//////////////////////////////////////////////////////////////////////////////////// +template +__attribute__((optnone, noinline)) UINT32 reference_reverse32(UINT32 a) { + a = ((0x55555555 & a) << 1) | (0x55555555 & (a >> 1)); + a = ((0x33333333 & a) << 2) | (0x33333333 & (a >> 2)); + a = ((0x0F0F0F0F & a) << 4) | (0x0F0F0F0F & (a >> 4)); + a = ((0x00FF00FF & a) << 8) | (0x00FF00FF & (a >> 8)); + return (a << 16) | (a >> 16); +} +template +__attribute__((noinline)) UINT32 reverse32(UINT32 a) { + a = ((0x55555555 & a) << 1) | (0x55555555 & (a >> 1)); + a = ((0x33333333 & a) << 2) | (0x33333333 & (a >> 2)); + a = ((0x0F0F0F0F & a) << 4) | (0x0F0F0F0F & (a >> 4)); + a = ((0x00FF00FF & a) << 8) | (0x00FF00FF & (a >> 8)); + return (a << 16) | (a >> 16); +} +template +void do_bitreverse_test32() { + for (uint32_t u=0 ; u<(0xFF<<24); u+=0xABCD13) { + UINT32 data=u; + UINT32 ref[1]; + UINT32 opt[1]; + + ref[0] = reference_reverse32(data); + opt[0] = reverse32(data); + if (memcmp(ref,opt,sizeof(UINT32))) return; + } + ext::oneapi::experimental::printf("Passed bitreverse 32 %2d\n",sizeof(UINT32)); +} + +//////////////////////////////////////////////////////////////////////////////////// +// 64-bit +//////////////////////////////////////////////////////////////////////////////////// +template +__attribute__((optnone, noinline)) UINT64 reference_reverse64(UINT64 a) { + a = ((0x5555555555555555UL & a) << 1) | (0x5555555555555555UL & (a >> 1)); + a = ((0x3333333333333333UL & a) << 2) | (0x3333333333333333UL & (a >> 2)); + a = ((0x0F0F0F0F0F0F0F0FUL & a) << 4) | (0x0F0F0F0F0F0F0F0FUL & (a >> 4)); + a = ((0x00FF00FF00FF00FFUL & a) << 8) | (0x00FF00FF00FF00FFUL & (a >> 8)); + a = ((0x0000FFFF0000FFFFUL & a) <<16) | (0x0000FFFF0000FFFFUL & (a >>16)); + return (a << 32) | (a >> 32); +} +template +__attribute__((noinline)) UINT64 reverse64(UINT64 a) { + a = ((0x5555555555555555UL & a) << 1) | (0x5555555555555555UL & (a >> 1)); + a = ((0x3333333333333333UL & a) << 2) | (0x3333333333333333UL & (a >> 2)); + a = ((0x0F0F0F0F0F0F0F0FUL & a) << 4) | (0x0F0F0F0F0F0F0F0FUL & (a >> 4)); + a = ((0x00FF00FF00FF00FFUL & a) << 8) | (0x00FF00FF00FF00FFUL & (a >> 8)); + a = ((0x0000FFFF0000FFFFUL & a) <<16) | (0x0000FFFF0000FFFFUL & (a >>16)); + return (a << 32) | (a >> 32); +} +template +void do_bitreverse_test64() { + for (uint64_t u=0 ; u<(0xFFUL<<56); u+=0xABCDABCDABCD13UL) { + UINT64 data=u; + UINT64 ref[1]; + UINT64 opt[1]; + + ref[0] = reference_reverse64(data); + opt[0] = reverse64(data); + if (memcmp(ref,opt,sizeof(UINT64))) return; + } + ext::oneapi::experimental::printf("Passed bitreverse 64 %2d\n",sizeof(UINT64)); +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +template class BitreverseTest; + +template +void testTypes() { + queue q; + + q.submit([](handler &cgh) { cgh.single_task> ([]() { do_bitreverse_test8 (); }); }); q.wait(); + q.submit([](handler &cgh) { cgh.single_task>([]() { do_bitreverse_test16(); }); }); q.wait(); + q.submit([](handler &cgh) { cgh.single_task>([]() { do_bitreverse_test32(); }); }); q.wait(); + q.submit([](handler &cgh) { cgh.single_task>([]() { do_bitreverse_test64(); }); }); q.wait(); +} + +typedef uint8_t uint8_t2 __attribute__((ext_vector_type(2))); +typedef uint16_t uint16_t2 __attribute__((ext_vector_type(2))); +typedef uint32_t uint32_t2 __attribute__((ext_vector_type(2))); +typedef uint64_t uint64_t2 __attribute__((ext_vector_type(2))); + +typedef uint8_t uint8_t4 __attribute__((ext_vector_type(4))); +typedef uint16_t uint16_t4 __attribute__((ext_vector_type(4))); +typedef uint32_t uint32_t4 __attribute__((ext_vector_type(4))); +typedef uint64_t uint64_t4 __attribute__((ext_vector_type(4))); + +int main() { + queue q; + + testTypes (); + testTypes (); + testTypes (); + + return 0; +} + From 76da721864e7dad62a26a4703fa24dabb29e446c Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Mon, 26 Feb 2024 14:03:21 -0800 Subject: [PATCH 02/18] Do not check for string results. Program will return non-zero for a failure. Signed-off-by: Lu, John --- .../LLVMIntrinsicLowering/bitreverse.cpp | 106 +++++++++--------- 1 file changed, 55 insertions(+), 51 deletions(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 45f9f7a6d0cb4..ec9dcb84ea228 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -1,22 +1,7 @@ // Test that llvm.bitreverse is lowered correctly by llvm-spirv -// RUN: %{build} -o %t.O2.out -O2 -// RUN: %{run} %t.O2.out | FileCheck %s - -// CHECK: Passed bitreverse 8 1 -// CHECK: Passed bitreverse 16 2 -// CHECK: Passed bitreverse 32 4 -// CHECK: Passed bitreverse 64 8 - -// CHECK: Passed bitreverse 8 2 -// CHECK: Passed bitreverse 16 4 -// CHECK: Passed bitreverse 32 8 -// CHECK: Passed bitreverse 64 16 - -// CHECK: Passed bitreverse 8 4 -// CHECK: Passed bitreverse 16 8 -// CHECK: Passed bitreverse 32 16 -// CHECK: Passed bitreverse 64 32 +// RUN: %{build} -o %t.out -O2 +// RUN: %{run} %t.out #include #include @@ -40,17 +25,17 @@ __attribute__((noinline)) UINT8 reverse8(UINT8 a) { return (a << 4) | (a >> 4); } template -void do_bitreverse_test8() { +void do_bitreverse_test8(int *result) { for (uint8_t u=0 ; u<250; u++) { UINT8 data=u; - UINT8 ref[1]; - UINT8 opt[1]; + UINT8 ref = reference_reverse8(data); + UINT8 opt = reverse8(data); - ref[0] = reference_reverse8(data); - opt[0] = reverse8(data); - if (memcmp(ref,opt,sizeof(UINT8))) return; + if (memcmp(&ref,&opt,sizeof(UINT8))) { + *result=1; + return; + } } - ext::oneapi::experimental::printf("Passed bitreverse 8 %2d\n",sizeof(UINT8)); } //////////////////////////////////////////////////////////////////////////////////// @@ -72,17 +57,17 @@ __attribute__((noinline)) UINT16 reverse16(UINT16 a) { } template -void do_bitreverse_test16() { +void do_bitreverse_test16(int *result) { for (uint16_t u=0 ; u<0xFF00; u+=0x13) { UINT16 data=u; - UINT16 ref[1]; - UINT16 opt[1]; - - ref[0] = reference_reverse16(data); - opt[0] = reverse16(data); - if (memcmp(ref,opt,sizeof(UINT16))) return; + UINT16 ref = reference_reverse16(data); + UINT16 opt = reverse16(data); + + if (memcmp(&ref,&opt,sizeof(UINT16))) { + *result=1; + return; + } } - ext::oneapi::experimental::printf("Passed bitreverse 16 %2d\n",sizeof(UINT16)); } //////////////////////////////////////////////////////////////////////////////////// @@ -105,17 +90,17 @@ __attribute__((noinline)) UINT32 reverse32(UINT32 a) { return (a << 16) | (a >> 16); } template -void do_bitreverse_test32() { +void do_bitreverse_test32(int *result) { for (uint32_t u=0 ; u<(0xFF<<24); u+=0xABCD13) { UINT32 data=u; - UINT32 ref[1]; - UINT32 opt[1]; + UINT32 ref = reference_reverse32(data); + UINT32 opt = reverse32(data); - ref[0] = reference_reverse32(data); - opt[0] = reverse32(data); - if (memcmp(ref,opt,sizeof(UINT32))) return; + if (memcmp(&ref,&opt,sizeof(UINT32))) { + *result=1; + return; + } } - ext::oneapi::experimental::printf("Passed bitreverse 32 %2d\n",sizeof(UINT32)); } //////////////////////////////////////////////////////////////////////////////////// @@ -136,21 +121,21 @@ __attribute__((noinline)) UINT64 reverse64(UINT64 a) { a = ((0x3333333333333333UL & a) << 2) | (0x3333333333333333UL & (a >> 2)); a = ((0x0F0F0F0F0F0F0F0FUL & a) << 4) | (0x0F0F0F0F0F0F0F0FUL & (a >> 4)); a = ((0x00FF00FF00FF00FFUL & a) << 8) | (0x00FF00FF00FF00FFUL & (a >> 8)); - a = ((0x0000FFFF0000FFFFUL & a) <<16) | (0x0000FFFF0000FFFFUL & (a >>16)); + a = ((0x0000FFFF0000FFFFUL & a) <<16) | (0x0000FFFF0000FFFFUL & (a >>16)); return (a << 32) | (a >> 32); } template -void do_bitreverse_test64() { +void do_bitreverse_test64(int *result) { for (uint64_t u=0 ; u<(0xFFUL<<56); u+=0xABCDABCDABCD13UL) { UINT64 data=u; - UINT64 ref[1]; - UINT64 opt[1]; + UINT64 ref = reference_reverse64(data); + UINT64 opt = reverse64(data); - ref[0] = reference_reverse64(data); - opt[0] = reverse64(data); - if (memcmp(ref,opt,sizeof(UINT64))) return; + if (memcmp(&ref,&opt,sizeof(UINT64))) { + *result=1; + return; + } } - ext::oneapi::experimental::printf("Passed bitreverse 64 %2d\n",sizeof(UINT64)); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -161,10 +146,29 @@ template void testTypes() { queue q; - q.submit([](handler &cgh) { cgh.single_task> ([]() { do_bitreverse_test8 (); }); }); q.wait(); - q.submit([](handler &cgh) { cgh.single_task>([]() { do_bitreverse_test16(); }); }); q.wait(); - q.submit([](handler &cgh) { cgh.single_task>([]() { do_bitreverse_test32(); }); }); q.wait(); - q.submit([](handler &cgh) { cgh.single_task>([]() { do_bitreverse_test64(); }); }); q.wait(); + int *result = (int *) malloc_host(sizeof(int),q); + *result=0; + + q.submit([=](handler &cgh) { cgh.single_task> ([=]() { do_bitreverse_test8 (result); }); }); q.wait(); + if (*result) { + std::cerr << "Failed bitreverse 8-bit, #elements=" << sizeof(UINT8)/sizeof(uint8_t) <<"\n"; + exit(1); + } + q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test16(result); }); }); q.wait(); + if (*result) { + std::cerr << "Failed bitreverse 16-bit, #elements=" << sizeof(UINT16)/sizeof(uint16_t) <<"\n"; + exit(1); + } + q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test32(result); }); }); q.wait(); + if (*result) { + std::cerr << "Failed bitreverse 32-bit, #elements=" << sizeof(UINT32)/sizeof(uint32_t) <<"\n"; + exit(1); + } + q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test64(result); }); }); q.wait(); + if (*result) { + std::cerr << "Failed bitreverse 64-bit, #elements=" << sizeof(UINT64)/sizeof(uint64_t) <<"\n"; + exit(1); + } } typedef uint8_t uint8_t2 __attribute__((ext_vector_type(2))); From b17df1208ece4b6dbe77a354314aeabbba200679 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Mon, 26 Feb 2024 14:12:53 -0800 Subject: [PATCH 03/18] Use 'using' instead of 'typedef' Signed-off-by: Lu, John --- .../LLVMIntrinsicLowering/bitreverse.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index ec9dcb84ea228..d36eaa189e5ee 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -171,15 +171,15 @@ void testTypes() { } } -typedef uint8_t uint8_t2 __attribute__((ext_vector_type(2))); -typedef uint16_t uint16_t2 __attribute__((ext_vector_type(2))); -typedef uint32_t uint32_t2 __attribute__((ext_vector_type(2))); -typedef uint64_t uint64_t2 __attribute__((ext_vector_type(2))); - -typedef uint8_t uint8_t4 __attribute__((ext_vector_type(4))); -typedef uint16_t uint16_t4 __attribute__((ext_vector_type(4))); -typedef uint32_t uint32_t4 __attribute__((ext_vector_type(4))); -typedef uint64_t uint64_t4 __attribute__((ext_vector_type(4))); +using uint8_t2 = uint8_t __attribute__((ext_vector_type(2))); +using uint16_t2 = uint16_t __attribute__((ext_vector_type(2))); +using uint32_t2 = uint32_t __attribute__((ext_vector_type(2))); +using uint64_t2 = uint64_t __attribute__((ext_vector_type(2))); + +using uint8_t4 = uint8_t __attribute__((ext_vector_type(4))); +using uint16_t4 = uint16_t __attribute__((ext_vector_type(4))); +using uint32_t4 = uint32_t __attribute__((ext_vector_type(4))); +using uint64_t4 = uint64_t __attribute__((ext_vector_type(4))); int main() { queue q; From 13f4c8af470d2d4a44ec246891a51edb9f09f889 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Tue, 27 Feb 2024 13:02:27 -0800 Subject: [PATCH 04/18] Do not test on HIP/CUDA. This test is testing lowering in llvm-spirv which is not used by HIP/CUDA. Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index d36eaa189e5ee..03875b539eb16 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -1,5 +1,7 @@ // Test that llvm.bitreverse is lowered correctly by llvm-spirv +// UNSUPPORTED: hip || cuda + // RUN: %{build} -o %t.out -O2 // RUN: %{run} %t.out From 084981e4c2315b7241dbf9c62717e5b20bb425e7 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Wed, 28 Feb 2024 12:33:42 -0800 Subject: [PATCH 05/18] Test 3,8,16-element vectors Signed-off-by: Lu, John --- .../LLVMIntrinsicLowering/bitreverse.cpp | 50 +++++++++++++------ 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 03875b539eb16..18b170e733a95 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -27,13 +27,13 @@ __attribute__((noinline)) UINT8 reverse8(UINT8 a) { return (a << 4) | (a >> 4); } template -void do_bitreverse_test8(int *result) { +void do_bitreverse_test8(int *result, int bytesize) { for (uint8_t u=0 ; u<250; u++) { UINT8 data=u; UINT8 ref = reference_reverse8(data); UINT8 opt = reverse8(data); - if (memcmp(&ref,&opt,sizeof(UINT8))) { + if (memcmp(&ref,&opt,bytesize)) { *result=1; return; } @@ -59,13 +59,13 @@ __attribute__((noinline)) UINT16 reverse16(UINT16 a) { } template -void do_bitreverse_test16(int *result) { +void do_bitreverse_test16(int *result, int bytesize) { for (uint16_t u=0 ; u<0xFF00; u+=0x13) { UINT16 data=u; UINT16 ref = reference_reverse16(data); UINT16 opt = reverse16(data); - if (memcmp(&ref,&opt,sizeof(UINT16))) { + if (memcmp(&ref,&opt,bytesize)) { *result=1; return; } @@ -92,13 +92,13 @@ __attribute__((noinline)) UINT32 reverse32(UINT32 a) { return (a << 16) | (a >> 16); } template -void do_bitreverse_test32(int *result) { +void do_bitreverse_test32(int *result, int bytesize) { for (uint32_t u=0 ; u<(0xFF<<24); u+=0xABCD13) { UINT32 data=u; UINT32 ref = reference_reverse32(data); UINT32 opt = reverse32(data); - if (memcmp(&ref,&opt,sizeof(UINT32))) { + if (memcmp(&ref,&opt,bytesize)) { *result=1; return; } @@ -127,13 +127,13 @@ __attribute__((noinline)) UINT64 reverse64(UINT64 a) { return (a << 32) | (a >> 32); } template -void do_bitreverse_test64(int *result) { +void do_bitreverse_test64(int *result, int bytesize) { for (uint64_t u=0 ; u<(0xFFUL<<56); u+=0xABCDABCDABCD13UL) { UINT64 data=u; UINT64 ref = reference_reverse64(data); UINT64 opt = reverse64(data); - if (memcmp(&ref,&opt,sizeof(UINT64))) { + if (memcmp(&ref,&opt,bytesize)) { *result=1; return; } @@ -145,28 +145,28 @@ void do_bitreverse_test64(int *result) { template class BitreverseTest; template -void testTypes() { +void testTypes(int elements) { queue q; int *result = (int *) malloc_host(sizeof(int),q); *result=0; - q.submit([=](handler &cgh) { cgh.single_task> ([=]() { do_bitreverse_test8 (result); }); }); q.wait(); + q.submit([=](handler &cgh) { cgh.single_task> ([=]() { do_bitreverse_test8 (result,elements*sizeof(uint8_t)); }); }); q.wait(); if (*result) { std::cerr << "Failed bitreverse 8-bit, #elements=" << sizeof(UINT8)/sizeof(uint8_t) <<"\n"; exit(1); } - q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test16(result); }); }); q.wait(); + q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test16(result,elements*sizeof(uint16_t)); }); }); q.wait(); if (*result) { std::cerr << "Failed bitreverse 16-bit, #elements=" << sizeof(UINT16)/sizeof(uint16_t) <<"\n"; exit(1); } - q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test32(result); }); }); q.wait(); + q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test32(result,elements*sizeof(uint32_t)); }); }); q.wait(); if (*result) { std::cerr << "Failed bitreverse 32-bit, #elements=" << sizeof(UINT32)/sizeof(uint32_t) <<"\n"; exit(1); } - q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test64(result); }); }); q.wait(); + q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test64(result,elements*sizeof(uint64_t)); }); }); q.wait(); if (*result) { std::cerr << "Failed bitreverse 64-bit, #elements=" << sizeof(UINT64)/sizeof(uint64_t) <<"\n"; exit(1); @@ -178,17 +178,35 @@ using uint16_t2 = uint16_t __attribute__((ext_vector_type(2))); using uint32_t2 = uint32_t __attribute__((ext_vector_type(2))); using uint64_t2 = uint64_t __attribute__((ext_vector_type(2))); +using uint8_t3 = uint8_t __attribute__((ext_vector_type(3))); +using uint16_t3 = uint16_t __attribute__((ext_vector_type(3))); +using uint32_t3 = uint32_t __attribute__((ext_vector_type(3))); +using uint64_t3 = uint64_t __attribute__((ext_vector_type(3))); + using uint8_t4 = uint8_t __attribute__((ext_vector_type(4))); using uint16_t4 = uint16_t __attribute__((ext_vector_type(4))); using uint32_t4 = uint32_t __attribute__((ext_vector_type(4))); using uint64_t4 = uint64_t __attribute__((ext_vector_type(4))); +using uint8_t8 = uint8_t __attribute__((ext_vector_type(8))); +using uint16_t8 = uint16_t __attribute__((ext_vector_type(8))); +using uint32_t8 = uint32_t __attribute__((ext_vector_type(8))); +using uint64_t8 = uint64_t __attribute__((ext_vector_type(8))); + +using uint8_t16 = uint8_t __attribute__((ext_vector_type(16))); +using uint16_t16 = uint16_t __attribute__((ext_vector_type(16))); +using uint32_t16 = uint32_t __attribute__((ext_vector_type(16))); +using uint64_t16 = uint64_t __attribute__((ext_vector_type(16))); + int main() { queue q; - testTypes (); - testTypes (); - testTypes (); + testTypes (1); + testTypes (2); + testTypes (3); + testTypes (4); + testTypes (8); + testTypes (16); return 0; } From ba6aff3adaa1c62a5b7353ca402925f12b2f0947 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Tue, 5 Mar 2024 15:04:20 -0800 Subject: [PATCH 06/18] Simplify reference calculation. Use builtin to ensure llvm bitreverse intrinsic. Signed-off-by: Lu, John --- .../LLVMIntrinsicLowering/bitreverse.cpp | 79 ++++++------------- 1 file changed, 24 insertions(+), 55 deletions(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 18b170e733a95..b03e5be749344 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -11,16 +11,26 @@ using namespace sycl; +template +__attribute__((optnone, noinline)) TYPE reference_reverse(TYPE a, const int bitlength) { + TYPE ret = 0; + for (auto i = 0; i>=1; + } + return ret; +} + +template +__attribute__((noinline)) TYPE reverse(TYPE a) { + return __builtin_elementwise_bitreverse(a); +} + //////////////////////////////////////////////////////////////////////////////////// // 8-bit //////////////////////////////////////////////////////////////////////////////////// template -__attribute__((optnone, noinline)) UINT8 reference_reverse8(UINT8 a) { - a = ((0x55 & a) << 1) | (0x55 & (a >> 1)); - a = ((0x33 & a) << 2) | (0x33 & (a >> 2)); - return (a << 4) | (a >> 4); -} -template __attribute__((noinline)) UINT8 reverse8(UINT8 a) { a = ((0x55 & a) << 1) | (0x55 & (a >> 1)); a = ((0x33 & a) << 2) | (0x33 & (a >> 2)); @@ -30,8 +40,8 @@ template void do_bitreverse_test8(int *result, int bytesize) { for (uint8_t u=0 ; u<250; u++) { UINT8 data=u; - UINT8 ref = reference_reverse8(data); - UINT8 opt = reverse8(data); + UINT8 ref = reference_reverse(data,8); + UINT8 opt = reverse8(data); // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 8-bit types if (memcmp(&ref,&opt,bytesize)) { *result=1; @@ -44,13 +54,6 @@ void do_bitreverse_test8(int *result, int bytesize) { // 16-bit //////////////////////////////////////////////////////////////////////////////////// template -__attribute__((optnone, noinline)) UINT16 reference_reverse16(UINT16 a) { - a = ((0x5555 & a) << 1) | (0x5555 & (a >> 1)); - a = ((0x3333 & a) << 2) | (0x3333 & (a >> 2)); - a = ((0x0F0F & a) << 4) | (0x0F0F & (a >> 4)); - return (a << 8) | (a >> 8); -} -template __attribute__((noinline)) UINT16 reverse16(UINT16 a) { a = ((0x5555 & a) << 1) | (0x5555 & (a >> 1)); a = ((0x3333 & a) << 2) | (0x3333 & (a >> 2)); @@ -62,8 +65,8 @@ template void do_bitreverse_test16(int *result, int bytesize) { for (uint16_t u=0 ; u<0xFF00; u+=0x13) { UINT16 data=u; - UINT16 ref = reference_reverse16(data); - UINT16 opt = reverse16(data); + UINT16 ref = reference_reverse(data,16); + UINT16 opt = reverse16(data); // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 16-bit types if (memcmp(&ref,&opt,bytesize)) { *result=1; @@ -76,27 +79,11 @@ void do_bitreverse_test16(int *result, int bytesize) { // 32-bit //////////////////////////////////////////////////////////////////////////////////// template -__attribute__((optnone, noinline)) UINT32 reference_reverse32(UINT32 a) { - a = ((0x55555555 & a) << 1) | (0x55555555 & (a >> 1)); - a = ((0x33333333 & a) << 2) | (0x33333333 & (a >> 2)); - a = ((0x0F0F0F0F & a) << 4) | (0x0F0F0F0F & (a >> 4)); - a = ((0x00FF00FF & a) << 8) | (0x00FF00FF & (a >> 8)); - return (a << 16) | (a >> 16); -} -template -__attribute__((noinline)) UINT32 reverse32(UINT32 a) { - a = ((0x55555555 & a) << 1) | (0x55555555 & (a >> 1)); - a = ((0x33333333 & a) << 2) | (0x33333333 & (a >> 2)); - a = ((0x0F0F0F0F & a) << 4) | (0x0F0F0F0F & (a >> 4)); - a = ((0x00FF00FF & a) << 8) | (0x00FF00FF & (a >> 8)); - return (a << 16) | (a >> 16); -} -template void do_bitreverse_test32(int *result, int bytesize) { for (uint32_t u=0 ; u<(0xFF<<24); u+=0xABCD13) { UINT32 data=u; - UINT32 ref = reference_reverse32(data); - UINT32 opt = reverse32(data); + UINT32 ref = reference_reverse(data,32); + UINT32 opt = reverse(data); if (memcmp(&ref,&opt,bytesize)) { *result=1; @@ -109,29 +96,11 @@ void do_bitreverse_test32(int *result, int bytesize) { // 64-bit //////////////////////////////////////////////////////////////////////////////////// template -__attribute__((optnone, noinline)) UINT64 reference_reverse64(UINT64 a) { - a = ((0x5555555555555555UL & a) << 1) | (0x5555555555555555UL & (a >> 1)); - a = ((0x3333333333333333UL & a) << 2) | (0x3333333333333333UL & (a >> 2)); - a = ((0x0F0F0F0F0F0F0F0FUL & a) << 4) | (0x0F0F0F0F0F0F0F0FUL & (a >> 4)); - a = ((0x00FF00FF00FF00FFUL & a) << 8) | (0x00FF00FF00FF00FFUL & (a >> 8)); - a = ((0x0000FFFF0000FFFFUL & a) <<16) | (0x0000FFFF0000FFFFUL & (a >>16)); - return (a << 32) | (a >> 32); -} -template -__attribute__((noinline)) UINT64 reverse64(UINT64 a) { - a = ((0x5555555555555555UL & a) << 1) | (0x5555555555555555UL & (a >> 1)); - a = ((0x3333333333333333UL & a) << 2) | (0x3333333333333333UL & (a >> 2)); - a = ((0x0F0F0F0F0F0F0F0FUL & a) << 4) | (0x0F0F0F0F0F0F0F0FUL & (a >> 4)); - a = ((0x00FF00FF00FF00FFUL & a) << 8) | (0x00FF00FF00FF00FFUL & (a >> 8)); - a = ((0x0000FFFF0000FFFFUL & a) <<16) | (0x0000FFFF0000FFFFUL & (a >>16)); - return (a << 32) | (a >> 32); -} -template void do_bitreverse_test64(int *result, int bytesize) { for (uint64_t u=0 ; u<(0xFFUL<<56); u+=0xABCDABCDABCD13UL) { UINT64 data=u; - UINT64 ref = reference_reverse64(data); - UINT64 opt = reverse64(data); + UINT64 ref = reference_reverse(data,64); + UINT64 opt = reverse(data); if (memcmp(&ref,&opt,bytesize)) { *result=1; From de866958648afc092855c9f49cf7cc61290601da Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Tue, 5 Mar 2024 23:45:46 -0800 Subject: [PATCH 07/18] Do checking and reference bitreverse on host. Refactor more code. Signed-off-by: Lu, John --- .../LLVMIntrinsicLowering/bitreverse.cpp | 190 ++++++++---------- .../test-e2e/LLVMIntrinsicLowering/common.hpp | 27 +++ 2 files changed, 109 insertions(+), 108 deletions(-) create mode 100644 sycl/test-e2e/LLVMIntrinsicLowering/common.hpp diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index b03e5be749344..dda19cb06a420 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -8,6 +8,7 @@ #include #include #include +#include "common.hpp" using namespace sycl; @@ -23,123 +24,80 @@ __attribute__((optnone, noinline)) TYPE reference_reverse(TYPE a, const int bitl } template -__attribute__((noinline)) TYPE reverse(TYPE a) { - return __builtin_elementwise_bitreverse(a); -} - -//////////////////////////////////////////////////////////////////////////////////// -// 8-bit -//////////////////////////////////////////////////////////////////////////////////// -template -__attribute__((noinline)) UINT8 reverse8(UINT8 a) { +__attribute__((noinline)) TYPE reverse(TYPE a, int bitlength) { + if (bitlength==8) { + // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 8-bit types a = ((0x55 & a) << 1) | (0x55 & (a >> 1)); a = ((0x33 & a) << 2) | (0x33 & (a >> 2)); return (a << 4) | (a >> 4); -} -template -void do_bitreverse_test8(int *result, int bytesize) { - for (uint8_t u=0 ; u<250; u++) { - UINT8 data=u; - UINT8 ref = reference_reverse(data,8); - UINT8 opt = reverse8(data); // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 8-bit types - - if (memcmp(&ref,&opt,bytesize)) { - *result=1; - return; - } - } -} - -//////////////////////////////////////////////////////////////////////////////////// -// 16-bit -//////////////////////////////////////////////////////////////////////////////////// -template -__attribute__((noinline)) UINT16 reverse16(UINT16 a) { + } else if (bitlength==16) { + // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 16-bit types a = ((0x5555 & a) << 1) | (0x5555 & (a >> 1)); a = ((0x3333 & a) << 2) | (0x3333 & (a >> 2)); - a = ((0x0F0F & a) << 4) | (0x0F0F & (a >> 4)); + a = ((0x0F0F & a) << 4) | (0x0F0F & (a >> 4)); return (a << 8) | (a >> 8); + } else + return __builtin_elementwise_bitreverse(a); } -template -void do_bitreverse_test16(int *result, int bytesize) { - for (uint16_t u=0 ; u<0xFF00; u+=0x13) { - UINT16 data=u; - UINT16 ref = reference_reverse(data,16); - UINT16 opt = reverse16(data); // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 16-bit types +template class BitreverseTest; - if (memcmp(&ref,&opt,bytesize)) { - *result=1; - return; - } - } -} +#define NUM_TESTS 1024 -//////////////////////////////////////////////////////////////////////////////////// -// 32-bit -//////////////////////////////////////////////////////////////////////////////////// -template -void do_bitreverse_test32(int *result, int bytesize) { - for (uint32_t u=0 ; u<(0xFF<<24); u+=0xABCD13) { - UINT32 data=u; - UINT32 ref = reference_reverse(data,32); - UINT32 opt = reverse(data); - - if (memcmp(&ref,&opt,bytesize)) { - *result=1; - return; - } - } -} +template +void do_scalar_bitreverse_test() { + queue q; -//////////////////////////////////////////////////////////////////////////////////// -// 64-bit -//////////////////////////////////////////////////////////////////////////////////// -template -void do_bitreverse_test64(int *result, int bytesize) { - for (uint64_t u=0 ; u<(0xFFUL<<56); u+=0xABCDABCDABCD13UL) { - UINT64 data=u; - UINT64 ref = reference_reverse(data,64); - UINT64 opt = reverse(data); - - if (memcmp(&ref,&opt,bytesize)) { - *result=1; - return; + TYPE *Input = (TYPE *) malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), q.get_context()); + TYPE *Output = (TYPE *) malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), q.get_context()); + + for (unsigned i=0; i(); + q.submit([=](handler &cgh) { + cgh.single_task> ([=]() { + for (unsigned i=0; i class BitreverseTest; + free(Input, q.get_context()); + free(Output, q.get_context()); +} -template -void testTypes(int elements) { +template +void do_vector_bitreverse_test() { queue q; - int *result = (int *) malloc_host(sizeof(int),q); - *result=0; - - q.submit([=](handler &cgh) { cgh.single_task> ([=]() { do_bitreverse_test8 (result,elements*sizeof(uint8_t)); }); }); q.wait(); - if (*result) { - std::cerr << "Failed bitreverse 8-bit, #elements=" << sizeof(UINT8)/sizeof(uint8_t) <<"\n"; - exit(1); - } - q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test16(result,elements*sizeof(uint16_t)); }); }); q.wait(); - if (*result) { - std::cerr << "Failed bitreverse 16-bit, #elements=" << sizeof(UINT16)/sizeof(uint16_t) <<"\n"; - exit(1); - } - q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test32(result,elements*sizeof(uint32_t)); }); }); q.wait(); - if (*result) { - std::cerr << "Failed bitreverse 32-bit, #elements=" << sizeof(UINT32)/sizeof(uint32_t) <<"\n"; - exit(1); - } - q.submit([=](handler &cgh) { cgh.single_task>([=]() { do_bitreverse_test64(result,elements*sizeof(uint64_t)); }); }); q.wait(); - if (*result) { - std::cerr << "Failed bitreverse 64-bit, #elements=" << sizeof(UINT64)/sizeof(uint64_t) <<"\n"; - exit(1); + VTYPE *Input = (VTYPE *) malloc_shared(sizeof(VTYPE) * NUM_TESTS, q.get_device(), q.get_context()); + VTYPE *Output = (VTYPE *) malloc_shared(sizeof(VTYPE) * NUM_TESTS, q.get_device(), q.get_context()); + + for (unsigned i=0; i::type>(); + + q.submit([=](handler &cgh) { + cgh.single_task> ([=]() { + for (unsigned i=0; i (1); - testTypes (2); - testTypes (3); - testTypes (4); - testTypes (8); - testTypes (16); + do_scalar_bitreverse_test(); + do_scalar_bitreverse_test(); + do_scalar_bitreverse_test(); + do_scalar_bitreverse_test(); + + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + return 0; } diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/common.hpp b/sycl/test-e2e/LLVMIntrinsicLowering/common.hpp new file mode 100644 index 0000000000000..45c0a99840d93 --- /dev/null +++ b/sycl/test-e2e/LLVMIntrinsicLowering/common.hpp @@ -0,0 +1,27 @@ +//==------- common.hpp - DPC++ ESIMD on-device test ------------------------==// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include +#include + +template class KernelID; + +template T get_rand() { + using Tuint = std::conditional_t< + sizeof(T) == 1, uint8_t, + std::conditional_t< + sizeof(T) == 2, uint16_t, + std::conditional_t>>>; + Tuint v = rand(); + if constexpr (sizeof(Tuint) > 4) + v = (v << 32) | rand(); + return sycl::bit_cast(v); +} From 67737e3ae6d1d692e06ea3cb673ae49ca32206ec Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Wed, 6 Mar 2024 06:21:54 -0800 Subject: [PATCH 08/18] Initialize seed with srand Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index dda19cb06a420..8738890bad18c 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -126,6 +126,8 @@ using uint32_t16 = uint32_t __attribute__((ext_vector_type(16))); using uint64_t16 = uint64_t __attribute__((ext_vector_type(16))); int main() { + srand(2024); + do_scalar_bitreverse_test(); do_scalar_bitreverse_test(); do_scalar_bitreverse_test(); From d11591fc7fe0380ffc64cad23f587e94cba658b3 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Wed, 6 Mar 2024 07:28:39 -0800 Subject: [PATCH 09/18] Ensure SPV_KHR_bit_instructions is not enabled Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 8738890bad18c..60c6a59b056b9 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -2,7 +2,11 @@ // UNSUPPORTED: hip || cuda -// RUN: %{build} -o %t.out -O2 +// Ensure that SPV_KHR_bit_instructions is disabled so that translator +// will lower llvm.bitreverse.* intrinsics instead of relying on SPIRV +// BitReverse instruction. + +// RUN: %{build} -o %t.out -O2 -Xspirv-translator --spirv-ext=-SPV_KHR_bit_instructions // RUN: %{run} %t.out #include From 52002db4d95ad3c84a5e6712945d00f924169b00 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Wed, 6 Mar 2024 12:55:12 -0800 Subject: [PATCH 10/18] Ensure SPV dump has expected lowerings. Also check executing without explicitly disabling SPV_KHR_bit_instructions passes Signed-off-by: Lu, John --- .../LLVMIntrinsicLowering/bitreverse.cpp | 74 ++++++++++++++++++- 1 file changed, 73 insertions(+), 1 deletion(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 60c6a59b056b9..d1fa17ee86e21 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -2,13 +2,85 @@ // UNSUPPORTED: hip || cuda +// Make dump directory +// RUN: rm -rf %t.spvdir && mkdir %t.spvdir + // Ensure that SPV_KHR_bit_instructions is disabled so that translator // will lower llvm.bitreverse.* intrinsics instead of relying on SPIRV // BitReverse instruction. +// Also build executable with SPV dump +// RUN: %{build} -o %t.out -O2 -Xspirv-translator --spirv-ext=-SPV_KHR_bit_instructions -fsycl-dump-device-code=%t.spvdir + +// Rename SPV file to explictly known filename +// RUN: mv %t.spvdir/*.spv %t.spvdir/dump.spv + +// Convert to text +// RUN: llvm-spirv -to-text %t.spvdir/dump.spv -// RUN: %{build} -o %t.out -O2 -Xspirv-translator --spirv-ext=-SPV_KHR_bit_instructions +// Check that all lowerings are done by llvm-spirv +// RUN: cat %t.spvdir/dump.spt | FileCheck %s --check-prefix CHECK-SPV --implicit-check-not=BitReverse + +// Execute to ensure lowering has correct functionality // RUN: %{run} %t.out +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Build without lowering explicitly disabled +// RUN: %{build} -o %t.bitinstructions.out + +// Execution should still be correct +// RUN: %{run} %t.bitinstructions.out + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i32" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i64" + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i32" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i64" + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v4i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v4i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v4i32" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v4i64" + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v8i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v8i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v8i32" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v8i64" + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i32" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i64" + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i32" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i64" Export + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i32" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i64" Export + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v4i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v4i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v4i32" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v4i64" Export + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v8i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v8i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v8i32" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v8i64" Export + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v16i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v16i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v16i32" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v16i64" Export + #include #include #include From 656549880c345e8eed267789cbdd389f63da7dd5 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Fri, 8 Mar 2024 07:54:47 -0800 Subject: [PATCH 11/18] Disable testing without disabling SPV_KHR_bit_instructions because llvm.bitreverse is not supported Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index d1fa17ee86e21..0cc37fec68769 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -25,11 +25,13 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TODO FIXME Change NOT_READY to RUN when llvm.bitreverse.* is supported + // Build without lowering explicitly disabled -// RUN: %{build} -o %t.bitinstructions.out +// NOT_READY: %{build} -o %t.bitinstructions.out // Execution should still be correct -// RUN: %{run} %t.bitinstructions.out +// NOT_READY: %{run} %t.bitinstructions.out // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i8" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i16" From 7aa9aba90635d557b91709abe1ae5c15a8c1ae55 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Tue, 19 Mar 2024 13:32:17 -0700 Subject: [PATCH 12/18] Add testing for 2-element vectors Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 0cc37fec68769..b3ac091b4f427 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -211,6 +211,11 @@ int main() { do_scalar_bitreverse_test(); do_scalar_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); From 121876c79bd73798786f8906a81bd8a691a42472 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Tue, 19 Mar 2024 15:02:06 -0700 Subject: [PATCH 13/18] Skip problematic test variation Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index b3ac091b4f427..e75daeaf4760e 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -219,7 +219,7 @@ int main() { do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); - do_vector_bitreverse_test(); + // do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); From 498a5b5278ff5231739683e8f53afbdeb04fdd4d Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Tue, 19 Mar 2024 17:03:36 -0700 Subject: [PATCH 14/18] v3i64 testing not done. Thus don't check for this SPV result Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index e75daeaf4760e..8906ef49587fd 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -66,7 +66,6 @@ // CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i8" Export // CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i16" Export // CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i32" Export -// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i64" Export // CHECK-SPV: LinkageAttributes "llvm_bitreverse_v4i8" Export // CHECK-SPV: LinkageAttributes "llvm_bitreverse_v4i16" Export From e4ab58daf1f16ecb068b7b081d30f36beb47ffb8 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Tue, 19 Mar 2024 18:34:36 -0700 Subject: [PATCH 15/18] Remove more v3i64 checking Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index 8906ef49587fd..f766f3ea65309 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -41,7 +41,6 @@ // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i8" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i16" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i32" -// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i64" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v4i8" // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v4i16" From 1ed5820bcdc568ee42a8f982e8115f31b61ab74b Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Wed, 20 Mar 2024 07:24:12 -0700 Subject: [PATCH 16/18] Add V2 checks. Don't do 64-bit vector tests until support is ready. Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/a.out | Bin 0 -> 321832 bytes .../LLVMIntrinsicLowering/bitreverse.cpp | 19 +- sycl/test-e2e/LLVMIntrinsicLowering/t.cpp | 238 ++++++++++++++++++ 3 files changed, 246 insertions(+), 11 deletions(-) create mode 100755 sycl/test-e2e/LLVMIntrinsicLowering/a.out create mode 100644 sycl/test-e2e/LLVMIntrinsicLowering/t.cpp diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/a.out b/sycl/test-e2e/LLVMIntrinsicLowering/a.out new file mode 100755 index 0000000000000000000000000000000000000000..859bb22ed4f09c4dec49899f4fa3b6cd804ef01c GIT binary patch literal 321832 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 g=@-cGS5gOQFchEB90NzB@IQSh! #include @@ -212,27 +214,22 @@ int main() { do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); - do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); - // do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); - do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); - do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); do_vector_bitreverse_test(); - do_vector_bitreverse_test(); return 0; } diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/t.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/t.cpp new file mode 100644 index 0000000000000..7fc7f1cb508b2 --- /dev/null +++ b/sycl/test-e2e/LLVMIntrinsicLowering/t.cpp @@ -0,0 +1,238 @@ +// Test that llvm.bitreverse is lowered correctly by llvm-spirv + +// UNSUPPORTED: hip || cuda + +// Make dump directory +// RUN: rm -rf %t.spvdir && mkdir %t.spvdir + +// Ensure that SPV_KHR_bit_instructions is disabled so that translator +// will lower llvm.bitreverse.* intrinsics instead of relying on SPIRV +// BitReverse instruction. +// Also build executable with SPV dump +// RUN: %{build} -o %t.out -O2 -Xspirv-translator --spirv-ext=-SPV_KHR_bit_instructions -fsycl-dump-device-code=%t.spvdir + +// Rename SPV file to explictly known filename +// RUN: mv %t.spvdir/*.spv %t.spvdir/dump.spv + +// Convert to text +// RUN: llvm-spirv -to-text %t.spvdir/dump.spv + +// Check that all lowerings are done by llvm-spirv +// RUN: cat %t.spvdir/dump.spt | FileCheck %s --check-prefix CHECK-SPV --implicit-check-not=BitReverse + +// Execute to ensure lowering has correct functionality +// RUN: %{run} %t.out + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// TODO FIXME Change NOT_READY to RUN when llvm.bitreverse.* is supported + +// Build without lowering explicitly disabled +// NOT_READY: %{build} -o %t.bitinstructions.out + +// Execution should still be correct +// NOT_READY: %{run} %t.bitinstructions.out + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i32" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i64" + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v2i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v2i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v2i32" + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v3i32" + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v4i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v4i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v4i32" + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v8i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v8i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v8i32" + +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i8" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i16" +// CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_v16i32" + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i32" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_i64" Export + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v2i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v2i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v2i32" Export + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v3i32" Export + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v4i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v4i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v4i32" Export + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v8i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v8i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v8i32" Export + +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v16i8" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v16i16" Export +// CHECK-SPV: LinkageAttributes "llvm_bitreverse_v16i32" Export + +#include +#include +#include +#include "common.hpp" + +using namespace sycl; + +template +__attribute__((optnone, noinline)) TYPE reference_reverse(TYPE a, const int bitlength) { + TYPE ret = 0; + for (auto i = 0; i>=1; + } + return ret; +} + +template +__attribute__((noinline)) TYPE reverse(TYPE a, int bitlength) { + if (bitlength==8) { + // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 8-bit types + a = ((0x55 & a) << 1) | (0x55 & (a >> 1)); + a = ((0x33 & a) << 2) | (0x33 & (a >> 2)); + return (a << 4) | (a >> 4); + } else if (bitlength==16) { + // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 16-bit types + a = ((0x5555 & a) << 1) | (0x5555 & (a >> 1)); + a = ((0x3333 & a) << 2) | (0x3333 & (a >> 2)); + a = ((0x0F0F & a) << 4) | (0x0F0F & (a >> 4)); + return (a << 8) | (a >> 8); + } else + return __builtin_elementwise_bitreverse(a); +} + +template class BitreverseTest; + +#define NUM_TESTS 1024 + +template +void do_scalar_bitreverse_test() { + queue q; + + TYPE *Input = (TYPE *) malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), q.get_context()); + TYPE *Output = (TYPE *) malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), q.get_context()); + + for (unsigned i=0; i(); + q.submit([=](handler &cgh) { + cgh.single_task> ([=]() { + for (unsigned i=0; i +void do_vector_bitreverse_test() { + queue q; + + VTYPE *Input = (VTYPE *) malloc_shared(sizeof(VTYPE) * NUM_TESTS, q.get_device(), q.get_context()); + VTYPE *Output = (VTYPE *) malloc_shared(sizeof(VTYPE) * NUM_TESTS, q.get_device(), q.get_context()); + + std::cerr << "Starting sizeof=" << sizeof(Input[0][0]) << " elements=" << __builtin_vectorelements(VTYPE) << "\n"; + + for (unsigned i=0; i::type>(); + + q.submit([=](handler &cgh) { + cgh.single_task> ([=]() { + for (unsigned i=0; i(); + do_scalar_bitreverse_test(); + do_scalar_bitreverse_test(); + do_scalar_bitreverse_test(); + + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + do_vector_bitreverse_test(); + + return 0; +} + From aae59fbcca5f191a531707e0f2a4c692606099b3 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Wed, 20 Mar 2024 14:01:16 -0700 Subject: [PATCH 17/18] Remove accidentally added files Signed-off-by: Lu, John --- sycl/test-e2e/LLVMIntrinsicLowering/a.out | Bin 321832 -> 0 bytes sycl/test-e2e/LLVMIntrinsicLowering/t.cpp | 238 ---------------------- 2 files changed, 238 deletions(-) delete mode 100755 sycl/test-e2e/LLVMIntrinsicLowering/a.out delete mode 100644 sycl/test-e2e/LLVMIntrinsicLowering/t.cpp diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/a.out b/sycl/test-e2e/LLVMIntrinsicLowering/a.out deleted file mode 100755 index 859bb22ed4f09c4dec49899f4fa3b6cd804ef01c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321832 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 g=@-cGS5gOQFchEB90NzB@IQSh! -#include -#include -#include "common.hpp" - -using namespace sycl; - -template -__attribute__((optnone, noinline)) TYPE reference_reverse(TYPE a, const int bitlength) { - TYPE ret = 0; - for (auto i = 0; i>=1; - } - return ret; -} - -template -__attribute__((noinline)) TYPE reverse(TYPE a, int bitlength) { - if (bitlength==8) { - // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 8-bit types - a = ((0x55 & a) << 1) | (0x55 & (a >> 1)); - a = ((0x33 & a) << 2) | (0x33 & (a >> 2)); - return (a << 4) | (a >> 4); - } else if (bitlength==16) { - // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 16-bit types - a = ((0x5555 & a) << 1) | (0x5555 & (a >> 1)); - a = ((0x3333 & a) << 2) | (0x3333 & (a >> 2)); - a = ((0x0F0F & a) << 4) | (0x0F0F & (a >> 4)); - return (a << 8) | (a >> 8); - } else - return __builtin_elementwise_bitreverse(a); -} - -template class BitreverseTest; - -#define NUM_TESTS 1024 - -template -void do_scalar_bitreverse_test() { - queue q; - - TYPE *Input = (TYPE *) malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), q.get_context()); - TYPE *Output = (TYPE *) malloc_shared(sizeof(TYPE) * NUM_TESTS, q.get_device(), q.get_context()); - - for (unsigned i=0; i(); - q.submit([=](handler &cgh) { - cgh.single_task> ([=]() { - for (unsigned i=0; i -void do_vector_bitreverse_test() { - queue q; - - VTYPE *Input = (VTYPE *) malloc_shared(sizeof(VTYPE) * NUM_TESTS, q.get_device(), q.get_context()); - VTYPE *Output = (VTYPE *) malloc_shared(sizeof(VTYPE) * NUM_TESTS, q.get_device(), q.get_context()); - - std::cerr << "Starting sizeof=" << sizeof(Input[0][0]) << " elements=" << __builtin_vectorelements(VTYPE) << "\n"; - - for (unsigned i=0; i::type>(); - - q.submit([=](handler &cgh) { - cgh.single_task> ([=]() { - for (unsigned i=0; i(); - do_scalar_bitreverse_test(); - do_scalar_bitreverse_test(); - do_scalar_bitreverse_test(); - - do_vector_bitreverse_test(); - do_vector_bitreverse_test(); - do_vector_bitreverse_test(); - - do_vector_bitreverse_test(); - do_vector_bitreverse_test(); - do_vector_bitreverse_test(); - - do_vector_bitreverse_test(); - do_vector_bitreverse_test(); - do_vector_bitreverse_test(); - - do_vector_bitreverse_test(); - do_vector_bitreverse_test(); - do_vector_bitreverse_test(); - - do_vector_bitreverse_test(); - do_vector_bitreverse_test(); - do_vector_bitreverse_test(); - - return 0; -} - From 9d4433d786824ebd77ce1d1ff3caf8d05f5f8a16 Mon Sep 17 00:00:00 2001 From: "Lu, John" Date: Wed, 20 Mar 2024 14:14:51 -0700 Subject: [PATCH 18/18] Improve comments Signed-off-by: Lu, John --- .../LLVMIntrinsicLowering/bitreverse.cpp | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp index a7f3d3d36f4fd..239b018a9f30f 100644 --- a/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp +++ b/sycl/test-e2e/LLVMIntrinsicLowering/bitreverse.cpp @@ -1,36 +1,36 @@ -// Test that llvm.bitreverse is lowered correctly by llvm-spirv +// Test that llvm.bitreverse is lowered correctly by llvm-spirv. // UNSUPPORTED: hip || cuda -// Make dump directory +// Make dump directory. // RUN: rm -rf %t.spvdir && mkdir %t.spvdir // Ensure that SPV_KHR_bit_instructions is disabled so that translator // will lower llvm.bitreverse.* intrinsics instead of relying on SPIRV // BitReverse instruction. -// Also build executable with SPV dump +// Also build executable with SPV dump. // RUN: %{build} -o %t.out -O2 -Xspirv-translator --spirv-ext=-SPV_KHR_bit_instructions -fsycl-dump-device-code=%t.spvdir -// Rename SPV file to explictly known filename +// Rename SPV file to explictly known filename. // RUN: mv %t.spvdir/*.spv %t.spvdir/dump.spv -// Convert to text +// Convert to text. // RUN: llvm-spirv -to-text %t.spvdir/dump.spv -// Check that all lowerings are done by llvm-spirv +// Check that all lowerings are done by llvm-spirv. // RUN: cat %t.spvdir/dump.spt | FileCheck %s --check-prefix CHECK-SPV --implicit-check-not=BitReverse -// Execute to ensure lowering has correct functionality +// Execute to ensure lowering has correct functionality. // RUN: %{run} %t.out ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -// TODO FIXME Change NOT_READY to RUN when llvm.bitreverse.* is supported +// TODO FIXME Change NOT_READY to RUN when llvm.bitreverse.* is supported. -// Build without lowering explicitly disabled +// Build without lowering explicitly disabled. // NOT_READY: %{build} -o %t.bitinstructions.out -// Execution should still be correct +// Execution should still be correct. // NOT_READY: %{run} %t.bitinstructions.out // CHECK-SPV: Name {{[0-9]+}} "llvm_bitreverse_i8" @@ -104,12 +104,12 @@ __attribute__((optnone, noinline)) TYPE reference_reverse(TYPE a, const int bitl template __attribute__((noinline)) TYPE reverse(TYPE a, int bitlength) { if (bitlength==8) { - // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 8-bit types + // Avoid bug with __builtin_elementwise_bitreverse(a) on scalar 8-bit types. a = ((0x55 & a) << 1) | (0x55 & (a >> 1)); a = ((0x33 & a) << 2) | (0x33 & (a >> 2)); return (a << 4) | (a >> 4); } else if (bitlength==16) { - // avoid bug with __builtin_elementwise_bitreverse(a) on scalar 16-bit types + // Avoid bug with __builtin_elementwise_bitreverse(a) on scalar 16-bit types. a = ((0x5555 & a) << 1) | (0x5555 & (a >> 1)); a = ((0x3333 & a) << 2) | (0x3333 & (a >> 2)); a = ((0x0F0F & a) << 4) | (0x0F0F & (a >> 4));