[tint] Skip override expression in BuiltinPolyfill These will never occur here in production flows (due to SubstituteOverrides), but this keeps the fuzzers happy and simplifies the logic. Bug: 348796222 Change-Id: I4a4e8e666029c11e3a1ba1b1ebea7b8f25cfe25f Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/195734 Reviewed-by: dan sinclair <dsinclair@chromium.org> Commit-Queue: James Price <jrprice@google.com>
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc index 3bb5320..6bfe939 100644 --- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc +++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill.cc
@@ -71,10 +71,9 @@ node, // [&](const CallExpression* expr) { Call(expr); }, [&](const BinaryExpression* bin_op) { - if (auto* s = src.Sem().Get(bin_op); - !s || s->Stage() == core::EvaluationStage::kConstant || - s->Stage() == core::EvaluationStage::kNotEvaluated) { - return; // Don't polyfill @const expressions + auto* s = src.Sem().Get(bin_op); + if (!s || s->Stage() != core::EvaluationStage::kRuntime) { + return; // Only polyfill runtime expressions } switch (bin_op->op) { case core::BinaryOp::kShiftLeft: @@ -1301,9 +1300,8 @@ /// Examines the call expression @p expr, applying any necessary polyfill transforms void Call(const CallExpression* expr) { auto* call = src.Sem().Get(expr)->UnwrapMaterialize()->As<sem::Call>(); - if (!call || call->Stage() == core::EvaluationStage::kConstant || - call->Stage() == core::EvaluationStage::kNotEvaluated) { - return; // Don't polyfill @const expressions + if (!call || call->Stage() != core::EvaluationStage::kRuntime) { + return; // Only polyfill runtime expressions } Symbol fn = Switch( call->Target(), //
diff --git a/src/tint/lang/wgsl/ast/transform/builtin_polyfill_test.cc b/src/tint/lang/wgsl/ast/transform/builtin_polyfill_test.cc index 53a9fc4..2d7cd41 100644 --- a/src/tint/lang/wgsl/ast/transform/builtin_polyfill_test.cc +++ b/src/tint/lang/wgsl/ast/transform/builtin_polyfill_test.cc
@@ -45,10 +45,32 @@ EXPECT_FALSE(ShouldRun<BuiltinPolyfill>(src)); } -TEST_F(BuiltinPolyfillTest, EmptyModule) { - auto* src = R"()"; +TEST_F(BuiltinPolyfillTest, ShouldRun_OverrideCall) { + auto* src = R"( +override x = 42.123; +override y = saturate(x); +)"; - EXPECT_FALSE(ShouldRun<BuiltinPolyfill>(src)); + DataMap data; + BuiltinPolyfill::Builtins builtins; + builtins.saturate = true; + data.Add<BuiltinPolyfill::Config>(builtins); + + EXPECT_FALSE(ShouldRun<BuiltinPolyfill>(src, data)); +} + +TEST_F(BuiltinPolyfillTest, ShouldRun_OverrideBinary) { + auto* src = R"( +override v = 10i; +override x = 20i / v; +)"; + + DataMap data; + BuiltinPolyfill::Builtins builtins; + builtins.int_div_mod = true; + data.Add<BuiltinPolyfill::Config>(builtins); + + EXPECT_FALSE(ShouldRun<BuiltinPolyfill>(src, data)); } ////////////////////////////////////////////////////////////////////////////////