Remove unreferenced variables in SingleEntryPoint Transform
For overridable constants without explicit ID, replace the decoration with explicit ID to avoid ID changes impacted by stripped away variables. Bug: tint:1155, dawn:1137 Change-Id: I7d76c08952cfa870403ee2653411b2b6ee2af7b6 Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/69500 Reviewed-by: Ben Clayton <bclayton@google.com> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Shrek Shao <shrekshao@google.com>
This commit is contained in:
parent
b9170c65fc
commit
4b6eb0c6e3
|
@ -74,7 +74,22 @@ void SingleEntryPoint::Run(CloneContext& ctx, const DataMap& inputs, DataMap&) {
|
||||||
// TODO(jrprice): Strip unused types.
|
// TODO(jrprice): Strip unused types.
|
||||||
ctx.dst->AST().AddTypeDecl(ctx.Clone(ty));
|
ctx.dst->AST().AddTypeDecl(ctx.Clone(ty));
|
||||||
} else if (auto* var = decl->As<ast::Variable>()) {
|
} else if (auto* var = decl->As<ast::Variable>()) {
|
||||||
if (var->is_const || referenced_vars.count(var)) {
|
if (referenced_vars.count(var)) {
|
||||||
|
if (var->is_const) {
|
||||||
|
if (auto* deco = ast::GetDecoration<ast::OverrideDecoration>(
|
||||||
|
var->decorations)) {
|
||||||
|
// It is an overridable constant
|
||||||
|
if (!deco->has_value) {
|
||||||
|
// If the decoration doesn't have numeric ID specified explicitly
|
||||||
|
// Make their ids explicitly assigned in the decoration so that
|
||||||
|
// they won't be affected by other stripped away constants
|
||||||
|
auto* global = sem.Get(var)->As<sem::GlobalVariable>();
|
||||||
|
const auto* new_deco =
|
||||||
|
ctx.dst->Override(deco->source, global->ConstantId());
|
||||||
|
ctx.Replace(deco, new_deco);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
ctx.dst->AST().AddGlobalVariable(ctx.Clone(var));
|
ctx.dst->AST().AddGlobalVariable(ctx.Clone(var));
|
||||||
}
|
}
|
||||||
} else if (auto* func = decl->As<ast::Function>()) {
|
} else if (auto* func = decl->As<ast::Function>()) {
|
||||||
|
|
|
@ -219,14 +219,8 @@ fn comp_main2() {
|
||||||
)";
|
)";
|
||||||
|
|
||||||
auto* expect = R"(
|
auto* expect = R"(
|
||||||
let a : f32 = 1.0;
|
|
||||||
|
|
||||||
let b : f32 = 1.0;
|
|
||||||
|
|
||||||
let c : f32 = 1.0;
|
let c : f32 = 1.0;
|
||||||
|
|
||||||
let d : f32 = 1.0;
|
|
||||||
|
|
||||||
[[stage(compute), workgroup_size(1)]]
|
[[stage(compute), workgroup_size(1)]]
|
||||||
fn comp_main1() {
|
fn comp_main1() {
|
||||||
let local_c : f32 = c;
|
let local_c : f32 = c;
|
||||||
|
@ -242,6 +236,120 @@ fn comp_main1() {
|
||||||
EXPECT_EQ(expect, str(got));
|
EXPECT_EQ(expect, str(got));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(SingleEntryPointTest, OverridableConstants) {
|
||||||
|
auto* src = R"(
|
||||||
|
[[override(1001)]] let c1 : u32 = 1u;
|
||||||
|
[[override]] let c2 : u32 = 1u;
|
||||||
|
[[override(0)]] let c3 : u32 = 1u;
|
||||||
|
[[override(9999)]] let c4 : u32 = 1u;
|
||||||
|
|
||||||
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
fn comp_main1() {
|
||||||
|
let local_d = c1;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
fn comp_main2() {
|
||||||
|
let local_d = c2;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
fn comp_main3() {
|
||||||
|
let local_d = c3;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
fn comp_main4() {
|
||||||
|
let local_d = c4;
|
||||||
|
}
|
||||||
|
|
||||||
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
fn comp_main5() {
|
||||||
|
let local_d = 1u;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
|
||||||
|
{
|
||||||
|
SingleEntryPoint::Config cfg("comp_main1");
|
||||||
|
auto* expect = R"(
|
||||||
|
[[override(1001)]] let c1 : u32 = 1u;
|
||||||
|
|
||||||
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
fn comp_main1() {
|
||||||
|
let local_d = c1;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
DataMap data;
|
||||||
|
data.Add<SingleEntryPoint::Config>(cfg);
|
||||||
|
auto got = Run<SingleEntryPoint>(src, data);
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
SingleEntryPoint::Config cfg("comp_main2");
|
||||||
|
// The decorator is replaced with the one with explicit id
|
||||||
|
// And should not be affected by other constants stripped away
|
||||||
|
auto* expect = R"(
|
||||||
|
[[override(1)]] let c2 : u32 = 1u;
|
||||||
|
|
||||||
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
fn comp_main2() {
|
||||||
|
let local_d = c2;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
DataMap data;
|
||||||
|
data.Add<SingleEntryPoint::Config>(cfg);
|
||||||
|
auto got = Run<SingleEntryPoint>(src, data);
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
SingleEntryPoint::Config cfg("comp_main3");
|
||||||
|
auto* expect = R"(
|
||||||
|
[[override(0)]] let c3 : u32 = 1u;
|
||||||
|
|
||||||
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
fn comp_main3() {
|
||||||
|
let local_d = c3;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
DataMap data;
|
||||||
|
data.Add<SingleEntryPoint::Config>(cfg);
|
||||||
|
auto got = Run<SingleEntryPoint>(src, data);
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
SingleEntryPoint::Config cfg("comp_main4");
|
||||||
|
auto* expect = R"(
|
||||||
|
[[override(9999)]] let c4 : u32 = 1u;
|
||||||
|
|
||||||
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
fn comp_main4() {
|
||||||
|
let local_d = c4;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
DataMap data;
|
||||||
|
data.Add<SingleEntryPoint::Config>(cfg);
|
||||||
|
auto got = Run<SingleEntryPoint>(src, data);
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
SingleEntryPoint::Config cfg("comp_main5");
|
||||||
|
auto* expect = R"(
|
||||||
|
[[stage(compute), workgroup_size(1)]]
|
||||||
|
fn comp_main5() {
|
||||||
|
let local_d = 1u;
|
||||||
|
}
|
||||||
|
)";
|
||||||
|
DataMap data;
|
||||||
|
data.Add<SingleEntryPoint::Config>(cfg);
|
||||||
|
auto got = Run<SingleEntryPoint>(src, data);
|
||||||
|
EXPECT_EQ(expect, str(got));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(SingleEntryPointTest, CalledFunctions) {
|
TEST_F(SingleEntryPointTest, CalledFunctions) {
|
||||||
auto* src = R"(
|
auto* src = R"(
|
||||||
fn inner1() {
|
fn inner1() {
|
||||||
|
|
Loading…
Reference in New Issue