Files
sdk/pkg/vm/test
Alexander Markov 3a6e1c2554 [vm/aot/tfa] Avoid duplicate invocations when approximation is created
When the number of different invocations with the same selector is too
large (due to different arguments), TFA creates an approximate
invocation which uses raw (static) types of parameters.

A new approximate invocation was not queried in the cache and but
could match an existing invocation. This causes a problem as
_DependencyTracker keeps invocations as a Set<_Invocation>, so
duplicate approximate invocation may overwrite an existing
invocation in the dependency tracker, effectively breaking
the dependency chain and preventing invalidation, which could
cause incorrect analysis results and incorrect tree shaking.

This change fixes this bug by adding a lookup of the approximate
invocation in the cache, so duplicate invocation is not created.
Also, TFA heuristic thresholds are extracted to a separate
class to make TFA more configurable and allow writing unit tests
with approximations.

TEST=pkg/vm/testcases/transformations/type_flow/transformer/duplicate_approximate_invocation.dart
TEST=manually verified repro from b/322387862 without workaround.

Bug: b/322387862.
Change-Id: I1ff899f925d539b45f764d709e77c5800884ab4e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/349940
Reviewed-by: Slava Egorov <vegorov@google.com>
Commit-Queue: Alexander Markov <alexmarkov@google.com>
2024-02-06 21:50:24 +00:00
..
2023-01-19 10:06:29 +00:00