Clang Project

clang_source_code/test/SemaCUDA/amdgpu-attrs.cu
1// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2#include "Inputs/cuda.h"
3
4
5__attribute__((amdgpu_flat_work_group_size(32, 64)))
6__global__ void flat_work_group_size_32_64() {}
7
8__attribute__((amdgpu_waves_per_eu(2)))
9__global__ void waves_per_eu_2() {}
10
11__attribute__((amdgpu_waves_per_eu(2, 4)))
12__global__ void waves_per_eu_2_4() {}
13
14__attribute__((amdgpu_num_sgpr(32)))
15__global__ void num_sgpr_32() {}
16
17__attribute__((amdgpu_num_vgpr(64)))
18__global__ void num_vgpr_64() {}
19
20
21__attribute__((amdgpu_flat_work_group_size(32, 64), amdgpu_waves_per_eu(2)))
22__global__ void flat_work_group_size_32_64_waves_per_eu_2() {}
23
24__attribute__((amdgpu_flat_work_group_size(32, 64), amdgpu_waves_per_eu(2, 4)))
25__global__ void flat_work_group_size_32_64_waves_per_eu_2_4() {}
26
27__attribute__((amdgpu_flat_work_group_size(32, 64), amdgpu_num_sgpr(32)))
28__global__ void flat_work_group_size_32_64_num_sgpr_32() {}
29
30__attribute__((amdgpu_flat_work_group_size(32, 64), amdgpu_num_vgpr(64)))
31__global__ void flat_work_group_size_32_64_num_vgpr_64() {}
32
33__attribute__((amdgpu_waves_per_eu(2), amdgpu_num_sgpr(32)))
34__global__ void waves_per_eu_2_num_sgpr_32() {}
35
36__attribute__((amdgpu_waves_per_eu(2), amdgpu_num_vgpr(64)))
37__global__ void waves_per_eu_2_num_vgpr_64() {}
38
39__attribute__((amdgpu_waves_per_eu(2, 4), amdgpu_num_sgpr(32)))
40__global__ void waves_per_eu_2_4_num_sgpr_32() {}
41
42__attribute__((amdgpu_waves_per_eu(2, 4), amdgpu_num_vgpr(64)))
43__global__ void waves_per_eu_2_4_num_vgpr_64() {}
44
45__attribute__((amdgpu_num_sgpr(32), amdgpu_num_vgpr(64)))
46__global__ void num_sgpr_32_num_vgpr_64() {}
47
48__attribute__((amdgpu_flat_work_group_size(32, 64), amdgpu_waves_per_eu(2), amdgpu_num_sgpr(32)))
49__global__ void flat_work_group_size_32_64_waves_per_eu_2_num_sgpr_32() {}
50
51__attribute__((amdgpu_flat_work_group_size(32, 64), amdgpu_waves_per_eu(2), amdgpu_num_vgpr(64)))
52__global__ void flat_work_group_size_32_64_waves_per_eu_2_num_vgpr_64() {}
53
54__attribute__((amdgpu_flat_work_group_size(32, 64), amdgpu_waves_per_eu(2, 4), amdgpu_num_sgpr(32)))
55__global__ void flat_work_group_size_32_64_waves_per_eu_2_4_num_sgpr_32() {}
56
57__attribute__((amdgpu_flat_work_group_size(32, 64), amdgpu_waves_per_eu(2, 4), amdgpu_num_vgpr(64)))
58__global__ void flat_work_group_size_32_64_waves_per_eu_2_4_num_vgpr_64() {}
59
60__attribute__((amdgpu_flat_work_group_size(32, 64), amdgpu_waves_per_eu(2), amdgpu_num_sgpr(32), amdgpu_num_vgpr(64)))
61__global__ void flat_work_group_size_32_64_waves_per_eu_2_num_sgpr_32_num_vgpr_64() {}
62
63__attribute__((amdgpu_flat_work_group_size(32, 64), amdgpu_waves_per_eu(2, 4), amdgpu_num_sgpr(32), amdgpu_num_vgpr(64)))
64__global__ void flat_work_group_size_32_64_waves_per_eu_2_4_num_sgpr_32_num_vgpr_64() {}
65
66// expected-error@+2{{attribute 'reqd_work_group_size' can only be applied to an OpenCL kernel function}}
67__attribute__((reqd_work_group_size(32, 64, 64)))
68__global__ void reqd_work_group_size_32_64_64() {}
69
70// expected-error@+2{{attribute 'work_group_size_hint' can only be applied to an OpenCL kernel function}}
71__attribute__((work_group_size_hint(2, 2, 2)))
72__global__ void work_group_size_hint_2_2_2() {}
73
74// expected-error@+2{{attribute 'vec_type_hint' can only be applied to an OpenCL kernel function}}
75__attribute__((vec_type_hint(int)))
76__global__ void vec_type_hint_int() {}
77
78// expected-error@+2{{attribute 'intel_reqd_sub_group_size' can only be applied to an OpenCL kernel function}}
79__attribute__((intel_reqd_sub_group_size(64)))
80__global__ void intel_reqd_sub_group_size_64() {}
81
82// expected-error@+1{{'amdgpu_flat_work_group_size' attribute requires parameter 0 to be an integer constant}}
83__attribute__((amdgpu_flat_work_group_size("32", 64)))
84__global__ void non_int_min_flat_work_group_size_32_64() {}
85// expected-error@+1{{'amdgpu_flat_work_group_size' attribute requires parameter 1 to be an integer constant}}
86__attribute__((amdgpu_flat_work_group_size(32, "64")))
87__global__ void non_int_max_flat_work_group_size_32_64() {}
88
89int nc_min = 32, nc_max = 64;
90// expected-error@+1{{'amdgpu_flat_work_group_size' attribute requires parameter 0 to be an integer constant}}
91__attribute__((amdgpu_flat_work_group_size(nc_min, 64)))
92__global__ void non_cint_min_flat_work_group_size_32_64() {}
93// expected-error@+1{{'amdgpu_flat_work_group_size' attribute requires parameter 1 to be an integer constant}}
94__attribute__((amdgpu_flat_work_group_size(32, nc_max)))
95__global__ void non_cint_max_flat_work_group_size_32_64() {}
96
97const int c_min = 16, c_max = 32;
98__attribute__((amdgpu_flat_work_group_size(c_min * 2, 64)))
99__global__ void cint_min_flat_work_group_size_32_64() {}
100__attribute__((amdgpu_flat_work_group_size(32, c_max * 2)))
101__global__ void cint_max_flat_work_group_size_32_64() {}
102
103// expected-error@+3{{'T' does not refer to a value}}
104// expected-note@+1{{declared here}}
105template<typename T>
106__attribute__((amdgpu_flat_work_group_size(T, 64)))
107__global__ void template_class_min_flat_work_group_size_32_64() {}
108// expected-error@+3{{'T' does not refer to a value}}
109// expected-note@+1{{declared here}}
110template<typename T>
111__attribute__((amdgpu_flat_work_group_size(32, T)))
112__global__ void template_class_max_flat_work_group_size_32_64() {}
113
114template<unsigned a, unsigned b>
115__attribute__((amdgpu_flat_work_group_size(a, b)))
116__global__ void template_flat_work_group_size_32_64() {}
117template __global__ void template_flat_work_group_size_32_64<32, 64>();
118
119template<unsigned a, unsigned b, unsigned c>
120__attribute__((amdgpu_flat_work_group_size(a + b, b + c)))
121__global__ void template_complex_flat_work_group_size_32_64() {}
122template __global__ void template_complex_flat_work_group_size_32_64<16, 16, 48>();
123
124unsigned ipow2(unsigned n) { return n == 0 ? 1 : 2 * ipow2(n - 1); }
125constexpr unsigned ce_ipow2(unsigned n) { return n == 0 ? 1 : 2 * ce_ipow2(n - 1); }
126
127__attribute__((amdgpu_flat_work_group_size(ce_ipow2(5), ce_ipow2(6))))
128__global__ void cexpr_flat_work_group_size_32_64() {}
129// expected-error@+1{{'amdgpu_flat_work_group_size' attribute requires parameter 0 to be an integer constant}}
130__attribute__((amdgpu_flat_work_group_size(ipow2(5), 64)))
131__global__ void non_cexpr_min_flat_work_group_size_32_64() {}
132// expected-error@+1{{'amdgpu_flat_work_group_size' attribute requires parameter 1 to be an integer constant}}
133__attribute__((amdgpu_flat_work_group_size(32, ipow2(6))))
134__global__ void non_cexpr_max_flat_work_group_size_32_64() {}
135
136// expected-error@+1{{'amdgpu_waves_per_eu' attribute requires parameter 0 to be an integer constant}}
137__attribute__((amdgpu_waves_per_eu("2")))
138__global__ void non_int_min_waves_per_eu_2() {}
139// expected-error@+1{{'amdgpu_waves_per_eu' attribute requires parameter 1 to be an integer constant}}
140__attribute__((amdgpu_waves_per_eu(2, "4")))
141__global__ void non_int_max_waves_per_eu_2_4() {}
142
143// expected-error@+1{{'amdgpu_waves_per_eu' attribute requires parameter 0 to be an integer constant}}
144__attribute__((amdgpu_waves_per_eu(nc_min)))
145__global__ void non_cint_min_waves_per_eu_2() {}
146// expected-error@+1{{'amdgpu_waves_per_eu' attribute requires parameter 1 to be an integer constant}}
147__attribute__((amdgpu_waves_per_eu(2, nc_max)))
148__global__ void non_cint_min_waves_per_eu_2_4() {}
149
150__attribute__((amdgpu_waves_per_eu(c_min / 8)))
151__global__ void cint_min_waves_per_eu_2() {}
152__attribute__((amdgpu_waves_per_eu(c_min / 8, c_max / 8)))
153__global__ void cint_min_waves_per_eu_2_4() {}
154
155// expected-error@+3{{'T' does not refer to a value}}
156// expected-note@+1{{declared here}}
157template<typename T>
158__attribute__((amdgpu_waves_per_eu(T)))
159__global__ void cint_min_waves_per_eu_2() {}
160// expected-error@+3{{'T' does not refer to a value}}
161// expected-note@+1{{declared here}}
162template<typename T>
163__attribute__((amdgpu_waves_per_eu(2, T)))
164__global__ void cint_min_waves_per_eu_2_4() {}
165
166template<unsigned a>
167__attribute__((amdgpu_waves_per_eu(a)))
168__global__ void template_waves_per_eu_2() {}
169template __global__ void template_waves_per_eu_2<2>();
170
171template<unsigned a, unsigned b>
172__attribute__((amdgpu_waves_per_eu(a, b)))
173__global__ void template_waves_per_eu_2_4() {}
174template __global__ void template_waves_per_eu_2_4<2, 4>();
175
176template<unsigned a, unsigned b, unsigned c>
177__attribute__((amdgpu_waves_per_eu(a + b, c - b)))
178__global__ void template_complex_waves_per_eu_2_4() {}
179template __global__ void template_complex_waves_per_eu_2_4<1, 1, 5>();
180
181// expected-error@+2{{expression contains unexpanded parameter pack 'Args'}}
182template<unsigned... Args>
183__attribute__((amdgpu_waves_per_eu(Args)))
184__global__ void template_waves_per_eu_2() {}
185template __global__ void template_waves_per_eu_2<2, 4>();
186
187__attribute__((amdgpu_waves_per_eu(ce_ipow2(1))))
188__global__ void cexpr_waves_per_eu_2() {}
189__attribute__((amdgpu_waves_per_eu(ce_ipow2(1), ce_ipow2(2))))
190__global__ void cexpr_waves_per_eu_2_4() {}
191// expected-error@+1{{'amdgpu_waves_per_eu' attribute requires parameter 0 to be an integer constant}}
192__attribute__((amdgpu_waves_per_eu(ipow2(1))))
193__global__ void non_cexpr_waves_per_eu_2() {}
194// expected-error@+1{{'amdgpu_waves_per_eu' attribute requires parameter 1 to be an integer constant}}
195__attribute__((amdgpu_waves_per_eu(2, ipow2(2))))
196__global__ void non_cexpr_waves_per_eu_2_4() {}
197