mirror of
https://github.com/encounter/dawn-cmake.git
synced 2025-12-12 14:46:08 +00:00
sanitizers: Use the ZeroInitWorkgroupMemory transform
Zero the workgroup memory for all backends. We can probably disable this for the backends that support workgroup zeroing, but that's an optimization we can perform later. Fixed: tint:280 Change-Id: I9cad919ba3a15b8cedfe6939317d1f6b95425453 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/55244 Kokoro: Kokoro <noreply+kokoro@google.com> Reviewed-by: David Neto <dneto@google.com> Reviewed-by: James Price <jrprice@google.com>
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
#include "src/transform/promote_initializers_to_const_var.h"
|
||||
#include "src/transform/simplify.h"
|
||||
#include "src/transform/wrap_arrays_in_structs.h"
|
||||
#include "src/transform/zero_init_workgroup_memory.h"
|
||||
|
||||
namespace tint {
|
||||
namespace transform {
|
||||
@@ -37,6 +38,9 @@ Hlsl::~Hlsl() = default;
|
||||
Output Hlsl::Run(const Program* in, const DataMap&) {
|
||||
Manager manager;
|
||||
DataMap data;
|
||||
// ZeroInitWorkgroupMemory must come before CanonicalizeEntryPointIO as
|
||||
// ZeroInitWorkgroupMemory may inject new builtin parameters.
|
||||
manager.Add<ZeroInitWorkgroupMemory>();
|
||||
manager.Add<CanonicalizeEntryPointIO>();
|
||||
manager.Add<InlinePointerLets>();
|
||||
// Simplify cleans up messy `*(&(expr))` expressions from InlinePointerLets.
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include "src/transform/promote_initializers_to_const_var.h"
|
||||
#include "src/transform/simplify.h"
|
||||
#include "src/transform/wrap_arrays_in_structs.h"
|
||||
#include "src/transform/zero_init_workgroup_memory.h"
|
||||
|
||||
namespace tint {
|
||||
namespace transform {
|
||||
@@ -42,6 +43,9 @@ Msl::~Msl() = default;
|
||||
Output Msl::Run(const Program* in, const DataMap&) {
|
||||
Manager manager;
|
||||
DataMap data;
|
||||
// ZeroInitWorkgroupMemory must come before CanonicalizeEntryPointIO as
|
||||
// ZeroInitWorkgroupMemory may inject new builtin parameters.
|
||||
manager.Add<ZeroInitWorkgroupMemory>();
|
||||
manager.Add<CanonicalizeEntryPointIO>();
|
||||
manager.Add<ExternalTextureTransform>();
|
||||
manager.Add<PromoteInitializersToConstVar>();
|
||||
@@ -173,9 +177,9 @@ void Msl::HandleModuleScopeVariables(CloneContext& ctx) const {
|
||||
ctx.dst->ID(),
|
||||
ast::DisabledValidation::kFunctionVarStorageClass);
|
||||
auto* constructor = ctx.Clone(var->Declaration()->constructor());
|
||||
auto* local_var = ctx.dst->Var(new_var_symbol, store_type,
|
||||
var->StorageClass(), constructor,
|
||||
ast::DecorationList{disable_validation});
|
||||
auto* local_var = ctx.dst->Var(
|
||||
new_var_symbol, store_type, var->StorageClass(), constructor,
|
||||
ast::DecorationList{disable_validation});
|
||||
ctx.InsertFront(func_ast->body()->statements(),
|
||||
ctx.dst->Decl(local_var));
|
||||
}
|
||||
|
||||
@@ -35,10 +35,14 @@ fn main() {
|
||||
|
||||
auto* expect = R"(
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
[[internal(disable_validation__function_var_storage_class)]] var<workgroup> tint_symbol : f32;
|
||||
[[internal(disable_validation__function_var_storage_class)]] var<private> tint_symbol_1 : f32;
|
||||
tint_symbol = tint_symbol_1;
|
||||
fn main([[builtin(local_invocation_index)]] local_invocation_index : u32) {
|
||||
[[internal(disable_validation__function_var_storage_class)]] var<workgroup> tint_symbol_1 : f32;
|
||||
[[internal(disable_validation__function_var_storage_class)]] var<private> tint_symbol_2 : f32;
|
||||
if ((local_invocation_index == 0u)) {
|
||||
tint_symbol_1 = f32();
|
||||
}
|
||||
workgroupBarrier();
|
||||
tint_symbol_1 = tint_symbol_2;
|
||||
}
|
||||
)";
|
||||
|
||||
@@ -76,22 +80,26 @@ fn main() {
|
||||
fn no_uses() {
|
||||
}
|
||||
|
||||
fn bar(a : f32, b : f32, tint_symbol : ptr<private, f32>, tint_symbol_1 : ptr<workgroup, f32>) {
|
||||
*(tint_symbol) = a;
|
||||
*(tint_symbol_1) = b;
|
||||
fn bar(a : f32, b : f32, tint_symbol_1 : ptr<private, f32>, tint_symbol_2 : ptr<workgroup, f32>) {
|
||||
*(tint_symbol_1) = a;
|
||||
*(tint_symbol_2) = b;
|
||||
}
|
||||
|
||||
fn foo(a : f32, tint_symbol_2 : ptr<private, f32>, tint_symbol_3 : ptr<workgroup, f32>) {
|
||||
fn foo(a : f32, tint_symbol_3 : ptr<private, f32>, tint_symbol_4 : ptr<workgroup, f32>) {
|
||||
let b : f32 = 2.0;
|
||||
bar(a, b, tint_symbol_2, tint_symbol_3);
|
||||
bar(a, b, tint_symbol_3, tint_symbol_4);
|
||||
no_uses();
|
||||
}
|
||||
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
[[internal(disable_validation__function_var_storage_class)]] var<private> tint_symbol_4 : f32;
|
||||
fn main([[builtin(local_invocation_index)]] local_invocation_index : u32) {
|
||||
[[internal(disable_validation__function_var_storage_class)]] var<workgroup> tint_symbol_5 : f32;
|
||||
foo(1.0, &(tint_symbol_4), &(tint_symbol_5));
|
||||
[[internal(disable_validation__function_var_storage_class)]] var<private> tint_symbol_6 : f32;
|
||||
if ((local_invocation_index == 0u)) {
|
||||
tint_symbol_5 = f32();
|
||||
}
|
||||
workgroupBarrier();
|
||||
foo(1.0, &(tint_symbol_6), &(tint_symbol_5));
|
||||
}
|
||||
)";
|
||||
|
||||
@@ -141,11 +149,15 @@ fn main() {
|
||||
|
||||
auto* expect = R"(
|
||||
[[stage(compute)]]
|
||||
fn main() {
|
||||
[[internal(disable_validation__function_var_storage_class)]] var<private> tint_symbol : f32;
|
||||
fn main([[builtin(local_invocation_index)]] local_invocation_index : u32) {
|
||||
[[internal(disable_validation__function_var_storage_class)]] var<workgroup> tint_symbol_1 : f32;
|
||||
let x : f32 = (tint_symbol + tint_symbol_1);
|
||||
tint_symbol = x;
|
||||
[[internal(disable_validation__function_var_storage_class)]] var<private> tint_symbol_2 : f32;
|
||||
if ((local_invocation_index == 0u)) {
|
||||
tint_symbol_1 = f32();
|
||||
}
|
||||
workgroupBarrier();
|
||||
let x : f32 = (tint_symbol_2 + tint_symbol_1);
|
||||
tint_symbol_2 = x;
|
||||
}
|
||||
)";
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@
|
||||
#include "src/transform/inline_pointer_lets.h"
|
||||
#include "src/transform/manager.h"
|
||||
#include "src/transform/simplify.h"
|
||||
#include "src/transform/zero_init_workgroup_memory.h"
|
||||
|
||||
TINT_INSTANTIATE_TYPEINFO(tint::transform::Spirv::Config);
|
||||
|
||||
@@ -42,6 +43,7 @@ Spirv::~Spirv() = default;
|
||||
|
||||
Output Spirv::Run(const Program* in, const DataMap& data) {
|
||||
Manager manager;
|
||||
manager.Add<ZeroInitWorkgroupMemory>();
|
||||
manager.Add<InlinePointerLets>(); // Required for arrayLength()
|
||||
manager.Add<Simplify>(); // Required for arrayLength()
|
||||
manager.Add<FoldConstants>();
|
||||
|
||||
Reference in New Issue
Block a user