3a6e1c2554
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>