From 7dd0ab791a59c89b628981f82f56b9ee3e8208b6 Mon Sep 17 00:00:00 2001 From: James Price Date: Wed, 11 May 2022 22:05:15 +0000 Subject: [PATCH] tint: Show the source of non-uniformity Show the original source of non-uniformity when producing errors from the uniformity analysis. Bug: tint:880 Change-Id: Id386ae8fa5ff1b1443d54c0b5ef12ab76b3b3f13 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/89723 Reviewed-by: Ben Clayton Kokoro: Kokoro --- src/tint/resolver/uniformity.cc | 144 ++++- src/tint/resolver/uniformity_test.cc | 531 +++++++++++++++++- test/tint/bug/dawn/947.wgsl.expected.glsl | 4 + test/tint/bug/dawn/947.wgsl.expected.hlsl | 4 + test/tint/bug/dawn/947.wgsl.expected.msl | 4 + test/tint/bug/dawn/947.wgsl.expected.spvasm | 4 + test/tint/bug/dawn/947.wgsl.expected.wgsl | 4 + .../1112.wgsl.expected.glsl | 4 + .../1112.wgsl.expected.hlsl | 4 + .../1112.wgsl.expected.msl | 4 + .../1112.wgsl.expected.spvasm | 4 + .../1112.wgsl.expected.wgsl | 4 + test/tint/bug/tint/1118.wgsl.expected.glsl | 4 + test/tint/bug/tint/1118.wgsl.expected.hlsl | 4 + test/tint/bug/tint/1118.wgsl.expected.msl | 4 + test/tint/bug/tint/1118.wgsl.expected.spvasm | 4 + test/tint/bug/tint/1118.wgsl.expected.wgsl | 4 + test/tint/bug/tint/943.spvasm.expected.glsl | 1 + test/tint/bug/tint/943.spvasm.expected.hlsl | 1 + test/tint/bug/tint/943.spvasm.expected.msl | 1 + test/tint/bug/tint/943.spvasm.expected.spvasm | 1 + test/tint/bug/tint/943.spvasm.expected.wgsl | 1 + test/tint/bug/tint/948.wgsl.expected.glsl | 4 + test/tint/bug/tint/948.wgsl.expected.hlsl | 4 + test/tint/bug/tint/948.wgsl.expected.msl | 4 + test/tint/bug/tint/948.wgsl.expected.spvasm | 4 + test/tint/bug/tint/948.wgsl.expected.wgsl | 4 + test/tint/bug/tint/949.wgsl.expected.glsl | 4 + test/tint/bug/tint/949.wgsl.expected.hlsl | 4 + test/tint/bug/tint/949.wgsl.expected.msl | 4 + test/tint/bug/tint/949.wgsl.expected.spvasm | 4 + test/tint/bug/tint/949.wgsl.expected.wgsl | 4 + 32 files changed, 743 insertions(+), 37 deletions(-) diff --git a/src/tint/resolver/uniformity.cc b/src/tint/resolver/uniformity.cc index 521fec4300..33def3b396 100644 --- a/src/tint/resolver/uniformity.cc +++ b/src/tint/resolver/uniformity.cc @@ -79,11 +79,23 @@ struct Node { std::string tag; #endif + /// Type describes the type of the node, which is used to determine additional diagnostic + /// information. + enum Type { + kRegular, + kFunctionCallArgument, + kFunctionCallPointerArgumentResult, + kFunctionCallReturnValue, + }; + + /// The type of the node. + Type type = kRegular; + /// The corresponding AST node, or nullptr. const ast::Node* ast = nullptr; - /// The function call argument index, or UINT32_MAX. - uint32_t arg_index = std::numeric_limits::max(); + /// The function call argument index, if applicable. + uint32_t arg_index; /// The set of edges from this node to other nodes in the graph. utils::UniqueVector edges; @@ -895,6 +907,7 @@ class UniformityGraph { auto name = builder_->Symbols().NameFor(ident->symbol); auto* sem = sem_.Get(ident)->Variable(); + auto* node = CreateNode(name + "_ident_expr", ident); return Switch( sem, @@ -910,38 +923,39 @@ class UniformityGraph { uniform = false; } } - return std::make_pair(cf, - uniform ? cf : current_function_->may_be_non_uniform); + node->AddEdge(uniform ? cf : current_function_->may_be_non_uniform); + return std::make_pair(cf, node); } else { if (has_nonuniform_entry_point_attribute(param->Declaration())) { - return std::make_pair(cf, current_function_->may_be_non_uniform); + node->AddEdge(current_function_->may_be_non_uniform); + } else { + node->AddEdge(cf); } - return std::make_pair(cf, cf); + return std::make_pair(cf, node); } } else { - auto* result = CreateNode(name + "_result"); auto* x = current_function_->variables.Get(param); - result->AddEdge(cf); - result->AddEdge(x); - return std::make_pair(cf, result); + node->AddEdge(cf); + node->AddEdge(x); + return std::make_pair(cf, node); } }, [&](const sem::GlobalVariable* global) { if (global->Declaration()->is_const || global->Access() == ast::Access::kRead) { - return std::make_pair(cf, cf); + node->AddEdge(cf); } else { - return std::make_pair(cf, current_function_->may_be_non_uniform); + node->AddEdge(current_function_->may_be_non_uniform); } + return std::make_pair(cf, node); }, [&](const sem::LocalVariable* local) { - auto* result = CreateNode(name + "_result"); - result->AddEdge(cf); + node->AddEdge(cf); if (auto* x = current_function_->variables.Get(local)) { - result->AddEdge(x); + node->AddEdge(x); } - return std::make_pair(cf, result); + return std::make_pair(cf, node); }, [&](Default) { @@ -1110,6 +1124,7 @@ class UniformityGraph { // Note: This is an additional node that isn't described in the specification, for the // purpose of providing diagnostic information. Node* arg_node = CreateNode(name + "_arg_" + std::to_string(i), call); + arg_node->type = Node::kFunctionCallArgument; arg_node->arg_index = static_cast(i); arg_node->AddEdge(arg_i); @@ -1117,7 +1132,8 @@ class UniformityGraph { args.push_back(arg_node); } - Node* result = CreateNode("Result_" + name); + Node* result = CreateNode(name + "_return_value", call); + result->type = Node::kFunctionCallReturnValue; Node* cf_after = CreateNode("CF_after_" + name, call); // Get tags for the callee. @@ -1200,7 +1216,9 @@ class UniformityGraph { auto* sem_arg = sem_.Get(call->args[i]); if (sem_arg->Type()->Is()) { auto* ptr_result = - CreateNode(name + "_ptrarg_" + std::to_string(i) + "_result"); + CreateNode(name + "_ptrarg_" + std::to_string(i) + "_result", call); + ptr_result->type = Node::kFunctionCallPointerArgumentResult; + ptr_result->arg_index = static_cast(i); if (func_info->parameters[i].pointer_may_become_non_uniform) { ptr_result->AddEdge(current_function_->may_be_non_uniform); } else { @@ -1259,7 +1277,7 @@ class UniformityGraph { // function and look for one whose node has an edge from the RequiredToBeUniform node. auto& target_info = functions_.at(user->Declaration()); for (auto* call_node : target_info.required_to_be_uniform->edges) { - if (call_node->arg_index == std::numeric_limits::max()) { + if (call_node->type == Node::kRegular) { auto* child_call = call_node->ast->As(); return FindBuiltinThatRequiresUniformity(child_call); } @@ -1315,7 +1333,7 @@ class UniformityGraph { func_name = builder_->Symbols().NameFor(user->Declaration()->symbol); } - if (cause->arg_index != std::numeric_limits::max()) { + if (cause->type == Node::kFunctionCallArgument) { // The requirement was on a function parameter. auto param_name = builder_->Symbols().NameFor( target->Parameters()[cause->arg_index]->Declaration()->symbol); @@ -1353,7 +1371,91 @@ class UniformityGraph { innermost_call->source); } } - // TODO(jrprice): Show the source of non-uniformity. + + // Show the source of non-uniformity. + if (!note) { + // Traverse the graph to generate a path from RequiredToBeUniform to MayBeNonUniform. + function.ResetVisited(); + Traverse(function.required_to_be_uniform); + + // Get the source of the non-uniform value. + auto* non_uniform_source = function.may_be_non_uniform->visited_from; + TINT_ASSERT(Resolver, non_uniform_source); + + // TODO(jrprice): Show where the non-uniform value results in non-uniform control flow. + + Switch( + non_uniform_source->ast, + [&](const ast::IdentifierExpression* ident) { + std::string var_type = ""; + auto* var = sem_.Get(ident)->Variable(); + switch (var->StorageClass()) { + case ast::StorageClass::kStorage: + var_type = "read_write storage buffer "; + break; + case ast::StorageClass::kWorkgroup: + var_type = "workgroup storage variable "; + break; + case ast::StorageClass::kPrivate: + var_type = "module-scope private variable "; + break; + default: + if (ast::HasAttribute( + var->Declaration()->attributes)) { + var_type = "builtin "; + } else if (ast::HasAttribute( + var->Declaration()->attributes)) { + var_type = "user-defined input "; + } else { + // TODO(jrprice): Provide more info for this case. + } + break; + } + diagnostics_.add_note(diag::System::Resolver, + "reading from " + var_type + "'" + + builder_->Symbols().NameFor(ident->symbol) + + "' may result in a non-uniform value", + ident->source); + }, + [&](const ast::CallExpression* c) { + auto target_name = builder_->Symbols().NameFor( + c->target.name->As()->symbol); + switch (non_uniform_source->type) { + case Node::kRegular: { + diagnostics_.add_note( + diag::System::Resolver, + "calling '" + target_name + + "' may cause subsequent control flow to be non-uniform", + c->source); + // TODO(jrprice): Descend into the function and show the reason why. + break; + } + case Node::kFunctionCallReturnValue: { + diagnostics_.add_note( + diag::System::Resolver, + "return value of '" + target_name + "' may be non-uniform", + c->source); + break; + } + case Node::kFunctionCallPointerArgumentResult: { + diagnostics_.add_note( + diag::System::Resolver, + "pointer contents may become non-uniform after calling '" + + target_name + "'", + c->args[non_uniform_source->arg_index]->source); + break; + } + default: { + TINT_ICE(Resolver, diagnostics_) + << "unhandled source of non-uniformity"; + break; + } + } + }, + [&](Default) { + TINT_ICE(Resolver, diagnostics_) << "unhandled source of non-uniformity"; + }); + } } }; diff --git a/src/tint/resolver/uniformity_test.cc b/src/tint/resolver/uniformity_test.cc index d81d7d6168..d298ec02cb 100644 --- a/src/tint/resolver/uniformity_test.cc +++ b/src/tint/resolver/uniformity_test.cc @@ -394,6 +394,10 @@ fn main() { R"(test:17:3 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:16:3 note: calling 'foo' may cause subsequent control flow to be non-uniform + foo(); + ^^^ )"); } @@ -470,6 +474,10 @@ fn bar() { test:6:5 note: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:11:7 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + foo(rw); + ^^ )"); } @@ -515,6 +523,10 @@ fn bar() { R"(test:10:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:9:11 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + if (foo(rw) == 7) { + ^^ )"); } @@ -572,6 +584,10 @@ fn bar() { R"(test:17:3 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:16:7 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + foo(rw); + ^^ )"); } @@ -607,6 +623,10 @@ fn main(@builtin()" + R"(test:5:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:4:16 note: reading from builtin 'b' may result in a non-uniform value + if (all(vec3(b) == vec3(0u))) { + ^ )"); } } @@ -634,6 +654,10 @@ fn main(s : S) { R"(test:9:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:8:16 note: reading from 's' may result in a non-uniform value + if (all(vec3(s.b) == vec3(0u))) { + ^ )"); } } @@ -671,6 +695,10 @@ fn main(s : S) { R"(test:10:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:9:7 note: reading from 's' may result in a non-uniform value + if (s.num_groups.x == 0u) { + ^ )"); } @@ -694,6 +722,10 @@ fn main(@builtin()" + R"(test:5:5 warning: 'dpdx' must only be called from uniform control flow dpdx(0.5); ^^^^ + +test:4:16 note: reading from builtin 'b' may result in a non-uniform value + if (u32(vec4(b).x) == 0u) { + ^ )"); } } @@ -720,6 +752,10 @@ fn main(s : S) { R"(test:9:5 warning: 'dpdx' must only be called from uniform control flow dpdx(0.5); ^^^^ + +test:8:16 note: reading from 's' may result in a non-uniform value + if (u32(vec4(s.b).x) == 0u) { + ^ )"); } } @@ -749,6 +785,10 @@ fn main(@location(0) l : f32) { R"(test:5:5 warning: 'dpdx' must only be called from uniform control flow dpdx(0.5); ^^^^ + +test:4:7 note: reading from user-defined input 'l' may result in a non-uniform value + if (l == 0.0) { + ^ )"); } @@ -771,6 +811,10 @@ fn main(s : S) { R"(test:9:5 warning: 'dpdx' must only be called from uniform control flow dpdx(0.5); ^^^^ + +test:8:7 note: reading from 's' may result in a non-uniform value + if (s.l == 0.0) { + ^ )"); } @@ -873,12 +917,14 @@ fn foo() { if (condition == kNonUniform) { RunTest(src, false); - EXPECT_EQ( + EXPECT_THAT( error_, - R"(test:13:5 warning: 'workgroupBarrier' must only be called from uniform control flow - workgroupBarrier(); - ^^^^^^^^^^^^^^^^ -)"); + ::testing::StartsWith( + R"(test:13:5 warning: 'workgroupBarrier' must only be called from uniform control flow + workgroupBarrier();)")); + EXPECT_THAT(error_, + ::testing::HasSubstr("test:14:9 note: reading from read_write storage buffer " + "'nonuniform_var' may result in a non-uniform value")); } else { RunTest(src, true); } @@ -910,12 +956,15 @@ fn foo() { if (condition == kNonUniform) { RunTest(src, false); - EXPECT_EQ( + + EXPECT_THAT( error_, - R"(test:14:5 warning: 'workgroupBarrier' must only be called from uniform control flow - workgroupBarrier(); - ^^^^^^^^^^^^^^^^ -)"); + ::testing::StartsWith( + R"(test:14:5 warning: 'workgroupBarrier' must only be called from uniform control flow + workgroupBarrier();)")); + EXPECT_THAT(error_, + ::testing::HasSubstr("test:13:9 note: reading from read_write storage buffer " + "'nonuniform_var' may result in a non-uniform value")); } else { RunTest(src, true); } @@ -949,12 +998,14 @@ fn foo() { if (condition == kNonUniform) { RunTest(src, false); - EXPECT_EQ( + EXPECT_THAT( error_, - R"(test:15:7 warning: 'workgroupBarrier' must only be called from uniform control flow - workgroupBarrier(); - ^^^^^^^^^^^^^^^^ -)"); + ::testing::StartsWith( + R"(test:15:7 warning: 'workgroupBarrier' must only be called from uniform control flow + workgroupBarrier();)")); + EXPECT_THAT(error_, + ::testing::HasSubstr("test:13:9 note: reading from read_write storage buffer " + "'nonuniform_var' may result in a non-uniform value")); } else { RunTest(src, true); } @@ -1004,6 +1055,10 @@ fn foo() { R"(test:7:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:10:16 note: reading from read_write storage buffer 'n' may result in a non-uniform value + if (i == n) { + ^ )"); } @@ -1051,6 +1106,10 @@ fn foo() { R"(test:8:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:10:16 note: reading from read_write storage buffer 'n' may result in a non-uniform value + if (i == n) { + ^ )"); } @@ -1113,6 +1172,10 @@ fn foo() { R"(test:8:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1189,6 +1252,10 @@ fn foo() { R"(test:14:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:8:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1219,6 +1286,10 @@ fn foo() { R"(test:15:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:8:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1254,6 +1325,10 @@ fn foo() { R"(test:20:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:11:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1320,6 +1395,10 @@ fn foo() { R"(test:20:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1353,6 +1432,10 @@ fn foo() { R"(test:8:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1391,6 +1474,10 @@ fn foo() { R"(test:16:9 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1424,6 +1511,10 @@ fn foo() { R"(test:8:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1457,6 +1548,10 @@ fn foo() { R"(test:8:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:14:13 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1585,6 +1680,10 @@ fn foo() { R"(test:15:3 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:5 note: calling 'bar' may cause subsequent control flow to be non-uniform + bar(); + ^^^ )"); } @@ -1618,6 +1717,10 @@ fn foo() { R"(test:6:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:23 note: reading from read_write storage buffer 'n' may result in a non-uniform value + for (var i = 0; i < n; i = i + 1) { + ^ )"); } @@ -1645,6 +1748,10 @@ fn foo() { R"(test:14:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:13:16 note: calling 'bar' may cause subsequent control flow to be non-uniform + for (var i = bar(); i < 10; i = i + 1) { + ^^^ )"); } @@ -1672,6 +1779,10 @@ fn foo() { R"(test:14:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:13:35 note: calling 'bar' may cause subsequent control flow to be non-uniform + for (var i = 0; i < 10; i = i + bar()) { + ^^^ )"); } @@ -1697,6 +1808,10 @@ fn foo() { R"(test:8:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:31 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + for (var i = 0; i < 10; v = non_uniform) { + ^^^^^^^^^^^ )"); } @@ -1744,6 +1859,10 @@ fn foo() { R"(test:10:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:31 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + for (var i = 0; i < 10; v = non_uniform) { + ^^^^^^^^^^^ )"); } @@ -1791,6 +1910,10 @@ fn foo() { R"(test:8:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1844,6 +1967,10 @@ fn foo() { R"(test:15:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:8:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1881,6 +2008,10 @@ fn foo() { R"(test:21:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1915,6 +2046,10 @@ fn foo() { R"(test:8:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -1948,6 +2083,10 @@ fn foo() { R"(test:8:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -2033,6 +2172,10 @@ fn foo() { R"(test:6:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + if (non_uniform == 42) { + ^^^^^^^^^^^ )"); } @@ -2053,6 +2196,10 @@ fn foo() { R"(test:7:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + if (non_uniform == 42) { + ^^^^^^^^^^^ )"); } @@ -2074,6 +2221,10 @@ fn main() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:8 note: reading from read_write storage buffer 'non_uniform_global' may result in a non-uniform value + if ((non_uniform_global == 42) && false) { + ^^^^^^^^^^^^^^^^^^ )"); } @@ -2095,6 +2246,10 @@ fn main() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:17 note: reading from read_write storage buffer 'non_uniform_global' may result in a non-uniform value + if (false && (non_uniform_global == 42)) { + ^^^^^^^^^^^^^^^^^^ )"); } @@ -2116,6 +2271,10 @@ fn main() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:8 note: reading from read_write storage buffer 'non_uniform_global' may result in a non-uniform value + if ((non_uniform_global == 42) || true) { + ^^^^^^^^^^^^^^^^^^ )"); } @@ -2137,6 +2296,10 @@ fn main() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:16 note: reading from read_write storage buffer 'non_uniform_global' may result in a non-uniform value + if (true || (non_uniform_global == 42)) { + ^^^^^^^^^^^^^^^^^^ )"); } @@ -2157,6 +2320,10 @@ fn foo() { R"(test:7:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + if (non_uniform == 42) { + ^^^^^^^^^^^ )"); } @@ -2180,6 +2347,10 @@ fn foo() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:7 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + v = rw; + ^^ )"); } @@ -2249,6 +2420,10 @@ fn foo() { R"(test:15:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:8:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -2324,6 +2499,10 @@ fn foo() { R"(test:12:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -2353,6 +2532,10 @@ fn foo() { R"(test:13:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -2502,6 +2685,10 @@ fn foo() { R"(test:9:3 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + if (non_uniform == 42) { + ^^^^^^^^^^^ )"); } @@ -2524,6 +2711,10 @@ fn foo() { R"(test:9:3 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + if (non_uniform == 42) { + ^^^^^^^^^^^ )"); } @@ -2553,6 +2744,10 @@ fn foo() { R"(test:7:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + switch (non_uniform) { + ^^^^^^^^^^^ )"); } @@ -2575,6 +2770,10 @@ fn foo() { R"(test:7:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + switch (non_uniform) { + ^^^^^^^^^^^ )"); } @@ -2602,6 +2801,10 @@ fn foo() { R"(test:11:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:8:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + if (non_uniform == 42) { + ^^^^^^^^^^^ )"); } @@ -2656,6 +2859,10 @@ fn foo() { R"(test:14:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:8:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + if (non_uniform == 42) { + ^^^^^^^^^^^ )"); } @@ -2713,6 +2920,10 @@ fn foo() { R"(test:14:9 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:9:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + x = non_uniform; + ^^^^^^^^^^^ )"); } @@ -2744,6 +2955,10 @@ fn foo() { R"(test:14:9 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var x = non_uniform; + ^^^^^^^^^^^ )"); } @@ -2802,6 +3017,10 @@ fn foo() { R"(test:19:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:9:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + x = non_uniform; + ^^^^^^^^^^^ )"); } @@ -2860,6 +3079,10 @@ fn foo() { R"(test:18:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var x = non_uniform; + ^^^^^^^^^^^ )"); } @@ -2921,6 +3144,10 @@ fn foo() { R"(test:21:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var x = non_uniform; + ^^^^^^^^^^^ )"); } @@ -2955,6 +3182,10 @@ fn foo() { R"(test:9:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:15:13 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + x = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3085,6 +3316,10 @@ fn foo() { R"(test:17:3 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:13:7 note: calling 'bar' may cause subsequent control flow to be non-uniform + bar(); + ^^^ )"); } @@ -3110,6 +3345,10 @@ fn foo() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + *&v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3132,6 +3371,10 @@ fn foo() { R"(test:9:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:9 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + *pv = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3189,6 +3432,10 @@ fn foo() { R"(test:11:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + if (non_uniform == 0) { + ^^^^^^^^^^^ )"); } @@ -3209,6 +3456,10 @@ fn foo() { R"(test:7:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3230,6 +3481,10 @@ fn foo() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3258,6 +3513,10 @@ fn foo() { test:6:5 note: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:11:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3324,6 +3583,10 @@ fn foo() { R"(test:9:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3364,6 +3627,10 @@ fn foo() { R"(test:10:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:8:14 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + *&*&*pv2 = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3386,6 +3653,10 @@ fn foo() { R"(test:9:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3410,6 +3681,10 @@ fn foo() { R"(test:11:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:9:10 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + *pv2 = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3453,6 +3728,10 @@ fn foo() { R"(test:11:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:8:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3495,6 +3774,10 @@ fn foo() { R"(test:12:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:10:7 note: pointer contents may become non-uniform after calling 'bar' + bar(&v); + ^ )"); } @@ -3540,6 +3823,10 @@ fn foo() { R"(test:12:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:10:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + bar(&v, non_uniform); + ^^^^^^^^^^^ )"); } @@ -3566,6 +3853,10 @@ fn foo() { R"(test:13:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:10:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var a = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3641,6 +3932,10 @@ fn foo() { R"(test:21:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:18:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var a = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3727,6 +4022,10 @@ fn foo() { R"(test:18:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:16:7 note: pointer contents may become non-uniform after calling 'bar' + bar(&v); + ^ )"); } @@ -3756,6 +4055,10 @@ fn foo() { R"(test:16:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:14:7 note: pointer contents may become non-uniform after calling 'bar' + bar(&v); + ^ )"); } @@ -3785,6 +4088,10 @@ fn foo() { R"(test:16:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:14:7 note: pointer contents may become non-uniform after calling 'bar' + bar(&v); + ^ )"); } @@ -3822,6 +4129,10 @@ fn foo() { R"(test:24:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:22:7 note: pointer contents may become non-uniform after calling 'bar' + bar(&v); + ^ )"); } @@ -3853,6 +4164,10 @@ fn foo() { R"(test:18:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:16:7 note: pointer contents may become non-uniform after calling 'bar' + bar(&v); + ^ )"); } @@ -3881,6 +4196,10 @@ fn foo(p : ptr) { R"(test:7:7 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:12 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + *p = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3909,6 +4228,10 @@ fn foo() { R"(test:15:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3936,6 +4259,10 @@ fn foo() { R"(test:14:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:10:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var a = non_uniform; + ^^^^^^^^^^^ )"); } @@ -3985,6 +4312,10 @@ fn foo() { R"(test:14:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:11 note: pointer contents may become non-uniform after calling 'bar' + bar(&a, &b); + ^ )"); } @@ -4032,6 +4363,10 @@ fn foo() { R"(test:12:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:9:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var v = non_uniform; + ^^^^^^^^^^^ )"); } @@ -4062,6 +4397,10 @@ fn foo() { R"(test:14:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:12:11 note: pointer contents may become non-uniform after calling 'bar' + bar(&a, &b); + ^ )"); } @@ -4094,6 +4433,10 @@ fn foo() { R"(test:16:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:11:11 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + var a = non_uniform; + ^^^^^^^^^^^ )"); } @@ -4155,7 +4498,8 @@ TEST_F(UniformityAnalysisTest, MaximumNumberOfPointerParameters) { // TODO(jrprice): Expect false when uniformity issues become errors. EXPECT_TRUE(RunTest(std::move(b))) << error_; EXPECT_EQ(error_, - R"(warning: 'workgroupBarrier' must only be called from uniform control flow)"); + R"(warning: 'workgroupBarrier' must only be called from uniform control flow +note: reading from module-scope private variable 'non_uniform_global' may result in a non-uniform value)"); } //////////////////////////////////////////////////////////////////////////////// @@ -4192,6 +4536,10 @@ fn foo() { R"(test:6:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:7 note: reading from read_write storage buffer 'v' may result in a non-uniform value + if (v[2] == 0) { + ^ )"); } @@ -4213,6 +4561,10 @@ fn foo() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:10 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + v[2] = rw; + ^^ )"); } @@ -4250,6 +4602,10 @@ fn foo() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:10 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + v[1] = rw; + ^^ )"); } @@ -4275,6 +4631,10 @@ fn foo() { R"(test:9:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:10 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + v[1] = rw; + ^^ )"); } @@ -4300,6 +4660,10 @@ fn foo() { R"(test:9:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:10 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + v[1] = rw; + ^^ )"); } @@ -4321,6 +4685,10 @@ fn foo() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:10 note: reading from read_write storage buffer 'non_uniform_global' may result in a non-uniform value + v[1] = non_uniform_global; + ^^^^^^^^^^^^^^^^^^ )"); } @@ -4362,6 +4730,10 @@ fn foo() { R"(test:10:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:9:7 note: reading from read_write storage buffer 's' may result in a non-uniform value + if (s.b == 0) { + ^ )"); } @@ -4387,6 +4759,10 @@ fn foo() { R"(test:12:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:10:9 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + s.b = rw; + ^^ )"); } @@ -4432,6 +4808,10 @@ fn foo() { R"(test:12:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:10:9 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + s.a = rw; + ^^ )"); } @@ -4461,6 +4841,10 @@ fn foo() { R"(test:13:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:10:9 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + s.a = rw; + ^^ )"); } @@ -4490,6 +4874,10 @@ fn foo() { R"(test:13:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:10:9 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + s.a = rw; + ^^ )"); } @@ -4523,6 +4911,10 @@ fn foo() { R"(test:6:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:7 note: reading from read_write storage buffer 'arr' may result in a non-uniform value + if (arr[7] == 0) { + ^^^ )"); } @@ -4544,6 +4936,10 @@ fn foo() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:12 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + arr[2] = rw; + ^^ )"); } @@ -4581,6 +4977,10 @@ fn foo() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:12 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + arr[1] = rw; + ^^ )"); } @@ -4603,6 +5003,10 @@ fn foo() { R"(test:9:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:9 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + *pa = rw; + ^^ )"); } @@ -4628,6 +5032,10 @@ fn foo() { R"(test:9:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:12 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + arr[1] = rw; + ^^ )"); } @@ -4653,6 +5061,10 @@ fn foo() { R"(test:9:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:12 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + arr[1] = rw; + ^^ )"); } @@ -4679,6 +5091,10 @@ fn foo() { R"(test:10:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:12 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + arr[1] = rw; + ^^ )"); } @@ -4702,6 +5118,10 @@ fn foo() { R"(test:6:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:11 note: reading from read_write storage buffer 'non_uniform_global' may result in a non-uniform value + if (i32(non_uniform_global) == 0) { + ^^^^^^^^^^^^^^^^^^ )"); } @@ -4721,6 +5141,10 @@ fn foo() { R"(test:6:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:11 note: reading from read_write storage buffer 'non_uniform_global' may result in a non-uniform value + if (f32(non_uniform_global) == 0.0) { + ^^^^^^^^^^^^^^^^^^ )"); } @@ -4740,6 +5164,10 @@ fn foo() { R"(test:6:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:20 note: reading from read_write storage buffer 'non_uniform_global' may result in a non-uniform value + if (bitcast(non_uniform_global) == 0.0) { + ^^^^^^^^^^^^^^^^^^ )"); } @@ -4762,6 +5190,10 @@ fn foo() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:6:8 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + v += rw; + ^^ )"); } @@ -4784,6 +5216,10 @@ fn foo() { R"(test:8:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:11 note: reading from read_write storage buffer 'rw' may result in a non-uniform value + var v = rw; + ^^ )"); } @@ -4810,6 +5246,10 @@ fn foo() { R"(test:14:3 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:13:7 note: calling 'bar' may cause subsequent control flow to be non-uniform + _ = bar(); + ^^^ )"); } @@ -4830,6 +5270,10 @@ fn main() { R"(test:8:3 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:7:12 note: reading from read_write storage buffer 'non_uniform_global' may result in a non-uniform value + let b = (non_uniform_global == 42) && false; + ^^^^^^^^^^^^^^^^^^ )"); } @@ -4895,6 +5339,10 @@ fn foo() { R"(test:6:5 warning: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:5:18 note: reading from workgroup storage variable 'a' may result in a non-uniform value + if (atomicAdd(&a, 1) == 1) { + ^ )"); } @@ -4914,6 +5362,10 @@ fn foo() { R"(test:6:5 warning: 'storageBarrier' must only be called from uniform control flow storageBarrier(); ^^^^^^^^^^^^^^ + +test:5:18 note: reading from read_write storage buffer 'a' may result in a non-uniform value + if (atomicAdd(&a, 1) == 1) { + ^ )"); } @@ -4961,6 +5413,10 @@ fn main() { test:5:3 note: 'foo' requires uniformity because it calls workgroupBarrier workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:9:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + if (non_uniform == 42) { + ^^^^^^^^^^^ )"); } @@ -4996,6 +5452,10 @@ fn main() { test:5:3 note: 'foo' requires uniformity because it indirectly calls workgroupBarrier workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:17:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + if (non_uniform == 42) { + ^^^^^^^^^^^ )"); } @@ -5039,6 +5499,45 @@ test:11:7 note: parameter 'a' of 'zoo' must be uniform test:6:5 note: 'workgroupBarrier' must only be called from uniform control flow workgroupBarrier(); ^^^^^^^^^^^^^^^^ + +test:19:7 note: reading from read_write storage buffer 'non_uniform' may result in a non-uniform value + foo(non_uniform); + ^^^^^^^^^^^ +)"); +} + +TEST_F(UniformityAnalysisTest, Error_ReturnValueMayBeNonUniformChain) { + auto src = R"( +@group(0) @binding(0) var non_uniform : i32; + +fn zoo() -> i32 { + return non_uniform; +} + +fn bar() -> i32 { + return zoo(); +} + +fn foo() -> i32 { + return bar(); +} + +fn main() { + if (foo() == 42) { + workgroupBarrier(); + } +} +)"; + + RunTest(src, false); + EXPECT_EQ(error_, + R"(test:18:5 warning: 'workgroupBarrier' must only be called from uniform control flow + workgroupBarrier(); + ^^^^^^^^^^^^^^^^ + +test:17:7 note: return value of 'foo' may be non-uniform + if (foo() == 42) { + ^^^ )"); } diff --git a/test/tint/bug/dawn/947.wgsl.expected.glsl b/test/tint/bug/dawn/947.wgsl.expected.glsl index 60c1105772..554f41d03f 100644 --- a/test/tint/bug/dawn/947.wgsl.expected.glsl +++ b/test/tint/bug/dawn/947.wgsl.expected.glsl @@ -2,6 +2,10 @@ bug/dawn/947.wgsl:59:20 warning: 'textureSample' must only be called from unifor var srcColor = textureSample(myTexture, mySampler, texcoord); ^^^^^^^^^^^^^ +bug/dawn/947.wgsl:54:15 note: reading from user-defined input 'texcoord' may result in a non-uniform value + clamp(texcoord, vec2(0.0, 0.0), vec2(1.0, 1.0)); + ^^^^^^^^ + #version 310 es layout(location = 0) out vec2 texcoords_1; diff --git a/test/tint/bug/dawn/947.wgsl.expected.hlsl b/test/tint/bug/dawn/947.wgsl.expected.hlsl index 3b13d95e21..1ab5cd3215 100644 --- a/test/tint/bug/dawn/947.wgsl.expected.hlsl +++ b/test/tint/bug/dawn/947.wgsl.expected.hlsl @@ -2,6 +2,10 @@ bug/dawn/947.wgsl:59:20 warning: 'textureSample' must only be called from unifor var srcColor = textureSample(myTexture, mySampler, texcoord); ^^^^^^^^^^^^^ +bug/dawn/947.wgsl:54:15 note: reading from user-defined input 'texcoord' may result in a non-uniform value + clamp(texcoord, vec2(0.0, 0.0), vec2(1.0, 1.0)); + ^^^^^^^^ + cbuffer cbuffer_uniforms : register(b0, space0) { uint4 uniforms[1]; }; diff --git a/test/tint/bug/dawn/947.wgsl.expected.msl b/test/tint/bug/dawn/947.wgsl.expected.msl index 07a7f73ba6..48e64b1925 100644 --- a/test/tint/bug/dawn/947.wgsl.expected.msl +++ b/test/tint/bug/dawn/947.wgsl.expected.msl @@ -2,6 +2,10 @@ bug/dawn/947.wgsl:59:20 warning: 'textureSample' must only be called from unifor var srcColor = textureSample(myTexture, mySampler, texcoord); ^^^^^^^^^^^^^ +bug/dawn/947.wgsl:54:15 note: reading from user-defined input 'texcoord' may result in a non-uniform value + clamp(texcoord, vec2(0.0, 0.0), vec2(1.0, 1.0)); + ^^^^^^^^ + #include using namespace metal; diff --git a/test/tint/bug/dawn/947.wgsl.expected.spvasm b/test/tint/bug/dawn/947.wgsl.expected.spvasm index a74165cbca..0982f38154 100644 --- a/test/tint/bug/dawn/947.wgsl.expected.spvasm +++ b/test/tint/bug/dawn/947.wgsl.expected.spvasm @@ -2,6 +2,10 @@ bug/dawn/947.wgsl:59:20 warning: 'textureSample' must only be called from unifor var srcColor = textureSample(myTexture, mySampler, texcoord); ^^^^^^^^^^^^^ +bug/dawn/947.wgsl:54:15 note: reading from user-defined input 'texcoord' may result in a non-uniform value + clamp(texcoord, vec2(0.0, 0.0), vec2(1.0, 1.0)); + ^^^^^^^^ + ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 diff --git a/test/tint/bug/dawn/947.wgsl.expected.wgsl b/test/tint/bug/dawn/947.wgsl.expected.wgsl index 6f98645fd1..722544b74f 100644 --- a/test/tint/bug/dawn/947.wgsl.expected.wgsl +++ b/test/tint/bug/dawn/947.wgsl.expected.wgsl @@ -2,6 +2,10 @@ bug/dawn/947.wgsl:59:20 warning: 'textureSample' must only be called from unifor var srcColor = textureSample(myTexture, mySampler, texcoord); ^^^^^^^^^^^^^ +bug/dawn/947.wgsl:54:15 note: reading from user-defined input 'texcoord' may result in a non-uniform value + clamp(texcoord, vec2(0.0, 0.0), vec2(1.0, 1.0)); + ^^^^^^^^ + struct Uniforms { u_scale : vec2, u_offset : vec2, diff --git a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.glsl b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.glsl index 48926b75ed..7a7cda9ac7 100644 --- a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.glsl +++ b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.glsl @@ -2,6 +2,10 @@ bug/fxc/gradient_in_varying_loop/1112.wgsl:23:33 warning: 'textureSample' must o let sampleDepth : f32 = textureSample(depthTexture, Sampler, offset.xy).r; ^^^^^^^^^^^^^ +bug/fxc/gradient_in_varying_loop/1112.wgsl:8:29 note: return value of 'textureSample' may be non-uniform + let random: vec3 = textureSample(randomTexture, Sampler, vUV).rgb; + ^^^^^^^^^^^^^ + #version 310 es precision mediump float; diff --git a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.hlsl b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.hlsl index a6c6dd5dc1..91684d26e8 100644 --- a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.hlsl +++ b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.hlsl @@ -2,6 +2,10 @@ bug/fxc/gradient_in_varying_loop/1112.wgsl:23:33 warning: 'textureSample' must o let sampleDepth : f32 = textureSample(depthTexture, Sampler, offset.xy).r; ^^^^^^^^^^^^^ +bug/fxc/gradient_in_varying_loop/1112.wgsl:8:29 note: return value of 'textureSample' may be non-uniform + let random: vec3 = textureSample(randomTexture, Sampler, vUV).rgb; + ^^^^^^^^^^^^^ + SamplerState tint_symbol : register(s0, space0); Texture2D randomTexture : register(t1, space0); Texture2D depthTexture : register(t2, space0); diff --git a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.msl b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.msl index 62a41ed693..9d936adadf 100644 --- a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.msl +++ b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.msl @@ -2,6 +2,10 @@ bug/fxc/gradient_in_varying_loop/1112.wgsl:23:33 warning: 'textureSample' must o let sampleDepth : f32 = textureSample(depthTexture, Sampler, offset.xy).r; ^^^^^^^^^^^^^ +bug/fxc/gradient_in_varying_loop/1112.wgsl:8:29 note: return value of 'textureSample' may be non-uniform + let random: vec3 = textureSample(randomTexture, Sampler, vUV).rgb; + ^^^^^^^^^^^^^ + #include using namespace metal; diff --git a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm index 31483aed7e..8498249270 100644 --- a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm +++ b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.spvasm @@ -2,6 +2,10 @@ bug/fxc/gradient_in_varying_loop/1112.wgsl:23:33 warning: 'textureSample' must o let sampleDepth : f32 = textureSample(depthTexture, Sampler, offset.xy).r; ^^^^^^^^^^^^^ +bug/fxc/gradient_in_varying_loop/1112.wgsl:8:29 note: return value of 'textureSample' may be non-uniform + let random: vec3 = textureSample(randomTexture, Sampler, vUV).rgb; + ^^^^^^^^^^^^^ + ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 diff --git a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl index 1761161933..751238ab01 100644 --- a/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl +++ b/test/tint/bug/fxc/gradient_in_varying_loop/1112.wgsl.expected.wgsl @@ -2,6 +2,10 @@ bug/fxc/gradient_in_varying_loop/1112.wgsl:23:33 warning: 'textureSample' must o let sampleDepth : f32 = textureSample(depthTexture, Sampler, offset.xy).r; ^^^^^^^^^^^^^ +bug/fxc/gradient_in_varying_loop/1112.wgsl:8:29 note: return value of 'textureSample' may be non-uniform + let random: vec3 = textureSample(randomTexture, Sampler, vUV).rgb; + ^^^^^^^^^^^^^ + @group(0) @binding(0) var Sampler : sampler; @group(0) @binding(1) var randomTexture : texture_2d; diff --git a/test/tint/bug/tint/1118.wgsl.expected.glsl b/test/tint/bug/tint/1118.wgsl.expected.glsl index 39bc4598c7..82784e3812 100644 --- a/test/tint/bug/tint/1118.wgsl.expected.glsl +++ b/test/tint/bug/tint/1118.wgsl.expected.glsl @@ -2,6 +2,10 @@ bug/tint/1118.wgsl:64:31 warning: 'dpdx' must only be called from uniform contro normalW = normalize(-(cross(dpdx(x_62), dpdy(x_64)))); ^^^^ +bug/tint/1118.wgsl:46:19 note: reading from module-scope private variable 'fClipDistance3' may result in a non-uniform value + let x_9 : f32 = fClipDistance3; + ^^^^^^^^^^^^^^ + #version 310 es precision mediump float; diff --git a/test/tint/bug/tint/1118.wgsl.expected.hlsl b/test/tint/bug/tint/1118.wgsl.expected.hlsl index 467aea6829..e24fb49238 100644 --- a/test/tint/bug/tint/1118.wgsl.expected.hlsl +++ b/test/tint/bug/tint/1118.wgsl.expected.hlsl @@ -2,6 +2,10 @@ bug/tint/1118.wgsl:64:31 warning: 'dpdx' must only be called from uniform contro normalW = normalize(-(cross(dpdx(x_62), dpdy(x_64)))); ^^^^ +bug/tint/1118.wgsl:46:19 note: reading from module-scope private variable 'fClipDistance3' may result in a non-uniform value + let x_9 : f32 = fClipDistance3; + ^^^^^^^^^^^^^^ + static float fClipDistance3 = 0.0f; static float fClipDistance4 = 0.0f; cbuffer cbuffer_x_29 : register(b0, space0) { diff --git a/test/tint/bug/tint/1118.wgsl.expected.msl b/test/tint/bug/tint/1118.wgsl.expected.msl index a8d14c5fd1..13b15b3cbc 100644 --- a/test/tint/bug/tint/1118.wgsl.expected.msl +++ b/test/tint/bug/tint/1118.wgsl.expected.msl @@ -2,6 +2,10 @@ bug/tint/1118.wgsl:64:31 warning: 'dpdx' must only be called from uniform contro normalW = normalize(-(cross(dpdx(x_62), dpdy(x_64)))); ^^^^ +bug/tint/1118.wgsl:46:19 note: reading from module-scope private variable 'fClipDistance3' may result in a non-uniform value + let x_9 : f32 = fClipDistance3; + ^^^^^^^^^^^^^^ + #include using namespace metal; diff --git a/test/tint/bug/tint/1118.wgsl.expected.spvasm b/test/tint/bug/tint/1118.wgsl.expected.spvasm index 26653b674a..35d97e8bd0 100644 --- a/test/tint/bug/tint/1118.wgsl.expected.spvasm +++ b/test/tint/bug/tint/1118.wgsl.expected.spvasm @@ -2,6 +2,10 @@ bug/tint/1118.wgsl:64:31 warning: 'dpdx' must only be called from uniform contro normalW = normalize(-(cross(dpdx(x_62), dpdy(x_64)))); ^^^^ +bug/tint/1118.wgsl:46:19 note: reading from module-scope private variable 'fClipDistance3' may result in a non-uniform value + let x_9 : f32 = fClipDistance3; + ^^^^^^^^^^^^^^ + ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 diff --git a/test/tint/bug/tint/1118.wgsl.expected.wgsl b/test/tint/bug/tint/1118.wgsl.expected.wgsl index d2a3bc3841..c2c3289691 100644 --- a/test/tint/bug/tint/1118.wgsl.expected.wgsl +++ b/test/tint/bug/tint/1118.wgsl.expected.wgsl @@ -2,6 +2,10 @@ bug/tint/1118.wgsl:64:31 warning: 'dpdx' must only be called from uniform contro normalW = normalize(-(cross(dpdx(x_62), dpdy(x_64)))); ^^^^ +bug/tint/1118.wgsl:46:19 note: reading from module-scope private variable 'fClipDistance3' may result in a non-uniform value + let x_9 : f32 = fClipDistance3; + ^^^^^^^^^^^^^^ + struct Scene { vEyePosition : vec4, } diff --git a/test/tint/bug/tint/943.spvasm.expected.glsl b/test/tint/bug/tint/943.spvasm.expected.glsl index 7edb269726..3f81f5a082 100644 --- a/test/tint/bug/tint/943.spvasm.expected.glsl +++ b/test/tint/bug/tint/943.spvasm.expected.glsl @@ -1,5 +1,6 @@ warning: parameter 'dimInner' of 'mm_matMul_i1_i1_i1_' must be uniform note: 'workgroupBarrier' must only be called from uniform control flow +note: reading from module-scope private variable 'dimInner_1' may result in a non-uniform value #version 310 es struct Uniforms { diff --git a/test/tint/bug/tint/943.spvasm.expected.hlsl b/test/tint/bug/tint/943.spvasm.expected.hlsl index ece0c20678..b3aa90bd9c 100644 --- a/test/tint/bug/tint/943.spvasm.expected.hlsl +++ b/test/tint/bug/tint/943.spvasm.expected.hlsl @@ -1,5 +1,6 @@ warning: parameter 'dimInner' of 'mm_matMul_i1_i1_i1_' must be uniform note: 'workgroupBarrier' must only be called from uniform control flow +note: reading from module-scope private variable 'dimInner_1' may result in a non-uniform value static int dimAOuter_1 = 0; cbuffer cbuffer_x_48 : register(b3, space0) { uint4 x_48[5]; diff --git a/test/tint/bug/tint/943.spvasm.expected.msl b/test/tint/bug/tint/943.spvasm.expected.msl index 48f3434ea8..63f5ad3107 100644 --- a/test/tint/bug/tint/943.spvasm.expected.msl +++ b/test/tint/bug/tint/943.spvasm.expected.msl @@ -1,5 +1,6 @@ warning: parameter 'dimInner' of 'mm_matMul_i1_i1_i1_' must be uniform note: 'workgroupBarrier' must only be called from uniform control flow +note: reading from module-scope private variable 'dimInner_1' may result in a non-uniform value #include using namespace metal; diff --git a/test/tint/bug/tint/943.spvasm.expected.spvasm b/test/tint/bug/tint/943.spvasm.expected.spvasm index e9fc8c5981..95719122ce 100644 --- a/test/tint/bug/tint/943.spvasm.expected.spvasm +++ b/test/tint/bug/tint/943.spvasm.expected.spvasm @@ -1,5 +1,6 @@ warning: parameter 'dimInner' of 'mm_matMul_i1_i1_i1_' must be uniform note: 'workgroupBarrier' must only be called from uniform control flow +note: reading from module-scope private variable 'dimInner_1' may result in a non-uniform value ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 diff --git a/test/tint/bug/tint/943.spvasm.expected.wgsl b/test/tint/bug/tint/943.spvasm.expected.wgsl index 08be16a8ee..f168e2efef 100644 --- a/test/tint/bug/tint/943.spvasm.expected.wgsl +++ b/test/tint/bug/tint/943.spvasm.expected.wgsl @@ -1,5 +1,6 @@ warning: parameter 'dimInner' of 'mm_matMul_i1_i1_i1_' must be uniform note: 'workgroupBarrier' must only be called from uniform control flow +note: reading from module-scope private variable 'dimInner_1' may result in a non-uniform value struct Uniforms { NAN : f32, @size(12) diff --git a/test/tint/bug/tint/948.wgsl.expected.glsl b/test/tint/bug/tint/948.wgsl.expected.glsl index a675fe9e9f..628473cdcd 100644 --- a/test/tint/bug/tint/948.wgsl.expected.glsl +++ b/test/tint/bug/tint/948.wgsl.expected.glsl @@ -2,6 +2,10 @@ bug/tint/948.wgsl:146:33 warning: 'textureSampleBias' must only be called from u let x_217 : vec4 = textureSampleBias(animationMapTexture, animationMapSampler, vec2(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0); ^^^^^^^^^^^^^^^^^ +bug/tint/948.wgsl:146:33 note: return value of 'textureSampleBias' may be non-uniform + let x_217 : vec4 = textureSampleBias(animationMapTexture, animationMapSampler, vec2(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0); + ^^^^^^^^^^^^^^^^^ + #version 310 es precision mediump float; diff --git a/test/tint/bug/tint/948.wgsl.expected.hlsl b/test/tint/bug/tint/948.wgsl.expected.hlsl index 1869503ca7..c866800bff 100644 --- a/test/tint/bug/tint/948.wgsl.expected.hlsl +++ b/test/tint/bug/tint/948.wgsl.expected.hlsl @@ -2,6 +2,10 @@ bug/tint/948.wgsl:146:33 warning: 'textureSampleBias' must only be called from u let x_217 : vec4 = textureSampleBias(animationMapTexture, animationMapSampler, vec2(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0); ^^^^^^^^^^^^^^^^^ +bug/tint/948.wgsl:146:33 note: return value of 'textureSampleBias' may be non-uniform + let x_217 : vec4 = textureSampleBias(animationMapTexture, animationMapSampler, vec2(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0); + ^^^^^^^^^^^^^^^^^ + cbuffer cbuffer_x_20 : register(b9, space2) { uint4 x_20[8]; }; diff --git a/test/tint/bug/tint/948.wgsl.expected.msl b/test/tint/bug/tint/948.wgsl.expected.msl index f799044a9b..c8cbbb1329 100644 --- a/test/tint/bug/tint/948.wgsl.expected.msl +++ b/test/tint/bug/tint/948.wgsl.expected.msl @@ -2,6 +2,10 @@ bug/tint/948.wgsl:146:33 warning: 'textureSampleBias' must only be called from u let x_217 : vec4 = textureSampleBias(animationMapTexture, animationMapSampler, vec2(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0); ^^^^^^^^^^^^^^^^^ +bug/tint/948.wgsl:146:33 note: return value of 'textureSampleBias' may be non-uniform + let x_217 : vec4 = textureSampleBias(animationMapTexture, animationMapSampler, vec2(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0); + ^^^^^^^^^^^^^^^^^ + #include using namespace metal; diff --git a/test/tint/bug/tint/948.wgsl.expected.spvasm b/test/tint/bug/tint/948.wgsl.expected.spvasm index 4f5102c598..ad59285c12 100644 --- a/test/tint/bug/tint/948.wgsl.expected.spvasm +++ b/test/tint/bug/tint/948.wgsl.expected.spvasm @@ -2,6 +2,10 @@ bug/tint/948.wgsl:146:33 warning: 'textureSampleBias' must only be called from u let x_217 : vec4 = textureSampleBias(animationMapTexture, animationMapSampler, vec2(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0); ^^^^^^^^^^^^^^^^^ +bug/tint/948.wgsl:146:33 note: return value of 'textureSampleBias' may be non-uniform + let x_217 : vec4 = textureSampleBias(animationMapTexture, animationMapSampler, vec2(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0); + ^^^^^^^^^^^^^^^^^ + ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 diff --git a/test/tint/bug/tint/948.wgsl.expected.wgsl b/test/tint/bug/tint/948.wgsl.expected.wgsl index 791079b37f..ee116ab507 100644 --- a/test/tint/bug/tint/948.wgsl.expected.wgsl +++ b/test/tint/bug/tint/948.wgsl.expected.wgsl @@ -2,6 +2,10 @@ bug/tint/948.wgsl:146:33 warning: 'textureSampleBias' must only be called from u let x_217 : vec4 = textureSampleBias(animationMapTexture, animationMapSampler, vec2(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0); ^^^^^^^^^^^^^^^^^ +bug/tint/948.wgsl:146:33 note: return value of 'textureSampleBias' may be non-uniform + let x_217 : vec4 = textureSampleBias(animationMapTexture, animationMapSampler, vec2(((x_208 + 0.5) / x_211), (0.125 * x_214)), 0.0); + ^^^^^^^^^^^^^^^^^ + struct LeftOver { time : f32, @size(12) diff --git a/test/tint/bug/tint/949.wgsl.expected.glsl b/test/tint/bug/tint/949.wgsl.expected.glsl index e60090b9ae..3a8e2ec578 100644 --- a/test/tint/bug/tint/949.wgsl.expected.glsl +++ b/test/tint/bug/tint/949.wgsl.expected.glsl @@ -2,6 +2,10 @@ bug/tint/949.wgsl:326:29 warning: 'textureSample' must only be called from unifo let x_397 : vec4 = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395)); ^^^^^^^^^^^^^ +bug/tint/949.wgsl:326:29 note: return value of 'textureSample' may be non-uniform + let x_397 : vec4 = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395)); + ^^^^^^^^^^^^^ + #version 310 es precision mediump float; diff --git a/test/tint/bug/tint/949.wgsl.expected.hlsl b/test/tint/bug/tint/949.wgsl.expected.hlsl index 2bdadf0fb3..11c96d99cd 100644 --- a/test/tint/bug/tint/949.wgsl.expected.hlsl +++ b/test/tint/bug/tint/949.wgsl.expected.hlsl @@ -2,6 +2,10 @@ bug/tint/949.wgsl:326:29 warning: 'textureSample' must only be called from unifo let x_397 : vec4 = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395)); ^^^^^^^^^^^^^ +bug/tint/949.wgsl:326:29 note: return value of 'textureSample' may be non-uniform + let x_397 : vec4 = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395)); + ^^^^^^^^^^^^^ + struct lightingInfo { float3 diffuse; float3 specular; diff --git a/test/tint/bug/tint/949.wgsl.expected.msl b/test/tint/bug/tint/949.wgsl.expected.msl index 0701a4a97c..505fa31bb0 100644 --- a/test/tint/bug/tint/949.wgsl.expected.msl +++ b/test/tint/bug/tint/949.wgsl.expected.msl @@ -2,6 +2,10 @@ bug/tint/949.wgsl:326:29 warning: 'textureSample' must only be called from unifo let x_397 : vec4 = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395)); ^^^^^^^^^^^^^ +bug/tint/949.wgsl:326:29 note: return value of 'textureSample' may be non-uniform + let x_397 : vec4 = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395)); + ^^^^^^^^^^^^^ + #include using namespace metal; diff --git a/test/tint/bug/tint/949.wgsl.expected.spvasm b/test/tint/bug/tint/949.wgsl.expected.spvasm index 287968a126..0b10e58784 100644 --- a/test/tint/bug/tint/949.wgsl.expected.spvasm +++ b/test/tint/bug/tint/949.wgsl.expected.spvasm @@ -2,6 +2,10 @@ bug/tint/949.wgsl:326:29 warning: 'textureSample' must only be called from unifo let x_397 : vec4 = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395)); ^^^^^^^^^^^^^ +bug/tint/949.wgsl:326:29 note: return value of 'textureSample' may be non-uniform + let x_397 : vec4 = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395)); + ^^^^^^^^^^^^^ + ; SPIR-V ; Version: 1.3 ; Generator: Google Tint Compiler; 0 diff --git a/test/tint/bug/tint/949.wgsl.expected.wgsl b/test/tint/bug/tint/949.wgsl.expected.wgsl index 48c21aacd7..4733075804 100644 --- a/test/tint/bug/tint/949.wgsl.expected.wgsl +++ b/test/tint/bug/tint/949.wgsl.expected.wgsl @@ -2,6 +2,10 @@ bug/tint/949.wgsl:326:29 warning: 'textureSample' must only be called from unifo let x_397 : vec4 = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395)); ^^^^^^^^^^^^^ +bug/tint/949.wgsl:326:29 note: return value of 'textureSample' may be non-uniform + let x_397 : vec4 = textureSample(TextureSamplerTexture, TextureSamplerSampler, (x_394 + x_395)); + ^^^^^^^^^^^^^ + struct lightingInfo { diffuse : vec3, specular : vec3,