|
| 1 | +// RUN: %clang_cc1 -fsycl-is-device -triple spir64-unknown-linux -std=c++11 -disable-llvm-passes -S -no-opaque-pointers -emit-llvm -x c++ %s -o - | FileCheck %s |
| 2 | + |
| 3 | +#define PARAM_1 1U << 7 |
| 4 | +#define PARAM_2 1U << 8 |
| 5 | + |
| 6 | +// This test checks that using of __builtin_intel_fpga_mem results in correct |
| 7 | +// generation of annotations in LLVM IR. |
| 8 | + |
| 9 | +// CHECK: [[STRUCT:%.*]] = type { i32, float } |
| 10 | +struct State { |
| 11 | + int x; |
| 12 | + float y; |
| 13 | +}; |
| 14 | + |
| 15 | +// CHECK: [[ANN1:@.str[\.]*[0-9]*]] = {{.*}}{params:384}{cache-size:0}{anchor-id:-1}{target-anchor:0}{type:0}{cycle:0} |
| 16 | +// CHECK: [[ANN2:@.str[\.]*[0-9]*]] = {{.*}}{params:384}{cache-size:127}{anchor-id:-1}{target-anchor:0}{type:0}{cycle:0} |
| 17 | +// CHECK: [[ANN3:@.str[\.]*[0-9]*]] = {{.*}}{params:384}{cache-size:127}{anchor-id:10}{target-anchor:20}{type:30}{cycle:40} |
| 18 | +// CHECK: [[ANN4:@.str[\.]*[0-9]*]] = {{.*}}{params:384}{cache-size:127}{anchor-id:11}{target-anchor:12}{type:0}{cycle:0} |
| 19 | +// CHECK: [[ANN5:@.str[\.]*[0-9]*]] = {{.*}}{params:384}{cache-size:127}{anchor-id:100}{target-anchor:0}{type:0}{cycle:0} |
| 20 | +// CHECK: [[ANN6:@.str[\.]*[0-9]*]] = {{.*}}{params:384}{cache-size:128}{anchor-id:4}{target-anchor:7}{type:8}{cycle:0} |
| 21 | + |
| 22 | + |
| 23 | +// CHECK: define {{.*}}spir_func void @{{.*}}(float addrspace(4)* noundef %A, i32 addrspace(4)* noundef %B, [[STRUCT]] addrspace(4)* noundef %C, [[STRUCT]] addrspace(4)*{{.*}}%D) |
| 24 | +void foo(float *A, int *B, State *C, State &D) { |
| 25 | + float *x; |
| 26 | + int *y; |
| 27 | + State *z; |
| 28 | + double F = 0.0; |
| 29 | + double *f; |
| 30 | + |
| 31 | + // CHECK-DAG: [[Aaddr:%.*]] = alloca float addrspace(4)* |
| 32 | + // CHECK-DAG: [[Baddr:%.*]] = alloca i32 addrspace(4)* |
| 33 | + // CHECK-DAG: [[Caddr:%.*]] = alloca [[STRUCT]] addrspace(4)* |
| 34 | + // CHECK-DAG: [[Daddr:%.*]] = alloca [[STRUCT]] addrspace(4)* |
| 35 | + // CHECK-DAG: [[F:%.*]] = alloca double |
| 36 | + // CHECK-DAG: [[f:%.*]] = alloca double addrspace(4)* |
| 37 | + |
| 38 | + // CHECK-DAG: [[A:%[0-9]+]] = load float addrspace(4)*, float addrspace(4)* addrspace(4)* [[Aaddr]] |
| 39 | + // CHECK-DAG: [[PTR1:%[0-9]+]] = call float addrspace(4)* @llvm.ptr.annotation{{.*}}[[A]]{{.*}}[[ANN1]]{{.*}}[[ATT:#[0-9]+]] |
| 40 | + // CHECK-DAG: store float addrspace(4)* [[PTR1]], float addrspace(4)* addrspace(4)* %x |
| 41 | + x = __builtin_intel_fpga_mem(A, PARAM_1 | PARAM_2, 0); |
| 42 | + |
| 43 | + // CHECK-DAG: [[B:%[0-9]+]] = load i32 addrspace(4)*, i32 addrspace(4)* addrspace(4)* [[Baddr]] |
| 44 | + // CHECK-DAG: [[PTR2:%[0-9]+]] = call i32 addrspace(4)* @llvm.ptr.annotation{{.*}}[[B]]{{.*}}[[ANN1]]{{.*}}[[ATT:#[0-9]+]] |
| 45 | + // CHECK-DAG: store i32 addrspace(4)* [[PTR2]], i32 addrspace(4)* addrspace(4)* %y |
| 46 | + y = __builtin_intel_fpga_mem(B, PARAM_1 | PARAM_2, 0); |
| 47 | + |
| 48 | + // CHECK-DAG: [[C:%[0-9]+]] = load [[STRUCT]] addrspace(4)*, [[STRUCT]] addrspace(4)* addrspace(4)* [[Caddr]] |
| 49 | + // CHECK-DAG: [[PTR3:%[0-9]+]] = call [[STRUCT]] addrspace(4)* @llvm.ptr.annotation{{.*}}[[C]]{{.*}}[[ANN1]]{{.*}}[[ATT:#[0-9]+]] |
| 50 | + // CHECK-DAG: store [[STRUCT]] addrspace(4)* [[PTR3]], [[STRUCT]] addrspace(4)* addrspace(4)* %z |
| 51 | + z = __builtin_intel_fpga_mem(C, PARAM_1 | PARAM_2, 0); |
| 52 | + |
| 53 | + // CHECK-DAG: [[A2:%[0-9]+]] = load float addrspace(4)*, float addrspace(4)* addrspace(4)* [[Aaddr]] |
| 54 | + // CHECK-DAG: [[PTR4:%[0-9]+]] = call float addrspace(4)* @llvm.ptr.annotation{{.*}}[[A2]]{{.*}}[[ANN2]]{{.*}}[[ATT:#[0-9]+]] |
| 55 | + // CHECK-DAG: store float addrspace(4)* [[PTR4]], float addrspace(4)* addrspace(4)* %x |
| 56 | + x = __builtin_intel_fpga_mem(A, PARAM_1 | PARAM_2, 127); |
| 57 | + |
| 58 | + // CHECK-DAG: [[B2:%[0-9]+]] = load i32 addrspace(4)*, i32 addrspace(4)* addrspace(4)* [[Baddr]] |
| 59 | + // CHECK-DAG: [[PTR5:%[0-9]+]] = call i32 addrspace(4)* @llvm.ptr.annotation{{.*}}[[B2]]{{.*}}[[ANN2]]{{.*}}[[ATT:#[0-9]+]] |
| 60 | + // CHECK-DAG: store i32 addrspace(4)* [[PTR5]], i32 addrspace(4)* addrspace(4)* %y |
| 61 | + y = __builtin_intel_fpga_mem(B, PARAM_1 | PARAM_2, 127); |
| 62 | + |
| 63 | + // CHECK-DAG: [[C2:%[0-9]+]] = load [[STRUCT]] addrspace(4)*, [[STRUCT]] addrspace(4)* addrspace(4)* [[Caddr]] |
| 64 | + // CHECK-DAG: [[PTR6:%[0-9]+]] = call [[STRUCT]] addrspace(4)* @llvm.ptr.annotation{{.*}}[[C2]]{{.*}}[[ANN2]]{{.*}}[[ATT:#[0-9]+]] |
| 65 | + // CHECK-DAG: store [[STRUCT]] addrspace(4)* [[PTR6]], [[STRUCT]] addrspace(4)* addrspace(4)* %z |
| 66 | + z = __builtin_intel_fpga_mem(C, PARAM_1 | PARAM_2, 127); |
| 67 | + |
| 68 | + // CHECK-DAG: [[D:%[0-9]+]] = load [[STRUCT]] addrspace(4)*, [[STRUCT]] addrspace(4)* addrspace(4)* [[Daddr]] |
| 69 | + // CHECK-DAG: [[PTR7:%[0-9]+]] = call [[STRUCT]] addrspace(4)* @llvm.ptr.annotation{{.*}}[[D]]{{.*}}[[ANN2]]{{.*}}[[ATT:#[0-9]+]] |
| 70 | + // CHECK-DAG: store [[STRUCT]] addrspace(4)* [[PTR7]], [[STRUCT]] addrspace(4)* addrspace(4)* %z |
| 71 | + z = __builtin_intel_fpga_mem(&D, PARAM_1 | PARAM_2, 127); |
| 72 | + |
| 73 | + // CHECK-DAG: [[PTR8:%[0-9]+]] = call double addrspace(4)* @llvm.ptr.annotation{{.*}}[[F]]{{.*}}[[ANN2]]{{.*}}[[ATT:#[0-9]+]] |
| 74 | + // CHECK-DAG: store double addrspace(4)* [[PTR8]], double addrspace(4)* addrspace(4)* %f |
| 75 | + f = __builtin_intel_fpga_mem(&F, PARAM_1 | PARAM_2, 127); |
| 76 | + |
| 77 | + // CHECK-DAG: [[A3:%[0-9]+]] = load float addrspace(4)*, float addrspace(4)* addrspace(4)* [[Aaddr]] |
| 78 | + // CHECK-DAG: [[PTR9:%[0-9]+]] = call float addrspace(4)* @llvm.ptr.annotation{{.*}}[[A3]]{{.*}}[[ANN3]]{{.*}}[[ATT:#[0-9]+]] |
| 79 | + // CHECK-DAG: store float addrspace(4)* [[PTR9]], float addrspace(4)* addrspace(4)* %x |
| 80 | + x = __builtin_intel_fpga_mem(A, PARAM_1 | PARAM_2, 127, 10, 20, 30, 40); |
| 81 | + |
| 82 | + // CHECK-DAG: [[A4:%[0-9]+]] = load float addrspace(4)*, float addrspace(4)* addrspace(4)* [[Aaddr]] |
| 83 | + // CHECK-DAG: [[PTR10:%[0-9]+]] = call float addrspace(4)* @llvm.ptr.annotation{{.*}}[[A4]]{{.*}}[[ANN4]]{{.*}}[[ATT:#[0-9]+]] |
| 84 | + // CHECK-DAG: store float addrspace(4)* [[PTR10]], float addrspace(4)* addrspace(4)* %x |
| 85 | + x = __builtin_intel_fpga_mem(A, PARAM_1 | PARAM_2, 127, 11, 12); |
| 86 | + |
| 87 | + // CHECK-DAG: [[B3:%[0-9]+]] = load i32 addrspace(4)*, i32 addrspace(4)* addrspace(4)* [[Baddr]] |
| 88 | + // CHECK-DAG: [[PTR11:%[0-9]+]] = call i32 addrspace(4)* @llvm.ptr.annotation{{.*}}[[B3]]{{.*}}[[ANN5]]{{.*}}[[ATT:#[0-9]+]] |
| 89 | + // CHECK-DAG: store i32 addrspace(4)* [[PTR11]], i32 addrspace(4)* addrspace(4)* %y |
| 90 | + y = __builtin_intel_fpga_mem(B, PARAM_1 | PARAM_2, 127, 100); |
| 91 | + |
| 92 | + constexpr int TestVal1 = 7; |
| 93 | + constexpr int TestVal2 = 8; |
| 94 | + |
| 95 | + // CHECK-DAG: [[D1:%[0-9]+]] = load [[STRUCT]] addrspace(4)*, [[STRUCT]] addrspace(4)* addrspace(4)* [[Daddr]] |
| 96 | + // CHECK-DAG: [[PTR12:%[0-9]+]] = call [[STRUCT]] addrspace(4)* @llvm.ptr.annotation{{.*}}[[D1]]{{.*}}[[ANN6]]{{.*}}[[ATT:#[0-9]+]] |
| 97 | + // CHECK-DAG: store [[STRUCT]] addrspace(4)* [[PTR12]], [[STRUCT]] addrspace(4)* addrspace(4)* %z |
| 98 | + z = __builtin_intel_fpga_mem(&D, PARAM_1 | PARAM_2, 128, 4, TestVal1, TestVal2); |
| 99 | +} |
| 100 | + |
| 101 | +// CHECK-DAG: attributes [[ATT]] = { readnone } |
| 102 | + |
| 103 | +template <typename name, typename Func> |
| 104 | +__attribute__((sycl_kernel)) void kernel_single_task(const Func &kernelFunc) { |
| 105 | + kernelFunc(); |
| 106 | +} |
| 107 | + |
| 108 | +int main() { |
| 109 | + kernel_single_task<class fake_kernel>([]() { |
| 110 | + float *A; |
| 111 | + int *B; |
| 112 | + State *C; |
| 113 | + State D; |
| 114 | + foo(A, B, C, D); }); |
| 115 | + return 0; |
| 116 | +} |
0 commit comments