Usually TFA takes kernel AST with all constants evaluated.
However, in order to avoid calling constant evaluator pass in TFA unit tests
there is a special implementation of pragma annotation parser (for testing)
which accepts annotations which are not ConstantExpressions.
After CFE starts evaluating all constants (constant-update-2018 was enabled in
e9ca6a5335), TFA unit tests need be
switched to use ConstantPragmaAnnotationParser.
Also, empty environment defines are passed to CFE to avoid unevaluated constants
and unit test expectations are updated.
Closes https://github.com/dart-lang/sdk/issues/36602
Change-Id: I2e7b0647e065cca129449b4531c6278c1d98061d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99269
Reviewed-by: Samir Jindel <sjindel@google.com>
LoadOptimizer has a builtin alias-analysis which recognized only
Redefinition and AssertAssignable as instructions which must
be followed through when traversing use lists for a given
definition. However after recent changes CheckNull should be
treated the same way as these other two instructions.
This lead to incorrect computation of aliasing identity and
consequently incorrect load forwarding.
This change fixes this bug and also changes implementation of
OriginalDefinition in a way that makes aliasing analysis code
more future-proof.
We introduce virtual method Definition::RedefinedValue and
reimplement Definition::OriginalDefinition through RedefinedValue.
Aliasing analysis is changed to use RedefinedValue to detect
if an instruction is a redefinition.
Fixes https://github.com/flutter/flutter/issues/30619
Bug: https://github.com/flutter/flutter/issues/30619
Change-Id: I8019c93779491a4e6f127119d1d56eb037a3bb56
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99170
Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
Auto-Submit: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
It caused significant size increase due to having register spilling code
for every class allocation stub.
The helper method is called always in "tail" position and it is
therefore ok to clobber registers.
Change-Id: Ic2f19d740230282df1e399ea5009171f7713c837
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99168
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Vyacheslav Egorov <vegorov@google.com>
The slow patch code of allocation stubs goes to runtime to allocate
objects/contexts/arrays. Those native calls seemingly guaranteed that
an object is new-or-remembered.
Though the runtime can actually allocate a new object and it can get
moved to old space right before returning to the continuation of slow
path allocation.
This causes us to have a newly allocated object which is not in the
remembered set.
This CL moves the code for "new-or-remembered guarantee" from
runtime_entry.cc to the call-sites in allocation stubs.
Issue https://github.com/dart-lang/sdk/issues/36369
Change-Id: Ieef9232b4c50fdd84ad81dd8f77697bf0c4775ed
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99143
Commit-Queue: Martin Kustermann <kustermann@google.com>
Reviewed-by: Ryan Macnak <rmacnak@google.com>
This fixes DDC to work when CFE's constants flag is enabled.
The fixes are primarily due to how CFE inlines constants, and how it
handles "unevaluated constants" (these arise from modular compilation
and outline kernel files).
Specifically this CL addresses the following issues:
- private names now work across modules (landed in this CL:
https://dart-review.googlesource.com/c/sdk/+/98926)
- correctly emit tearoffs regardless of how they're represeted
(constant or StaticGet)
- correctly recognize the internal SDK and JS interop annotations,
regardless of how they're represented (constants or expressions)
- change how DDC represents `undefined` in its internal SDK, so
its detected regardless of constant inlining
- emit numeric constants as integers in JS when possible
Change-Id: I0fbda9d24578075f655ea945ed1b2ceed124af48
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99240
Reviewed-by: Mark Zhou <markzipan@google.com>
Commit-Queue: Jenny Messerly <jmesserly@google.com>
This adds support to DDC's Kernel backend for instance constants
inlined across module boundaries, by saving private name symbols
so they can be referred to from outside of the current module.
Change-Id: I28d45d1844f5351f506cc7606dd1c4803037304e
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/98926
Reviewed-by: Mark Zhou <markzipan@google.com>
Commit-Queue: Jenny Messerly <jmesserly@google.com>
Using path dependencies here is misleading - they are not sufficient for a
`pub get` and we do not expect to do a pub solve in this package. In order to
suppress the warnings on `pub publish` we need only the `any` dependencies and
can rely on the repo's `.packages` file to resolve their path.
Change-Id: I5e7b2d50ece2c133b2583fd75eab3509db400a95
Bug: 36581
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99204
Commit-Queue: Nate Bosch <nbosch@google.com>
Reviewed-by: Kevin Moore <kevmoo@google.com>
Given a graph like this:
v1 <- ... T{Foo?}
v2 <- v1.foo()
v3 <- v1.get:field()
We would constrain v1 after invocation - because call guarantees that v1 is
not null.
v1 <- ... T{Foo?}
v2 <- v1.foo()
v4 <- Redefinition(v1) T{Foo}
v3 <- v4.get:field()
Which past inlining can turn into something like
v1 <- ... T{Foo?}
CheckClass(v1, Foo) // Inserted by inlining
...
v4 <- Redefinition(v1 T{Foo}) T{Foo}
v3 <- v4.field
At this point v4 is redundant - because CheckClass above gives the same
guarantee and is movable. Which means we can lift LICM inhibition for v4.field.
Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-bare-linux-release-simarm64-try, vm-kernel-precomp-bare-linux-release-x64-try, vm-kernel-precomp-linux-debug-x64-try
Change-Id: I4b392ede071c41410a27288cae9bbc813a48cc99
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99144
Commit-Queue: Vyacheslav Egorov <vegorov@google.com>
Auto-Submit: Vyacheslav Egorov <vegorov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>