|
| 1 | +// RUN: %clangxx -fsycl -fsycl-device-only -Xclang -emit-llvm -o %t.comp.ll %s |
| 2 | +// RUN: sycl-post-link -ir-output-only -lower-esimd -S %t.comp.ll -o %t.out.ll |
| 3 | +// RUN: FileCheck --input-file=%t.out.ll %s |
| 4 | + |
| 5 | +// This test verifies that calls of ext::intel::experimental::esimd::wait() |
| 6 | +// are lowered properly, not deleted as unused and they do not let delete |
| 7 | +// the argument of wait() function. |
| 8 | + |
| 9 | +#include <iostream> |
| 10 | +#include <sycl/ext/intel/esimd.hpp> |
| 11 | +#include <sycl/sycl.hpp> |
| 12 | + |
| 13 | +using namespace sycl; |
| 14 | +using namespace sycl::ext::intel::esimd; |
| 15 | +namespace iesimd = sycl::ext::intel::experimental::esimd; |
| 16 | + |
| 17 | +SYCL_ESIMD_FUNCTION SYCL_EXTERNAL void func(int IArg) { |
| 18 | + // Test case 1: check wait() with esimd::simd argument. |
| 19 | + { |
| 20 | + simd<int, 16> A = IArg; |
| 21 | + simd<int, 16> B = A * A; |
| 22 | + iesimd::wait(B); |
| 23 | + // CHECK: mul <16 x i32> |
| 24 | + // CHECK: llvm.genx.dummy.mov |
| 25 | + } |
| 26 | + |
| 27 | + // Test case 2: check wait() with esimd::simd_view argument. |
| 28 | + { |
| 29 | + simd<int, 16> A = IArg; |
| 30 | + simd<int, 16> B = A * 17; |
| 31 | + auto BView = B.select<8, 2>(0); |
| 32 | + BView += 2; |
| 33 | + iesimd::wait(BView); |
| 34 | + // CHECK: mul <16 x i32> |
| 35 | + // CHECK: add <8 x i32> |
| 36 | + // CHECK: llvm.genx.dummy.mov |
| 37 | + } |
| 38 | + |
| 39 | + // Test case 3: check wait() that prevesrves one simd and lets |
| 40 | + // optimize away the other/unused one. |
| 41 | + { |
| 42 | + simd<uint64_t, 8> A = IArg; |
| 43 | + auto B = A * 17; |
| 44 | + iesimd::wait(B); |
| 45 | + auto C = B * 17; |
| 46 | + // CHECK: mul <8 x i64> |
| 47 | + // CHECK-NOT: add <8 x i64> |
| 48 | + // CHECK: llvm.genx.dummy.mov |
| 49 | + // CHECK-NEXT: ret void |
| 50 | + } |
| 51 | +} |
0 commit comments