This reverts commit 890f694de5.
Previous commit was passing field_type_map_ down in a place where it was not passed down before.
This caused some handles to be used across zones, which caused crashes.
BUG=
Review URL: https://codereview.chromium.org/2453463006 .
i.e. #ifndef VM_WHATEVER -> #ifndef RUNTIME_VM_WHATEVER
This lets us remove a hack from the PRESUBMIT.py script that existed
for reasons that are no longer valid, and sets us up to add some
presubmit checks for the GN build.
R=asiva@google.com, rmacnak@google.com
Review URL: https://codereview.chromium.org/2450713004 .
Start by removing all get:runtimeType overrides in the patch files to have a single point computing the runtime type - Object.get:runtimeType. Handle string, double and integer types inside both intrinsic and runtime call to unify their handling and guarantee that code works even with intrinsifier disabled.
With overrides removed we can easily check that get:runtimeType is unique function name within the application that is being precompiled and use that to convert InstanceCall(get:runtimeType, ...) into StaticCall even nothing is known about the receiver.
This enables us to check if both left side and right side of comparison are StaticCall(Object.get:runtimeType, ...) when specializing InstanceCall(==, x, y). If they are we convert InstanceCall(==, StaticCall(get:runtimeType, a), StaticCall(get:runtimeType, b)) into StaticCall(Object._hasSameRuntimeType, a, b). A canonicalization rule will later delete unused get:runtimeType invocations.
Object._hasSameRuntimeType is implemented in C++ and intrinsified. It operates without creating new runtime types (except for Closures - where it does for simplicity). Cases of different class ids (i.e. a.[cid] != b.[cid]) and non-parameterized types are handled completely in the intrinsic. The rest is handled in the runtime code.
Microbenchmarking results:
Same parameterized classes: 15x improvement
Different parameterized classes: 300x improvement
Different/same non-parameterized classes: 2x improvement
BUG=
R=fschneider@google.com, regis@google.com
Review URL: https://codereview.chromium.org/2379733002 .
If there is no override of noSuchMethod in any class, we can
propagate the receiver type downwards from calls that call a unique
selector.
This speeds up dart2js by around 3%, a particle simulation benchmark by around 10%.
BUG=
R=rmacnak@google.com
Review URL: https://codereview.chromium.org/2412653002 .
Catch block entries need to be considered when doing lazy deoptimization.
In addition to the return, also patch all catch entry blocks in a function scheduled for lazy deoptimization.
Also, move restoring the pool pointer to the jump-to-handler stub to simplify patching the catch entry.
BUG=#27419
R=rmacnak@google.com
Review URL: https://codereview.chromium.org/2357343003 .
This unburdens users of StackZone from needing to include handles_impl.h. A new use of StackZone was recently added to heap.cc without a include of handles_impl.h, and this caused link-time errors on some versions of gcc.
R=asiva@google.com
Review URL: https://codereview.chromium.org/2362573002 .
Move inlining OneByteString._setAt, List constructor, Object constructor
and a few math function to the flow-graph inliner.
Enable inlining of trigonometric math functions in AOT that were previously not inlined.
BUG=
R=rmacnak@google.com
Review URL: https://codereview.chromium.org/2273943002 .
This allows inlining of these methods in the AOT optimizer.
Also fix missing inlining of some SIMD constructors (Float32x4FromInt32x4Bits and Int32x4FromFloat32x4Bits)
BUG=
R=rmacnak@google.com
Review URL: https://codereview.chromium.org/2254053002 .
1. Make CheckArrayBoundInstr also check the index for smi. This allows easy replacement
of the deoptimizing checks with the slow-path checks in the precompiler.
2. Add GenericCheckBoundInstr which has a slow-path attached for
handling check failures.
BUG=
R=vegorov@google.com
Review URL: https://codereview.chromium.org/2149023002 .
Certain CheckedSmiOp operations can be specialized later during optimization
when the compile type turns out to be smi, and we know that the operation
can't deoptimize.
BUG=#26761
R=vegorov@google.com
Review URL: https://codereview.chromium.org/2094613003 .
When encountering call this.m(...) we can check if m resolves to the same
method in all concrete subclasses of the receiver class. If it does then
we don't need any checks and can just use a StaticCall instead of InstanceCall.
This is allows us to improve code quality for cases like:
class Base {
var _field;
foo() { _field = true; }
}
class A01 extends Base { }
...
class A16 extends Base { }
Previously AOT would generate InstanceCall(get:_field) in the method foo.
However with this change we generate StaticCall(...) which subsequently gets
handled by the inliner.
R=fschneider@google.com
BUG=
Review URL: https://codereview.chromium.org/2055263002 .
In Flutter, this caused
RangeError (index): Index out of range: index should be less than null: 0
Uint32List.[]= (dart:typed_data)
_HashVMBase&MapMixin&&_LinkedHashMapMixin._insert (dart:collection-patch/compact_hash.dart)
This reverts commit 0ae4ae5033.
TBR=fschneider@google.com
Review URL: https://codereview.chromium.org/2023423002 .
Most of the infrastructure is fixed to work with DBC stack layout:
- register allocator allocates DBC registers with the limitation that we allocate only 20 registers and bail out if anything needs spilling (there is no use implementing spilling on DBC because registers are memory locations themselves). We should be able to bump number of CPU registers on DBC up to 256 but this requires major surgery in some parts - so I postponed this;
- lazy deoptimization is implemented, eager deoptimization is not - because we don't emit any code that actually requires it. it's a minor change to support it once we have a target;
- stack scanning respects stack maps built by registers allocator;
We bailout from all unsupported instructions.
R=zra@google.com
Review URL: https://codereview.chromium.org/1992963002 .
When deoptimizing on a hoisted TestCids instruction, we must mark the
function to that this instruction does not get hoisted the next time
the function gets optimized.
BUG=dartbug.com/26500
R=vegorov@google.com
Review URL: https://codereview.chromium.org/1999043002 .
Added support for external string using flow graph based intrinsics
which helps with precompiled code, but also polymorphic calls in jitted code.
I also added support for the missing cases in the flow graph optimizer.
BUG=
R=vegorov@google.com
Review URL: https://codereview.chromium.org/1961393002 .
Since we don't have precise liveness information inside try-catch blocks,
there are often redundant phis inside try-catch of the form
v <- phi(v, v, ..., R, v, v, ...)
This CL finds these redundant phis and replaces them with R.
BUG=
R=rmacnak@google.com
Review URL: https://codereview.chromium.org/1918913002 .
This reduces Uri.toString() in dart2js from 514 lines to 345 lines.
(lines are instructions or code comments).
I noticed the following:
Uri.toString() has a statement: sb.write('//');
This was lined two levels deep, with effectively the following code
for the inlining of interoplateSingle:
TestCids on constant '//':
_OneByteString -> return '//';
Uri -> fallthrough;
Message -> fallthrough;
else deopt;
if ('//' is not Uri) deopt;
String s = Uri.toString('//');
if (s is !_OneByteString) deopt;
return s;
With canonicalization of TestCidsInstr, this whole thing clears up
eliminate interoplateSingle.
R=fschneider@google.com
Review URL: https://codereview.chromium.org/1891353003 .
Use the existing class-id check for dense ranges in more places.
Previously we would fall back to megamorphic lookup with >4 cids,
even though we can check cid ranges up to word-size efficiently.
Next step is to generalize the dense class id checks to multiple
word-sizes.
BUG=
R=vegorov@google.com
Review URL: https://codereview.chromium.org/1847293002 .
With catch blocks appearing as additional function entry blocks,
there can be phis for the receiver (parameter 0).
This CL fixes the problem that the receiver type information
was lost in the presence of try-catch.
BUG=
R=vegorov@google.com
Review URL: https://codereview.chromium.org/1841073003 .
Runtime system does not expect to see TypeRef as a destination type for a
type check: type references should only appear in the type arguments of
recursive types.
Reorganize canonicalization code to make it more readable and assertions to
catch this issue earlier.
BUG=http://dartbug.com/25782R=fschneider@google.com
Review URL: https://codereview.chromium.org/1701963002 .