amdgpu-attrs.cu 9.0 KB

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