Skip to content

Commit a86f9da

Browse files
committed
[SYCL] handle group size if sycl or not
1 parent 0db7d55 commit a86f9da

File tree

3 files changed

+58
-23
lines changed

3 files changed

+58
-23
lines changed

clang/lib/Sema/SemaDeclAttr.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2859,6 +2859,25 @@ static void handleWorkGroupSize(Sema &S, Decl *D, const ParsedAttr &AL) {
28592859
WorkGroupAttr(S.Context, AL, WGSize[0], WGSize[1], WGSize[2]));
28602860
}
28612861

2862+
// Handles reqd_sub_group_size and sub_group_size.
2863+
static void handleSubGroupSize(Sema &S, Decl *D, const ParsedAttr &AL) {
2864+
if (!AL.checkExactlyNumArgs(S, 1))
2865+
return;
2866+
2867+
uint32_t WGSize[1];
2868+
Expr *E = AL.getArgAsExpr(0);
2869+
if (!S.checkUInt32Argument(AL, E, WGSize[0], 0,
2870+
/*StrictlyUnsigned=*/true))
2871+
return;
2872+
if (WGSize[0] == 0) {
2873+
S.Diag(AL.getLoc(), diag::err_attribute_argument_is_zero)
2874+
<< AL << E->getSourceRange();
2875+
return;
2876+
}
2877+
D->addAttr(::new (S.Context)
2878+
IntelReqdSubGroupSizeAttr(S.Context, AL, E));
2879+
}
2880+
28622881
static void handleVecTypeHint(Sema &S, Decl *D, const ParsedAttr &AL) {
28632882
// Given attribute is deprecated without replacement in SYCL 2020 mode.
28642883
// Ignore the attribute in SYCL 2020.
@@ -6801,7 +6820,11 @@ ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D, const ParsedAttr &AL,
68016820
S.SYCL().handleSYCLIntelMaxWorkGroupsPerMultiprocessor(D, AL);
68026821
break;
68036822
case ParsedAttr::AT_IntelReqdSubGroupSize:
6804-
S.SYCL().handleIntelReqdSubGroupSizeAttr(D, AL);
6823+
// TODO: deprecate other spellings and change if to assert
6824+
if (S.getLangOpts().SYCLIsDevice || S.getLangOpts().SYCLIsHost)
6825+
S.SYCL().handleIntelReqdSubGroupSizeAttr(D, AL);
6826+
else
6827+
handleSubGroupSize(S, D, AL);
68056828
break;
68066829
case ParsedAttr::AT_IntelNamedSubGroupSize:
68076830
S.SYCL().handleIntelNamedSubGroupSizeAttr(D, AL);

clang/test/SemaSYCL/reqd-sub-group-size.cpp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,33 +32,33 @@ int main() {
3232
});
3333
return 0;
3434
}
35-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
35+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
3636
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
3737
[[intel::reqd_sub_group_size(16)]] SYCL_EXTERNAL void B();
38-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
38+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
3939
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
4040
[[intel::reqd_sub_group_size(16)]] void A() // expected-warning {{'reqd_sub_group_size' attribute can only be applied to a SYCL kernel function}}
4141
{
4242
}
4343

44-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
44+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
4545
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
4646
[[intel::reqd_sub_group_size(16)]] SYCL_EXTERNAL void B();
4747

48-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
48+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
4949
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
5050
[[intel::reqd_sub_group_size(16)]] SYCL_EXTERNAL void B() { // expected-warning {{'reqd_sub_group_size' attribute can only be applied to a SYCL kernel function}}
5151
A();
5252
}
53-
// expected-note@+3 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
53+
// expected-note@+3 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
5454
// expected-warning@+2{{attribute 'intel::reqd_sub_group_size' is deprecated}}
5555
// expected-note@+1 {{conflicting attribute is here}}
5656
[[intel::reqd_sub_group_size(2)]] void sg_size2() {} // expected-warning {{'reqd_sub_group_size' attribute can only be applied to a SYCL kernel function}}
5757

5858
// expected-note@+5 {{conflicting attribute is here}}
5959
// expected-error@+4 {{conflicting attributes applied to a SYCL kernel}}
6060
// expected-warning@+3 {{'reqd_sub_group_size' attribute can only be applied to a SYCL kernel function}}
61-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
61+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
6262
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
6363
[[intel::reqd_sub_group_size(4)]] __attribute__((sycl_device)) void sg_size4() {
6464
sg_size2();
@@ -69,38 +69,38 @@ int main() {
6969
// Tests for incorrect argument values for Intel reqd_sub_group_size attribute.
7070
[[intel::reqd_sub_group_size]] void one() {} // expected-error {{'reqd_sub_group_size' attribute takes one argument}}
7171
[[intel::reqd_sub_group_size(5)]] int a; // expected-error{{'reqd_sub_group_size' attribute only applies to functions}}
72-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
72+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
7373
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
7474
[[intel::reqd_sub_group_size("foo")]] void func() {} // expected-error{{integral constant expression must have integral or unscoped enumeration type, not 'const char[4]'}}
75-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
75+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
7676
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
7777
[[intel::reqd_sub_group_size(-1)]] void func1() {} // expected-error{{'reqd_sub_group_size' attribute requires a positive integral compile time constant expression}}
7878
[[intel::reqd_sub_group_size(0, 1)]] void arg() {} // expected-error{{'reqd_sub_group_size' attribute takes one argument}}
7979

8080
// Diagnostic is emitted because the arguments mismatch.
81-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
81+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
8282
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
8383
[[intel::reqd_sub_group_size(12)]] void quux(); // expected-note {{previous attribute is here}}
84-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
84+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
8585
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
8686
[[intel::reqd_sub_group_size(100)]] void quux(); // expected-warning {{attribute 'reqd_sub_group_size' is already applied with different arguments}} expected-note {{previous attribute is here}}
87-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
87+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
8888
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
8989
[[intel::reqd_sub_group_size(200)]] void quux(); // expected-warning {{attribute 'reqd_sub_group_size' is already applied with different arguments}}
9090

9191
// Make sure there's at least one argument passed.
9292
[[intel::reqd_sub_group_size]] void quibble(); // expected-error {{'reqd_sub_group_size' attribute takes one argument}}
9393

9494
// No diagnostic is emitted because the arguments match.
95-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
95+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
9696
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
9797
[[intel::reqd_sub_group_size(12)]] void same();
98-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
98+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
9999
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
100100
[[intel::reqd_sub_group_size(12)]] void same() {} // expected-warning {{'reqd_sub_group_size' attribute can only be applied to a SYCL kernel function}}
101101

102102
// No diagnostic because the attributes are synonyms with identical behavior.
103-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
103+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
104104
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
105105
[[intel::reqd_sub_group_size(12)]] void same(); // OK
106106

@@ -110,7 +110,7 @@ template <typename Ty>
110110
// expected-error@+5{{'reqd_sub_group_size' attribute requires a positive integral compile time constant expression}}
111111
// expected-error@+4 {{integral constant expression must have integral or unscoped enumeration type, not 'S'}}
112112
// expected-error@+3 {{integral constant expression must have integral or unscoped enumeration type, not 'float'}}
113-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
113+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
114114
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
115115
[[intel::reqd_sub_group_size(Ty{})]] void func() {}
116116

@@ -129,21 +129,21 @@ void test() {
129129
int foo1();
130130
// expected-error@+4{{expression is not an integral constant expression}}
131131
// expected-note@+3{{non-constexpr function 'foo1' cannot be used in a constant expression}}
132-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
132+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
133133
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
134134
[[intel::reqd_sub_group_size(foo1() + 12)]] void func1();
135135

136136
// Test that checks expression is a constant expression.
137137
constexpr int bar1() { return 0; }
138-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
138+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
139139
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
140140
[[intel::reqd_sub_group_size(bar1() + 12)]] void func2(); // OK
141141

142142
// Test that checks template parameter support on member function of class template.
143143
template <int SIZE>
144144
class KernelFunctor {
145145
public:
146-
// expected-note@+3 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
146+
// expected-note@+3 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
147147
// expected-warning@+2{{attribute 'intel::reqd_sub_group_size' is deprecated}}
148148
// expected-error@+1{{'reqd_sub_group_size' attribute requires a positive integral compile time constant expression}}
149149
[[intel::reqd_sub_group_size(SIZE)]] void operator()() {}
@@ -157,20 +157,20 @@ int check() {
157157

158158
// Test that checks template parameter support on function.
159159
template <int N>
160-
// expected-note@+4 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
160+
// expected-note@+4 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
161161
// expected-warning@+3{{attribute 'intel::reqd_sub_group_size' is deprecated}}
162162
// expected-error@+2{{'reqd_sub_group_size' attribute requires a positive integral compile time constant expression}}
163163
// expected-warning@+1 {{'reqd_sub_group_size' attribute can only be applied to a SYCL kernel function}}
164164
[[intel::reqd_sub_group_size(N)]] void func3() {}
165165

166166
template <int N>
167-
// expected-note@+3 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
167+
// expected-note@+3 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
168168
// expected-warning@+2{{attribute 'intel::reqd_sub_group_size' is deprecated}}
169169
// expected-warning@+1 {{'reqd_sub_group_size' attribute can only be applied to a SYCL kernel function}}
170170
[[intel::reqd_sub_group_size(4)]] void func4(); // expected-note {{previous attribute is here}}
171171

172172
template <int N>
173-
// expected-note@+2{{did you mean to use 'intel::reqd_sub_group_size' instead?}}
173+
// expected-note@+2{{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
174174
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
175175
[[intel::reqd_sub_group_size(N)]] void func4() {} // expected-warning {{attribute 'reqd_sub_group_size' is already applied with different arguments}}
176176

clang/test/SemaSYCL/sub-group-size.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,26 @@
1010

1111
#include "Inputs/sycl.hpp"
1212

13+
// expected-note@+4 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
14+
// expected-warning@+3 {{attribute 'intel::sub_group_size' is deprecated}}
1315
// expected-error@+2 {{'named_sub_group_size' and 'sub_group_size' attributes are not compatible}}
1416
// expected-note@+1 {{conflicting attribute is here}}
1517
[[intel::sub_group_size(1)]] [[intel::named_sub_group_size(automatic)]] void f1();
1618
// expected-error@+2 {{'sub_group_size' and 'named_sub_group_size' attributes are not compatible}}
1719
// expected-note@+1 {{conflicting attribute is here}}
1820
[[intel::named_sub_group_size(primary)]] [[intel::sub_group_size(1)]] void f2();
1921

22+
// expected-note@+3 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
23+
// expected-warning@+2 {{attribute 'intel::sub_group_size' is deprecated}}
2024
// expected-note@+1 {{conflicting attribute is here}}
2125
[[intel::sub_group_size(1)]] void f3();
2226
// expected-error@+1 {{'named_sub_group_size' and 'sub_group_size' attributes are not compatible}}
2327
[[intel::named_sub_group_size(primary)]] void f3();
2428

2529
// expected-note@+1 {{conflicting attribute is here}}
2630
[[intel::named_sub_group_size(primary)]] void f4();
31+
// expected-note@+3 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
32+
// expected-warning@+2 {{attribute 'intel::sub_group_size' is deprecated}}
2733
// expected-error@+1 {{'sub_group_size' and 'named_sub_group_size' attributes are not compatible}}
2834
[[intel::sub_group_size(1)]] void f4();
2935

@@ -115,8 +121,14 @@ void calls_kernel_3() {
115121
});
116122
}
117123

124+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
125+
// expected-warning@+1{{attribute 'intel::sub_group_size' is deprecated}}
118126
[[intel::sub_group_size(10)]] void AttrFunc2() {} // #AttrFunc2
127+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
128+
// expected-warning@+1{{attribute 'intel::sub_group_size' is deprecated}}
119129
[[intel::sub_group_size(10)]] SYCL_EXTERNAL void AttrExternalDefined2() {} // #AttrExternalDefined2
130+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
131+
// expected-warning@+1{{attribute 'intel::sub_group_size' is deprecated}}
120132
[[intel::sub_group_size(10)]] SYCL_EXTERNAL void AttrExternalNotDefined2(); // #AttrExternalNotDefined2
121133

122134
void calls_kernel_4() {
@@ -153,7 +165,7 @@ void calls_kernel_5() {
153165

154166
// Don't diag with the old sub-group-size.
155167
void calls_kernel_6() {
156-
// expected-note@+2 {{did you mean to use 'intel::reqd_sub_group_size' instead?}}
168+
// expected-note@+2 {{did you mean to use 'sycl::reqd_sub_group_size' instead?}}
157169
// expected-warning@+1{{attribute 'intel::reqd_sub_group_size' is deprecated}}
158170
sycl::kernel_single_task<class Kernel6>([]() [[intel::reqd_sub_group_size(10)]] { // #Kernel6
159171
NoAttrExternalNotDefined();

0 commit comments

Comments
 (0)