Skip to content

Commit a932cf4

Browse files
authored
Add diag for new Barrier intrinsic on SM < 6.8 (microsoft#6558)
Tests are split between one containing cases that could potentially be translated to legacy barrier op in the future, and a test without translatable barrier ops. Part of microsoft#6538.
1 parent 1c66c4d commit a932cf4

File tree

11 files changed

+207
-7
lines changed

11 files changed

+207
-7
lines changed

tools/clang/include/clang/Basic/DiagnosticSemaKinds.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7805,6 +7805,9 @@ def warn_hlsl_derivatives_wrong_numthreads : Warning<
78057805
" or broadcast nodes, numthreads must be either 1D with X as a multiple of 4 or"
78067806
" both X and Y must be multiples of 2.">,
78077807
DefaultError, InGroup<HLSLAvailability>;
7808+
def warn_hlsl_intrinsic_in_wrong_shader_model : Warning<
7809+
"intrinsic %0 potentially used by '%1' requires shader model %2 or greater">,
7810+
DefaultError, InGroup<HLSLAvailability>;
78087811
def warn_hlsl_intrinsic_overload_in_wrong_shader_model : Warning<
78097812
"overload of intrinsic %0 requires shader model %1 or greater">,
78107813
DefaultError, InGroup<HLSLAvailability>;

tools/clang/lib/Sema/SemaHLSL.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11478,6 +11478,15 @@ static void DiagnoseReachableBarrier(Sema &S, CallExpr *CE,
1147811478
FunctionDecl *FD = CE->getDirectCallee();
1147911479
DXASSERT(FD->getNumParams() == 2, "otherwise, unknown Barrier overload");
1148011480

11481+
// First, check shader model constraint.
11482+
if (!SM->IsSM68Plus()) {
11483+
Diags.Report(CE->getExprLoc(),
11484+
diag::warn_hlsl_intrinsic_in_wrong_shader_model)
11485+
<< FD->getNameAsString() << EntryDecl->getNameAsString() << "6.8";
11486+
Diags.Report(EntryDecl->getLocation(), diag::note_hlsl_entry_defined_here);
11487+
return;
11488+
}
11489+
1148111490
// Does shader have visible group?
1148211491
// Allow exported library functions as well.
1148311492
bool hasVisibleGroup = ShaderModel::HasVisibleGroup(EntrySK, NodeLaunchTy);

tools/clang/test/SemaHLSL/hlsl/intrinsics/barrier/barrier-cs-errors.hlsl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// RUN: %dxc -Tlib_6_8 -verify %s
22
// RUN: %dxc -Tcs_6_8 -verify %s
3-
// REQUIRES: dxil-1-8
43

54
// Test the ordinary compute shader model case with node memory flags.
65

tools/clang/test/SemaHLSL/hlsl/intrinsics/barrier/barrier-cs-local-errors.hlsl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// RUN: %dxc -Tlib_6_8 -verify %s
22
// RUN: %dxc -Tcs_6_8 -verify %s
3-
// REQUIRES: dxil-1-8
43

54
// Test the ordinary compute shader model case with local call-site errors.
65
// Since these errors are emitted before we do diagnostics for reachable calls,
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// RUN: %dxc -Tlib_6_7 -verify %s
2+
3+
// Test translatable barriers in compute shader model.
4+
// These are currently not translated, so we expect errors for now.
5+
6+
struct RECORD { uint a; };
7+
RWBuffer<uint> buf0;
8+
static uint i = 7;
9+
10+
// Barriers not requiring visible group, compatible with any shader stage.
11+
// expected-note@+4 {{entry function defined here}}
12+
// expected-note@+3 {{entry function defined here}}
13+
// expected-note@+2 {{entry function defined here}}
14+
[noinline] export
15+
void DeviceBarriers() {
16+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
17+
// expected-error@+1 {{intrinsic Barrier potentially used by 'DeviceBarriers' requires shader model 6.8 or greater}}
18+
Barrier(ALL_MEMORY, DEVICE_SCOPE);
19+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
20+
// expected-error@+1 {{intrinsic Barrier potentially used by 'DeviceBarriers' requires shader model 6.8 or greater}}
21+
Barrier(ALL_MEMORY, 2 + 2);
22+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
23+
// expected-error@+1 {{intrinsic Barrier potentially used by 'DeviceBarriers' requires shader model 6.8 or greater}}
24+
Barrier(UAV_MEMORY, DEVICE_SCOPE);
25+
}
26+
27+
// Barriers requiring visible group.
28+
// expected-note@+13 {{entry function defined here}}
29+
// expected-note@+12 {{entry function defined here}}
30+
// expected-note@+11 {{entry function defined here}}
31+
// expected-note@+10 {{entry function defined here}}
32+
// expected-note@+9 {{entry function defined here}}
33+
// expected-note@+8 {{entry function defined here}}
34+
// expected-note@+7 {{entry function defined here}}
35+
// expected-note@+6 {{entry function defined here}}
36+
// expected-note@+5 {{entry function defined here}}
37+
// expected-note@+4 {{entry function defined here}}
38+
// expected-note@+3 {{entry function defined here}}
39+
// expected-note@+2 {{entry function defined here}}
40+
[noinline] export
41+
void GroupBarriers() {
42+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
43+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
44+
Barrier(0, GROUP_SYNC);
45+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
46+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
47+
Barrier(ALL_MEMORY, GROUP_SCOPE);
48+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
49+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
50+
Barrier(ALL_MEMORY, GROUP_SCOPE | GROUP_SYNC);
51+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
52+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
53+
Barrier(ALL_MEMORY, DEVICE_SCOPE | GROUP_SYNC);
54+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
55+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
56+
Barrier(ALL_MEMORY, DEVICE_SCOPE | GROUP_SCOPE | GROUP_SYNC);
57+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
58+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
59+
Barrier(ALL_MEMORY, 1 + 2 + 4);
60+
61+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
62+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
63+
Barrier(UAV_MEMORY, GROUP_SCOPE);
64+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
65+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
66+
Barrier(UAV_MEMORY, GROUP_SCOPE | GROUP_SYNC);
67+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
68+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
69+
Barrier(UAV_MEMORY, DEVICE_SCOPE | GROUP_SYNC);
70+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
71+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
72+
Barrier(UAV_MEMORY, DEVICE_SCOPE | GROUP_SCOPE | GROUP_SYNC);
73+
74+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
75+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
76+
Barrier(GROUP_SHARED_MEMORY, GROUP_SCOPE);
77+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
78+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
79+
Barrier(GROUP_SHARED_MEMORY, GROUP_SCOPE | GROUP_SYNC);
80+
}
81+
82+
// expected-note@+17 {{entry function defined here}}
83+
// expected-note@+16 {{entry function defined here}}
84+
// expected-note@+15 {{entry function defined here}}
85+
// expected-note@+14 {{entry function defined here}}
86+
// expected-note@+13 {{entry function defined here}}
87+
// expected-note@+12 {{entry function defined here}}
88+
// expected-note@+11 {{entry function defined here}}
89+
// expected-note@+10 {{entry function defined here}}
90+
// expected-note@+9 {{entry function defined here}}
91+
// expected-note@+8 {{entry function defined here}}
92+
// expected-note@+7 {{entry function defined here}}
93+
// expected-note@+6 {{entry function defined here}}
94+
// expected-note@+5 {{entry function defined here}}
95+
// expected-note@+4 {{entry function defined here}}
96+
// expected-note@+3 {{entry function defined here}}
97+
[Shader("compute")]
98+
[numthreads(1, 1, 1)]
99+
void main() {
100+
DeviceBarriers();
101+
GroupBarriers();
102+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
// RUN: %dxc -Tlib_6_7 -verify %s
2+
3+
// Test non-translatable barriers in compute shader model.
4+
5+
struct RECORD { uint a; };
6+
RWBuffer<uint> buf0;
7+
static uint i = 7;
8+
9+
// Barriers not requiring visible group, compatible with any shader stage.
10+
// expected-note@+4 {{entry function defined here}}
11+
// expected-note@+3 {{entry function defined here}}
12+
// expected-note@+2 {{entry function defined here}}
13+
[noinline] export
14+
void DeviceBarriers() {
15+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
16+
// expected-error@+1 {{intrinsic Barrier potentially used by 'DeviceBarriers' requires shader model 6.8 or greater}}
17+
Barrier(0, 0);
18+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
19+
// expected-error@+1 {{intrinsic Barrier potentially used by 'DeviceBarriers' requires shader model 6.8 or greater}}
20+
Barrier(ALL_MEMORY, 0);
21+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
22+
// expected-error@+1 {{intrinsic Barrier potentially used by 'DeviceBarriers' requires shader model 6.8 or greater}}
23+
Barrier(UAV_MEMORY, 0);
24+
}
25+
26+
// Barriers requiring visible group.
27+
// expected-note@+5 {{entry function defined here}}
28+
// expected-note@+4 {{entry function defined here}}
29+
// expected-note@+3 {{entry function defined here}}
30+
// expected-note@+2 {{entry function defined here}}
31+
[noinline] export
32+
void GroupBarriers() {
33+
// No scope
34+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
35+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
36+
Barrier(ALL_MEMORY, GROUP_SYNC);
37+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
38+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
39+
Barrier(UAV_MEMORY, GROUP_SYNC);
40+
41+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
42+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
43+
Barrier(GROUP_SHARED_MEMORY, 0);
44+
// expected-error@+2 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
45+
// expected-error@+1 {{intrinsic Barrier potentially used by 'GroupBarriers' requires shader model 6.8 or greater}}
46+
Barrier(GROUP_SHARED_MEMORY, GROUP_SYNC);
47+
}
48+
49+
// expected-note@+14 {{entry function defined here}}
50+
// expected-note@+13 {{entry function defined here}}
51+
// expected-note@+12 {{entry function defined here}}
52+
// expected-note@+11 {{entry function defined here}}
53+
// expected-note@+10 {{entry function defined here}}
54+
// expected-note@+9 {{entry function defined here}}
55+
// expected-note@+8 {{entry function defined here}}
56+
// expected-note@+7 {{entry function defined here}}
57+
// expected-note@+6 {{entry function defined here}}
58+
// expected-note@+5 {{entry function defined here}}
59+
// expected-note@+4 {{entry function defined here}}
60+
// expected-note@+3 {{entry function defined here}}
61+
[Shader("compute")]
62+
[numthreads(1, 1, 1)]
63+
void main() {
64+
DeviceBarriers();
65+
GroupBarriers();
66+
67+
// expected-error@+1 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
68+
Barrier(buf0, 0);
69+
// expected-error@+1 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
70+
Barrier(buf0, GROUP_SYNC);
71+
// expected-error@+1 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
72+
Barrier(buf0, GROUP_SCOPE);
73+
// expected-error@+1 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
74+
Barrier(buf0, DEVICE_SCOPE);
75+
// expected-error@+1 {{intrinsic Barrier potentially used by 'main' requires shader model 6.8 or greater}}
76+
Barrier(buf0, DEVICE_SCOPE | GROUP_SCOPE | GROUP_SYNC);
77+
}
78+
79+
// Unused compute entry should not produce any diagnostics, other than the
80+
// numthreads warning.
81+
82+
// expected-warning@+1 {{attribute 'numthreads' ignored without accompanying shader attribute}}
83+
[numthreads(1, 1, 1)]
84+
void main_unused() {
85+
DeviceBarriers();
86+
GroupBarriers();
87+
88+
Barrier(buf0, 0);
89+
Barrier(buf0, GROUP_SYNC);
90+
Barrier(buf0, GROUP_SCOPE);
91+
Barrier(buf0, DEVICE_SCOPE);
92+
Barrier(buf0, DEVICE_SCOPE | GROUP_SCOPE | GROUP_SYNC);
93+
}

tools/clang/test/SemaHLSL/hlsl/intrinsics/barrier/barrier-cs.hlsl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// RUN: %dxc -Tlib_6_8 -verify %s
22
// RUN: %dxc -Tcs_6_8 -verify %s
3-
// REQUIRES: dxil-1-8
43

54
// Test the compute shader model case with visible group.
65
// expected-no-diagnostics

tools/clang/test/SemaHLSL/hlsl/intrinsics/barrier/barrier-node-errors.hlsl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// RUN: %dxc -Tlib_6_8 -verify %s
2-
// REQUIRES: dxil-1-8
32

43
struct RECORD { uint a; };
54
RWBuffer<uint> buf0;

tools/clang/test/SemaHLSL/hlsl/intrinsics/barrier/barrier-node.hlsl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
// RUN: %dxc -Tlib_6_8 -Wno-unused-value -verify %s
2-
// REQUIRES: dxil-1-8
32

43
// Legal cases, no diagnostics expected for this file.
54
// expected-no-diagnostics

tools/clang/test/SemaHLSL/hlsl/intrinsics/barrier/barrier-vs-errors.hlsl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
// RUN: %dxc -Tlib_6_8 -verify %s
22
// RUN: %dxc -Tvs_6_8 -verify %s
3-
// REQUIRES: dxil-1-8
43

54
// Test the ordinary shader model case with no visible group.
65

0 commit comments

Comments
 (0)