diff options
author | Koundinya Veluri <kouvel@users.noreply.github.com> | 2018-01-25 12:01:32 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-25 12:01:32 -0800 |
commit | 209415618ca5d1a5d1d9e39ca78d643d0935534e (patch) | |
tree | d83c946783390afbb52e3e0f968018c38dfd2560 /src/vm/arm64 | |
parent | e9985126acb0f1efd7c780faac4e66bc798b73c0 (diff) | |
download | coreclr-209415618ca5d1a5d1d9e39ca78d643d0935534e.tar.gz coreclr-209415618ca5d1a5d1d9e39ca78d643d0935534e.tar.bz2 coreclr-209415618ca5d1a5d1d9e39ca78d643d0935534e.zip |
Enable tiered jitting for R2R methods (#15967)
Enable tiered jitting for R2R methods
- Included R2R methods and generics over value types in CoreLib for tiered jitting. Tier 0 for R2R methods is the precompiled code if available, and tier 1 is selectively scheduled based on call counting.
- Added a delay before starting to count calls for tier 1 promotion. The delay is a short duration after frequent tier 0 jitting stops (current heuristic for identifying startup).
- Startup time and steady-state performance have improved on JitBench. There is a regression shortly following startup due to call counting and tier 1 jitting, for a short duration before steady-state performance stabilizes.
- Added two new config values, one for configuring the call count threshold for promoting to tier 1, and another for specifying the delay from the last tier 0 JIT invocation before starting to count calls
Diffstat (limited to 'src/vm/arm64')
-rw-r--r-- | src/vm/arm64/cgencpu.h | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/vm/arm64/cgencpu.h b/src/vm/arm64/cgencpu.h index a168cdc162..7e3d62056a 100644 --- a/src/vm/arm64/cgencpu.h +++ b/src/vm/arm64/cgencpu.h @@ -24,6 +24,7 @@ EXTERN_C void setFPReturn(int fpSize, INT64 retVal); class ComCallMethodDesc; +extern PCODE GetPreStubEntryPoint(); #define COMMETHOD_PREPAD 24 // # extra bytes to allocate in addition to sizeof(ComCallMethodDesc) #ifdef FEATURE_COMINTEROP @@ -572,6 +573,19 @@ struct StubPrecode { return m_pTarget; } + void ResetTargetInterlocked() + { + CONTRACTL + { + THROWS; + GC_TRIGGERS; + } + CONTRACTL_END; + + EnsureWritableExecutablePages(&m_pTarget); + InterlockedExchange64((LONGLONG*)&m_pTarget, (TADDR)GetPreStubEntryPoint()); + } + BOOL SetTargetInterlocked(TADDR target, TADDR expected) { CONTRACTL @@ -685,6 +699,19 @@ struct FixupPrecode { return m_pTarget; } + void ResetTargetInterlocked() + { + CONTRACTL + { + THROWS; + GC_TRIGGERS; + } + CONTRACTL_END; + + EnsureWritableExecutablePages(&m_pTarget); + InterlockedExchange64((LONGLONG*)&m_pTarget, (TADDR)GetEEFuncEntryPoint(PrecodeFixupThunk)); + } + BOOL SetTargetInterlocked(TADDR target, TADDR expected) { CONTRACTL |