Commit Graph

202 Commits

Author SHA1 Message Date
Ryan Macnak 7ff2dd4117 Optimize AOT's switchable calls for the monomorphic case.
The call sequence is very similar to a classic IC call, except the guarded class and the target are loaded indirectly from the constant pool instead of as immediates. In the monomorphic case, we call directly to the expected target with a class check in the callee. In the unlinked, polymorphic and megamorphic cases, we call a stub; these case are now call-through instead of call-and-return.

Every code, except stubs involved in switchable calls, includes the class check sequence at the beginning. So we now distinguish between a checked and an unchecked entry point. Generated code except the switchable call continues to use the unchecked entry point.

PC offsets are calculated relative to the beginning of the instruction stream, rather than either entry point.

BUG=
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2226893002 .
2016-08-12 11:18:35 -07:00
Florian Schneider f50a14c4a9 Remove remaining stub code for IC range profiling.
I forgot to remove this in my previous CL.

BUG=
R=vegorov@google.com

Review URL: https://codereview.chromium.org/2140683002 .
2016-07-11 09:11:26 -07:00
Florian Schneider ab4490e5bf VM: Remove collection of unused range feedback.
We can always put it back if the optimizer makes use of it.
It's a lot of extra code that is unused. Therefore, remove it for now.

BUG=
R=vegorov@google.com

Review URL: https://codereview.chromium.org/2132933003 .
2016-07-11 06:46:50 -07:00
Lars Bak 38898e0a9a Megamorphic code cleanup.
- Removed the flag use_megamorphic_stub and
- Removed StubCode::EmitMegamorphicLookup (inlined version of megamorphic call).
- Removed the null load in GenerateMegamorphicLookupStub for arm64 to match other platforms.

BUG=
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2132803002 .
2016-07-07 14:34:17 -07:00
Lars Bak 4e7bb93773 - Optimized the call sequences for calling the megamorphic stub on all platforms.
- Optimized instructions in the megamorphic stubs on X64, IA32, ARM, and ARM64.
In a micro benchmark testing megamorphic calls using 71 different receiver types,
the execution times goes from 2.6 sec to 1.4 sec.

BUG=
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2131583002 .
2016-07-07 11:21:53 -07:00
Siva Annamalai de5a1c8dac Remove support for pretenuring as it is not fully implemented and is currently turned on for a very specific case (double to string for one byte strings).
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2119633002 .
2016-07-01 12:59:19 -07:00
Siva Annamalai 006bab2c47 Land Ivan's change of 'Remove support for verified memory handling'
R=fschneider@google.com

Review URL: https://codereview.chromium.org/2112043002 .
2016-07-01 09:21:01 -07:00
Florian Schneider 46f8b02dbb VM: Don't generate allocation stats code in product mode.
They are not needed since there is no observatory/profiling support
in product mode.

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/2105383003 .
2016-06-30 13:35:40 -07:00
Ryan Macnak 4d48c341bf Include multiplication in the megamorphic cache hash to avoid cid ranges overlapping modulo table size from causing large displacements.
CompileOnceHelloHtml +7.115% x64
Dart2JSCompileAll +1.363% x64

R=iposva@google.com

Review URL: https://codereview.chromium.org/1998263002 .
2016-05-20 10:41:41 -07:00
Ryan Macnak 85cdc0eac2 Don't assume we want the iOS ABI if running simarm on Mac and the EABI otherwise.
Allow controlling the target ABI by defining TARGET_ABI_IOS or TARGET_ABI_EABI.  If neither is defined, default to the previous behavior.

Make Linux, Mac, Android and iOS agree on the value of PreferredCodeAlignment for all architectures.

BUG=http://dartbug.com/26464
R=zra@google.com

Review URL: https://codereview.chromium.org/1982613003 .
2016-05-17 15:03:54 -07:00
Ryan Macnak 05d8185470 Never include_isolate or allow_embedded_addresses.
Makes the JIT PIC on non-IA32 like precompilation, a prerequisite for caching code across processes.

R=fschneider@google.com, johnmccutchan@google.com

Review URL: https://codereview.chromium.org/1911253002 .
2016-04-22 20:47:23 -07:00
Ryan Macnak ba608694b7 Ensure deoptimizing frames have a valid pc marker before deferred materialization.
BUG=http://dartbug.com/26131
R=fschneider@google.com

Review URL: https://codereview.chromium.org/1847623002 .
2016-03-30 13:11:14 -07:00
Ryan Macnak aefb7a424c Precompilation: Change instance call sequence to load the entry point and Code object from the ic data array instead of loading them indirectly from the Function object loaded from the same array.
Load the Code from the ic data array instead of the ObjectPool because we still need the Code object in the frame to find stackmaps / build stacktraces / build profile results.

Keep doing things the old way until all compilation is finished because evaluation of constants still needs functional lazy compilation and the compiler works with ICData that may contain as-yet-uncompiled functions. After compilation is finished, transform all the ICData from (cid, target function, count) to (cid, target code, entry point) and switch to the ICLookup stub that works with this representation.

Golem average +3.133% on ARM, +3.544% on x64

R=srdjan@google.com

Review URL: https://codereview.chromium.org/1799793002 .
2016-03-17 15:41:04 -07:00
Florian Schneider d8677964a3 Move precompilation-related flags to flags list.
They become compile-time constants in the precompiled runtime, and in product mode.

In precompiled product mode, the precompiled value has precedence.

BUG=
R=rmacnak@google.com

Committed: https://github.com/dart-lang/sdk/commit/5c9f18c6c87284395564051a052cc4acc9b6f59a

Review URL: https://codereview.chromium.org/1731743003 .
2016-02-25 07:53:39 -08:00
Ryan Macnak bd85deaf4e Revert "Move precompilation-related flags to flags list."
The default value of print_stop_message was architecture specific.

TBR=fschneider@google.com

Review URL: https://codereview.chromium.org/1739593002 .
2016-02-24 18:08:01 -08:00
Florian Schneider 5c9f18c6c8 Move precompilation-related flags to flags list.
They become compile-time constants in the precompiled runtime, and in product mode.

In precompiled product mode, the precompiled value has precedence.

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1731743003 .
2016-02-24 17:31:08 -08:00
Florian Schneider b870dafa4f VM: Separate precompilation-specific code, make flags const.
Move optimizations for precompilation into separate file.

Remove precompilation-specific code from flow_graph_optimizer.cc.

Add precompilation-flags: They are const in the precompiled runtime. Started moving flags to use the new flag-definition macros.

Add libdart_lib_precompiled target.

Define PRECOMPILED_RUNTIME_MACRO in more places (dart_precompiled_runtime)

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1714743002 .
2016-02-23 08:48:08 -08:00
Ryan Macnak 3b4a9e7e01 Fix --no-lazy-dispatchers in the JIT.
Broken since bac82e2592.

R=fschneider@google.com

Review URL: https://codereview.chromium.org/1672303002 .
2016-02-08 10:23:19 -08:00
John McCutchan d295b9c311 Remove many features when building product mode
Move all JSON printing code from object.cc to object_service.cc.

Not compiled in:

- Service protocol
- Debugger
- Debugger API
- JSONStream
- ObjectIdRing
- Profiler service
- Object JSON printing

Size of dart_bootstrap before: 5670365 bytes
Size of dart_bootstrap after: 5287631 bytes

Reduction in size: 382734 bytes.

R=rmacnak@google.com

Review URL: https://codereview.chromium.org/1660063002 .
2016-02-05 09:55:51 -08:00
Regis Crelier 7f57ebcfa1 Remove signature classes from the VM.
They were used as the class of closure instances and as the type class of
function types.
All closure instances now have class _Closure and function types are represented
by a new class FunctionType extending AbstractType.
Fix issue 24567 and add regression test.

R=asiva@google.com, rmacnak@google.com

Review URL: https://codereview.chromium.org/1584223006 .
2016-01-19 16:32:59 -08:00
Ryan Macnak c315da5a06 ARM: Don't generate memory instructions with writeback where the data and address registers are the same.
BUG=http://dartbug.com/24855
R=fschneider@google.com

Review URL: https://codereview.chromium.org/1434323003 .
2015-11-13 12:13:55 -08:00
Ryan Macnak 830bfe61b7 Precompilation: Generate instance calls as IC calls that can switch to Megamoprhic calls.
dart2js ARM -10.3% size

R=fschneider@google.com

Review URL: https://codereview.chromium.org/1418863003 .
2015-11-04 09:31:19 -08:00
Ryan Macnak d422888b46 Use the iOS ABI when running SIMARM on Mac or targeting iOS.
Linux / iOS
R7   preserved / FP
R9   preserved / volatile
R11  FP / preserved

BUG=http://dartbug.com/24683
R=zra@google.com

Review URL: https://codereview.chromium.org/1421253004 .
2015-10-27 14:36:38 -07:00
Ryan Macnak dd7250323d Re-assign registers on ARM so PP and CODE_REG are below R7 (FP on iOS).
Also update descriptions of register availability in instrinsics.

1) Mechanical replacement in *arm.* files except the simulator and constants_arm.h (with sed).

R5 -> R9
R6 -> R8
R8 -> R10
R9 -> R5
R10 -> R6

2) Change register aliases.

CTX = R10 -> CTX = R6
PP = R9 -> PP = R5
ICREG = R5 -> ICREG = R9
CODE_REG = R10 -> CODE_REG = R6
THR = R8 -> THR = R10

3) Fixup users of ldrd/strd to have valid register pairs.

bigint_lsh
bigint_absadd
bigint_abssub
bigint_sqradd
TYPED_ARRAY_ALLOCATION
InlineArrayAllocation
AllocateArrayStub
AllocateContextStub

4) Fix PushList in MegamorphicMissStub to keep runtime call arguments in the right order.

BUG=http://dartbug.com/24683
R=fschneider@google.com

Review URL: https://codereview.chromium.org/1419223003 .
2015-10-26 11:05:32 -07:00
Srdjan Mitrovic dc2d81b636 Move vm_tags from isolate to thread, since we may have multiple threads in same isolate (GC, background compilation)
BUG=
R=johnmccutchan@google.com, rmacnak@google.com

Review URL: https://codereview.chromium.org/1387643002 .
2015-10-05 12:50:17 -07:00
Ryan Macnak f1a0056430 Load the native call wrapper via Thread.
R=fschneider@google.com

Review URL: https://codereview.chromium.org//1358773002 .
2015-09-20 13:48:17 -07:00
Florian Schneider bac82e2592 VM: New calling convention for generated code.
Instead of calling code object directly, call indirectly and
pass the code object in a register. The object pool is then loaded from
the code object. This is another preparation step for making generated code
relocatable.

All non-ia32 platforms:
No entry patching.

ARM:
PC marker (now code object) moves to the same place as on x64 (below saved PP, above saved FP).
R9 is now used as PP, R10 as CODE_REG.

BUG=
R=koda@google.com, rmacnak@google.com

Committed: https://github.com/dart-lang/sdk/commit/1d343e5a7b75168fb6c9f86b64c55173cdbdc9b2

Review URL: https://codereview.chromium.org//1192103004 .
2015-09-19 13:21:09 +02:00
Florian Schneider 7af7a2db87 Revert "VM: New calling convention for generated code."
This reverts commit 1d343e5a7b.

Because of Windows test failures.

BUG=
TBR=whesse@google.com

Review URL: https://codereview.chromium.org//1343373003 .
2015-09-16 13:46:05 +02:00
Florian Schneider 1d343e5a7b VM: New calling convention for generated code.
Instead of calling code object directly, call indirectly and
pass the code object in a register. The object pool is then loaded from
the code object. This is another preparation step for making generated code
relocatable.

All non-ia32 platforms:
No entry patching.

ARM:
PC marker (now code object) moves to the same place as on x64 (below saved PP, above saved FP).
R9 is now used as PP, R10 as CODE_REG.

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org//1192103004 .
2015-09-16 13:05:58 +02:00
Ryan Macnak 690cccf03c Remove remaining uses of null's absolute address from non-IA32.
Note not every file is touched for every architecture because some already load null via Thread in most places.

Don't use absolute stack overflow address when precompiling.

R=fschneider@google.com

Review URL: https://codereview.chromium.org//1332923005 .
2015-09-11 11:34:21 -07:00
Florian Schneider 7e082c1082 VM: Use constant pool also for leaf runtime calls on x64, arm, arm64 and mips.
Remove unused branch/call macro instructions from the assembler.

Setup a frame and pool pointer when invoking leaf runtime functions (in the
deoptimzation stub and store-buffer update stub).

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org//1314883002 .
2015-08-28 10:46:02 +02:00
Florian Schneider 858f1d811a VM: Cache instructions entry point in RawFunction/RawCode.
This make calling sequences shorter and faster, at the expense of an extra
word in the code object and the instructions object.

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org//1295823003 .
2015-08-19 10:04:39 +02:00
John McCutchan ec675a3b0d Enable allocation tracing for classes owned by vm isolate
- Don't store the allocation tracing toggle bit in the class.
- Make sure that array and context slow path stubs are added to the code object's static call table.
- Add missing MaybeTraceAllocation to context allocation stub.

R=fschneider@google.com

Review URL: https://codereview.chromium.org//1292723002 .
2015-08-14 06:55:05 -07:00
Ryan Macnak d47827b88e Port "Add mapping from address to id for runtime functions."
Delete some out-of-sync DECLAREs.

R=srdjan@google.com

Review URL: https://codereview.chromium.org//1288953003 .
2015-08-13 14:42:31 -07:00
Florian Schneider 63a8e5227d VM: More abstract interface for generating stub calls.
This makes the code in the code generator independent from how stubs
are actually called (i.e. directly embedding the target address, or
indirectly by loading the target address from the code object).

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org//1270803003 .
2015-08-05 10:18:35 +02:00
Florian Schneider ef7a55281f VM: Load allocation-top and -end via Thread.
Cache a pointer to the isolate's Heap in the Thread object
and use it in generated code for allocation.

Change generated allocation code to load allocation-top and
end via THR (THR->heap.top). This is slightly slower than
embedding the address, but faster than loading it
via the Isolate (THR->isolate->heap.top)

BUG=
R=koda@google.com

Review URL: https://codereview.chromium.org//1263513002 .
2015-08-03 16:26:23 +02:00
Regis Crelier 23982c63e9 Load immediates via the constant pool on armv5te and armv6.
Fixes #23306

R=zra@google.com

Review URL: https://codereview.chromium.org//1250323002 .
2015-07-24 08:27:50 -07:00
Florian Schneider 8d38a58c18 Make array allocation stub shared between isolates.
This allows to make the last explicitly named stubs shared between isolates.

When sharing code stubs, we can't do patching at their entry anymore.
Therefore, I had to remove patching support of the array allocation stub.
Is this a functionality we want to keep?

The change is mostly performance-neutral because optimized code has an inlined fast
path for array allocation and only uses the stub for the slow-case.

The only isolate-specific stubs left are object allocation stubs which are
associated with their Class are per-isolate.

Since this CL removes any isolate-specific stubs from StubCode, it becomes AllStatic.

BUG=
R=koda@google.com

Review URL: https://codereview.chromium.org//1247783002 .
2015-07-23 12:56:16 +02:00
Florian Schneider 11733fb5b6 VM: Fix more places with isolate embedded into unoptimized code.
Sharing unoptimized code between isolates requires removing all isolate-specific
immediates embedded into code and loading the isolate from the Thread object.

BUG=
R=rmacnak@google.com

Review URL: https://codereview.chromium.org//1248113003 .
2015-07-23 12:34:57 +02:00
Florian Schneider 0cf617ef13 VM: Refactor allocation stats code and remove duplicate code.
Make context allocation stub shared between isolates.

The fast-path used in optimized code still has isolate-specific
addresses inlined for performance reasons.

Common functions are moved into class_table.h/.cc.

This is a preparation for adding an isolate-independent version of the
allocation code and allocation tracking code.

BUG=
R=johnmccutchan@google.com

Review URL: https://codereview.chromium.org//1241863002 .
2015-07-17 15:15:33 +02:00
John McCutchan e89b2eeaac Trace allocation of arrays
BUG=
R=fschneider@google.com, srdjan@google.com

Review URL: https://codereview.chromium.org//1226143011 .
2015-07-10 13:06:17 -07:00
John McCutchan 598c67001b Update Assembler::TryAllocate to support inline allocation tracing
- Track whether class allocation should be traced in existing ClassHeapStats structure.
- Emit compare and branch at top of ::TryAllocate

These changes appear to be performance neutral.

An alternative approach is to deoptimize all code that inlined allocations for a specific class. I do not think this is a good approach because we will spoil the water- allocations that aren't occurring in the (optimized steady state) running program  will appear in the allocation profile. This will make the data much less actionable bordering on misleading. The approach used in this CL will guarantee the allocation profile aligns with the actual running program.

R=regis@google.com, srdjan@google.com

Review URL: https://codereview.chromium.org//1213013002 .
2015-07-10 12:19:01 -07:00
Daniel Andersson 7f890eeecf Support per-thread zones and stack resources.
This is needed to enable parallel marking/sweeping (and in the future, compilation) tasks to have their own zone allocations and to safely call code that relies on various scoped constructs (stack resources).

The next step is to migrate the scopes like NoSafepointScope, NoHandleScope, etc. from isolate- to thread-based interfaces.

NOTE: This is a copy of issue 1204303003.

BUG=

Review URL: https://codereview.chromium.org//1226403003 .
2015-07-09 11:22:26 -07:00
John McCutchan bb934552ea Extend allocation profile testing
- Add ProfileTrieWalker to help with testing.
- Extend allocation profile test to check for expected stack trace.
- Don't inline allocation of class when allocation tracing is enabled.

Dependency: https://codereview.chromium.org/1210333002/

R=rmacnak@google.com

Review URL: https://codereview.chromium.org//1210283003.
2015-06-26 12:22:08 -07:00
Ryan Macnak 66194d4fc1 Port "Add flag to disable lazy compilation of invocation dispatchers."
Fix InvokeNoSuchMethodDispatcher to propagate with a rethrow instead of a throw.

Fix unit test checking raw stack frames.

R=fschneider@google.com

Review URL: https://codereview.chromium.org//1191813002.
2015-06-18 10:23:39 -07:00
Florian Schneider 957af25419 Use object pool for runtime calls.
Also, set up a stub frame with object pool loaded in all stubs on those
platforms.  This is a preparation step to making code relocatable.

ia32 is not affected because there is no object pool.

BUG=
R=srdjan@google.com

Review URL: https://codereview.chromium.org//1189573004.
2015-06-17 10:37:52 +02:00
Daniel Andersson a410c0f993 Thread-local store buffers, v2
BUG=
R=iposva@google.com

Review URL: https://codereview.chromium.org//1168483003.
2015-06-09 09:33:36 -07:00
Srdjan Mitrovic e68d22ce1e Do not emit debug check in optimized IC stubs
BUG=
R=fschneider@google.com

Review URL: https://codereview.chromium.org//1145063003
2015-05-28 09:32:12 -07:00
Florian Schneider e0621416f8 Remove unused pc descriptor types.
kClosureCall and kOptStaticCall are not needed anymore.
Closure calls are implemented as instance calls - the ClosureCall instruction
 only occurs in the synthetic FunctionImpl.call dispatcher - and does not correspond
to a source location where breakpoints can be set.

kOptStaticCall is not needed because breakpoints can only be set in unoptimized
code. kOther is used instead.

This also removes an unused PC descriptor at closure calls from unoptimized
code.

BUG=
R=vegorov@google.com

Review URL: https://codereview.chromium.org//1160063002
2015-05-28 14:27:37 +02:00
Srdjan Mitrovic 91651f8805 Remove value check from ICData checks/house-keeping
BUG=
R=johnmccutchan@google.com, vegorov@google.com

Review URL: https://codereview.chromium.org//1153963002
2015-05-27 13:17:28 -07:00