Skip to content
This repository has been archived by the owner on Jan 23, 2023. It is now read-only.

Commit

Permalink
When QuickJit is enabled, disable it for methods that contain loops b…
Browse files Browse the repository at this point in the history
…y default

Fixes https://github.com/dotnet/coreclr/issues/19751 by default when QuickJit is enabled
- Added config variable TC_QuickJitForLoops. When disabled (the default), the JIT identifies loops and explicit tail calls and switches to tier 1 JIT.
- This would prevent the possibility of spending too long in QuickJit code, but may decrease startup time a bit when QuickJit is enabled
- Removed TC_StartupTier_OptimizeCode, as now that there is TC_QuickJit, I didn't see a good use for it
- Removed references to "StartupTier" in config variables because we had previously decided not to call it that.
- When QuickJit is disabled, avoid creating native code slots for methods in non-R2R'ed modules, as tiering would be disabled for those anyway
  • Loading branch information
kouvel committed Apr 25, 2019
1 parent 6a7bf9c commit 0ae3d02
Show file tree
Hide file tree
Showing 14 changed files with 301 additions and 54 deletions.
12 changes: 6 additions & 6 deletions Documentation/project-docs/clr-configuration-knobs.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Name | Description | Type

## Environment/Registry Configuration Knobs

This table was machine-generated using `clr-configuration-knobs.csx` script from repository commit [d064ffb](https://github.com/dotnet/coreclr/commit/d064ffb6b05c4f7fa44c7ee389e9694e64a76c08) on 15/04/2019. It might be out of date. To generate latest documentation run `{dotnet-script} clr-configuration-knobs.csx` from this file directory.
This table was machine-generated using `clr-configuration-knobs.csx` script from repository commit [82a083e](https://github.com/dotnet/coreclr/commit/82a083e656833e58e127b14d77611e7d912cf72d) on 4/23/2019. It might be out of date. To generate latest documentation run `dotnet-script clr-configuration-knobs.csx` from this file directory.

When using these configurations from environment variables, the variables need to have the `COMPlus_` prefix in their names. e.g. To set DumpJittedMethods to 1, add the environment variable `COMPlus_DumpJittedMethods=1`.

Expand Down Expand Up @@ -802,12 +802,12 @@ Name | Description | Type | Class | Default Value | Flags

Name | Description | Type | Class | Default Value | Flags
-----|-------------|------|-------|---------------|-------
`TC_CallCounting` | Enabled by default (only activates when TieredCompilation is also enabled). If disabled immediately backpatches prestub, and likely prevents any promotion to higher tiers | `DWORD` | `INTERNAL` | `1` |
`TC_CallCountingDelayMs` | A perpetual delay in milliseconds that is applied call counting in tier 0 and jitting at higher tiers, while there is startup-like activity. | `DWORD` | `INTERNAL` | `100` |
`TC_CallCountThreshold` | Number of times a method must be called in tier 0 after which it is promoted to the next tier. | `DWORD` | `INTERNAL` | `30` |
`TC_DelaySingleProcMultiplier` | Multiplier for TC_CallCountingDelayMs that is applied on a single-processor machine or when the process is affinitized to a single processor. | `DWORD` | `INTERNAL` | `10` |
`TC_QuickJit` | For methods that would be jitted, enable using quick JIT when appropriate. | `DWORD` | `UNSUPPORTED` | `0` |
`TC_StartupTier_CallCounting` | Enabled by default (only activates when TieredCompilation is also enabled). If disabled immediately backpatches prestub, and likely prevents any promotion to higher tiers | `DWORD` | `INTERNAL` | `1` |
`TC_StartupTier_CallCountingDelayMs` | A perpetual delay in milliseconds that is applied call counting in the startup tier and jitting at higher tiers, while there is startup-like activity. | `DWORD` | `UNSUPPORTED` | `100` |
`TC_StartupTier_CallCountThreshold` | Number of times a method must be called in the startup tier after which it is promoted to the next tier. | `DWORD` | `UNSUPPORTED` | `30` |
`TC_StartupTier_DelaySingleProcMultiplier` | Multiplier for TC_StartupTier_CallCountingDelayMs that is applied on a single-processor machine or when the process is affinitized to a single processor. | `DWORD` | `UNSUPPORTED` | `10` |
`TC_StartupTier_OptimizeCode` | Use optimized codegen (normally used by the optimized tier) in the startup tier | `DWORD` | `INTERNAL` | `0` |
`TC_QuickJitForLoops` | When quick JIT is enabled, quick JIT may also be used for methods that contain loops. | `DWORD` | `UNSUPPORTED` | `0` |
`TieredCompilation` | Enables tiered compilation | `DWORD` | `EXTERNAL` | `1` |

#### TypeLoader Configuration Knobs
Expand Down
11 changes: 5 additions & 6 deletions src/inc/clrconfigvalues.h
Original file line number Diff line number Diff line change
Expand Up @@ -646,12 +646,11 @@ RETAIL_CONFIG_DWORD_INFO(INTERNAL_HillClimbing_GainExponent,
#ifdef FEATURE_TIERED_COMPILATION
RETAIL_CONFIG_DWORD_INFO(EXTERNAL_TieredCompilation, W("TieredCompilation"), 1, "Enables tiered compilation")
RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_TC_QuickJit, W("TC_QuickJit"), 0, "For methods that would be jitted, enable using quick JIT when appropriate.")
RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_TC_StartupTier_CallCountThreshold, W("TC_StartupTier_CallCountThreshold"), 30, "Number of times a method must be called in the startup tier after which it is promoted to the next tier.")
RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_TC_StartupTier_CallCountingDelayMs, W("TC_StartupTier_CallCountingDelayMs"), 100, "A perpetual delay in milliseconds that is applied call counting in the startup tier and jitting at higher tiers, while there is startup-like activity.")
RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_TC_StartupTier_DelaySingleProcMultiplier, W("TC_StartupTier_DelaySingleProcMultiplier"), 10, "Multiplier for TC_StartupTier_CallCountingDelayMs that is applied on a single-processor machine or when the process is affinitized to a single processor.")

RETAIL_CONFIG_DWORD_INFO(INTERNAL_TC_StartupTier_CallCounting, W("TC_StartupTier_CallCounting"), 1, "Enabled by default (only activates when TieredCompilation is also enabled). If disabled immediately backpatches prestub, and likely prevents any promotion to higher tiers")
RETAIL_CONFIG_DWORD_INFO(INTERNAL_TC_StartupTier_OptimizeCode, W("TC_StartupTier_OptimizeCode"), 0, "Use optimized codegen (normally used by the optimized tier) in the startup tier")
RETAIL_CONFIG_DWORD_INFO(UNSUPPORTED_TC_QuickJitForLoops, W("TC_QuickJitForLoops"), 0, "When quick JIT is enabled, quick JIT may also be used for methods that contain loops.")
RETAIL_CONFIG_DWORD_INFO(INTERNAL_TC_CallCountThreshold, W("TC_CallCountThreshold"), 30, "Number of times a method must be called in tier 0 after which it is promoted to the next tier.")
RETAIL_CONFIG_DWORD_INFO(INTERNAL_TC_CallCountingDelayMs, W("TC_CallCountingDelayMs"), 100, "A perpetual delay in milliseconds that is applied call counting in tier 0 and jitting at higher tiers, while there is startup-like activity.")
RETAIL_CONFIG_DWORD_INFO(INTERNAL_TC_DelaySingleProcMultiplier, W("TC_DelaySingleProcMultiplier"), 10, "Multiplier for TC_CallCountingDelayMs that is applied on a single-processor machine or when the process is affinitized to a single processor.")
RETAIL_CONFIG_DWORD_INFO(INTERNAL_TC_CallCounting, W("TC_CallCounting"), 1, "Enabled by default (only activates when TieredCompilation is also enabled). If disabled immediately backpatches prestub, and likely prevents any promotion to higher tiers")
#endif

///
Expand Down
3 changes: 2 additions & 1 deletion src/inc/corinfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -832,7 +832,7 @@ enum CorInfoFlag
CORINFO_FLG_INTRINSIC = 0x00400000, // This method MAY have an intrinsic ID
CORINFO_FLG_CONSTRUCTOR = 0x00800000, // This method is an instance or type initializer
CORINFO_FLG_AGGRESSIVE_OPT = 0x01000000, // The method may contain hot code and should be aggressively optimized if possible
// CORINFO_FLG_UNUSED = 0x02000000,
CORINFO_FLG_TIER0_TO_TIER1_FOR_LOOPS = 0x02000000, // Indicates that for a tier 0 compilation request, if the method contains a loop it should be switched to tier 1 instead
CORINFO_FLG_NOSECURITYWRAP = 0x04000000, // The method requires no security checks
CORINFO_FLG_DONT_INLINE = 0x10000000, // The method should not be inlined
CORINFO_FLG_DONT_INLINE_CALLER = 0x20000000, // The method should not be inlined, nor should its callers. It cannot be tail called.
Expand Down Expand Up @@ -864,6 +864,7 @@ enum CorInfoMethodRuntimeFlags
CORINFO_FLG_BAD_INLINEE = 0x00000001, // The method is not suitable for inlining
CORINFO_FLG_VERIFIABLE = 0x00000002, // The method has verifiable code
CORINFO_FLG_UNVERIFIABLE = 0x00000004, // The method has unverifiable code
CORINFO_FLG_TIER0_TO_TIER1 = 0x00000008, // The JIT decided to switch from tier 0 to tier 1 for this method
};


Expand Down
5 changes: 5 additions & 0 deletions src/jit/compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -5289,6 +5289,11 @@ class Compiler
void fgInitBBLookup();
BasicBlock* fgLookupBB(unsigned addr);

bool fgCanSwitchTier0ToTier1();
void fgSwitchTier0ToTier1();

bool fgMayExplicitTailCall();

void fgFindJumpTargets(const BYTE* codeAddr, IL_OFFSET codeSize, FixedBitVect* jumpTarget);

void fgMarkBackwardJump(BasicBlock* startBlock, BasicBlock* endBlock);
Expand Down
78 changes: 78 additions & 0 deletions src/jit/flowgraph.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4252,6 +4252,67 @@ class FgStack
unsigned depth;
};

/*****************************************************************************
*
* Determine if conditions are met to allow switching from QuickJittedTier to OptimizedTier.
*/

bool Compiler::fgCanSwitchTier0ToTier1()
{
return (info.compFlags & CORINFO_FLG_TIER0_TO_TIER1_FOR_LOOPS) != 0 &&
opts.jitFlags->IsSet(JitFlags::JIT_FLAG_TIER0) && !compIsForInlining();
}

/*****************************************************************************
*
* Switch from QuickJittedTier to OptimizedTier.
*/

void Compiler::fgSwitchTier0ToTier1()
{
assert(fgCanSwitchTier0ToTier1());

// Ensure that it would be safe to change the opt level
assert(opts.compFlags == CLFLG_MINOPT);
assert(!opts.IsMinOptsSet());

// Switch to the OptimizedTier and re-init options
opts.jitFlags->Clear(JitFlags::JIT_FLAG_TIER0);
opts.jitFlags->Set(JitFlags::JIT_FLAG_TIER1);
compInitOptions(opts.jitFlags);

// Notify the VM of the change
info.compCompHnd->setMethodAttribs(info.compMethodHnd, CORINFO_FLG_TIER0_TO_TIER1);
}

/*****************************************************************************
*
* Estimate conservatively for an explicit tail call, if the importer may actually use a tail call.
* Specifically, a return value of false must guarantee that the importer will not use a tail call. See
* impImportCall() for more.
*/

bool Compiler::fgMayExplicitTailCall()
{
assert(!compIsForInlining());

if (info.compFlags & CORINFO_FLG_SYNCH)
{
// Caller is synchronized
return false;
}

#if !FEATURE_FIXED_OUT_ARGS
if (info.compIsVarArgs)
{
// Caller is varargs
return false;
}
#endif // FEATURE_FIXED_OUT_ARGS

return true;
}

//------------------------------------------------------------------------
// fgFindJumpTargets: walk the IL stream, determining jump target offsets
//
Expand Down Expand Up @@ -5158,6 +5219,8 @@ void Compiler::fgLinkBasicBlocks()

/* Walk all the basic blocks, filling in the target addresses */

bool foundBackwardJump = false;

for (BasicBlock* curBBdesc = fgFirstBB; curBBdesc; curBBdesc = curBBdesc->bbNext)
{
switch (curBBdesc->bbJumpKind)
Expand All @@ -5169,6 +5232,7 @@ void Compiler::fgLinkBasicBlocks()
curBBdesc->bbJumpDest->bbRefs++;
if (curBBdesc->bbJumpDest->bbNum <= curBBdesc->bbNum)
{
foundBackwardJump = true;
fgMarkBackwardJump(curBBdesc->bbJumpDest, curBBdesc);
}

Expand Down Expand Up @@ -5209,6 +5273,7 @@ void Compiler::fgLinkBasicBlocks()
(*jumpPtr)->bbRefs++;
if ((*jumpPtr)->bbNum <= curBBdesc->bbNum)
{
foundBackwardJump = true;
fgMarkBackwardJump(*jumpPtr, curBBdesc);
}
} while (++jumpPtr, --jumpCnt);
Expand All @@ -5225,6 +5290,12 @@ void Compiler::fgLinkBasicBlocks()
break;
}
}

if (foundBackwardJump && fgCanSwitchTier0ToTier1())
{
// Method likely has a loop, switch to the OptimizedTier to avoid spending too much time running slower code
fgSwitchTier0ToTier1();
}
}

//------------------------------------------------------------------------
Expand Down Expand Up @@ -5516,6 +5587,13 @@ unsigned Compiler::fgMakeBasicBlocks(const BYTE* codeAddr, IL_OFFSET codeSize, F
#endif // !FEATURE_CORECLR && _TARGET_AMD64_
}

if (fgCanSwitchTier0ToTier1() && fgMayExplicitTailCall())
{
// Method has an explicit tail call that may run like a loop, switch to tier 1 to avoid spending
// too much time running slower code
fgSwitchTier0ToTier1();
}

#if !defined(FEATURE_CORECLR) && defined(_TARGET_AMD64_)
if (isCallPopAndRet)
{
Expand Down
4 changes: 2 additions & 2 deletions src/vm/callcounter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ bool CallCounter::IsEligibleForTier0CallCounting(MethodDesc* pMethodDesc)
_ASSERTE(pMethodDesc != NULL);
_ASSERTE(pMethodDesc->IsEligibleForTieredCompilation());

return g_pConfig->TieredCompilation_StartupTier_CallCounting() && !pMethodDesc->RequestedAggressiveOptimization();
return g_pConfig->TieredCompilation_CallCounting() && !pMethodDesc->RequestedAggressiveOptimization();
}

bool CallCounter::IsTier0CallCountingEnabled(MethodDesc* pMethodDesc)
Expand Down Expand Up @@ -131,7 +131,7 @@ void CallCounter::OnMethodCalled(
if (pEntry == NULL)
{
isFirstTier0Call = true;
tier0CallCountLimit = (int)g_pConfig->TieredCompilation_StartupTier_CallCountThreshold() - 1;
tier0CallCountLimit = (int)g_pConfig->TieredCompilation_CallCountThreshold() - 1;
_ASSERTE(tier0CallCountLimit >= 0);
m_methodToCallCount.Add(CallCounterEntry(pMethodDesc, tier0CallCountLimit));
}
Expand Down
39 changes: 18 additions & 21 deletions src/vm/eeconfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -349,10 +349,10 @@ HRESULT EEConfig::Init()
#if defined(FEATURE_TIERED_COMPILATION)
fTieredCompilation = false;
fTieredCompilation_QuickJit = false;
fTieredCompilation_StartupTier_CallCounting = false;
fTieredCompilation_StartupTier_OptimizeCode = false;
tieredCompilation_StartupTier_CallCountThreshold = 1;
tieredCompilation_StartupTier_CallCountingDelayMs = 0;
fTieredCompilation_QuickJitForLoops = false;
fTieredCompilation_CallCounting = false;
tieredCompilation_CallCountThreshold = 1;
tieredCompilation_CallCountingDelayMs = 0;
#endif

#ifndef CROSSGEN_COMPILE
Expand Down Expand Up @@ -1203,29 +1203,27 @@ HRESULT EEConfig::sync()
dwSleepOnExit = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_SleepOnExit);

#if defined(FEATURE_TIERED_COMPILATION)
fTieredCompilation = Configuration::GetKnobBooleanValue(W("System.Runtime.TieredCompilation"), CLRConfig::EXTERNAL_TieredCompilation) != 0;
fTieredCompilation = Configuration::GetKnobBooleanValue(W("System.Runtime.TieredCompilation"), CLRConfig::EXTERNAL_TieredCompilation);

fTieredCompilation_QuickJit =
Configuration::GetKnobBooleanValue(
W("System.Runtime.TieredCompilation.QuickJit"),
CLRConfig::UNSUPPORTED_TC_QuickJit) != 0;
CLRConfig::UNSUPPORTED_TC_QuickJit);
fTieredCompilation_QuickJitForLoops = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_TC_QuickJitForLoops) != 0;

fTieredCompilation_StartupTier_CallCounting = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_TC_StartupTier_CallCounting) != 0;
fTieredCompilation_StartupTier_OptimizeCode = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_TC_StartupTier_OptimizeCode) != 0;
fTieredCompilation_CallCounting = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_TC_CallCounting) != 0;

tieredCompilation_StartupTier_CallCountThreshold =
CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_TC_StartupTier_CallCountThreshold);
if (tieredCompilation_StartupTier_CallCountThreshold < 1)
tieredCompilation_CallCountThreshold = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_TC_CallCountThreshold);
if (tieredCompilation_CallCountThreshold < 1)
{
tieredCompilation_StartupTier_CallCountThreshold = 1;
tieredCompilation_CallCountThreshold = 1;
}
else if (tieredCompilation_StartupTier_CallCountThreshold > INT_MAX) // CallCounter uses 'int'
else if (tieredCompilation_CallCountThreshold > INT_MAX) // CallCounter uses 'int'
{
tieredCompilation_StartupTier_CallCountThreshold = INT_MAX;
tieredCompilation_CallCountThreshold = INT_MAX;
}

tieredCompilation_StartupTier_CallCountingDelayMs =
CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_TC_StartupTier_CallCountingDelayMs);
tieredCompilation_CallCountingDelayMs = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_TC_CallCountingDelayMs);

#ifndef FEATURE_PAL
bool hadSingleProcessorAtStartup = CPUGroupInfo::HadSingleProcessorAtStartup();
Expand All @@ -1235,14 +1233,13 @@ HRESULT EEConfig::sync()

if (hadSingleProcessorAtStartup)
{
DWORD delayMultiplier =
CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_TC_StartupTier_DelaySingleProcMultiplier);
DWORD delayMultiplier = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_TC_DelaySingleProcMultiplier);
if (delayMultiplier > 1)
{
DWORD newDelay = tieredCompilation_StartupTier_CallCountingDelayMs * delayMultiplier;
if (newDelay / delayMultiplier == tieredCompilation_StartupTier_CallCountingDelayMs)
DWORD newDelay = tieredCompilation_CallCountingDelayMs * delayMultiplier;
if (newDelay / delayMultiplier == tieredCompilation_CallCountingDelayMs)
{
tieredCompilation_StartupTier_CallCountingDelayMs = newDelay;
tieredCompilation_CallCountingDelayMs = newDelay;
}
}
}
Expand Down
16 changes: 8 additions & 8 deletions src/vm/eeconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -283,10 +283,10 @@ class EEConfig
#if defined(FEATURE_TIERED_COMPILATION)
bool TieredCompilation(void) const { LIMITED_METHOD_CONTRACT; return fTieredCompilation; }
bool TieredCompilation_QuickJit() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_QuickJit; }
bool TieredCompilation_StartupTier_CallCounting() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_StartupTier_CallCounting; }
bool TieredCompilation_StartupTier_OptimizeCode() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_StartupTier_OptimizeCode; }
DWORD TieredCompilation_StartupTier_CallCountThreshold() const { LIMITED_METHOD_CONTRACT; return tieredCompilation_StartupTier_CallCountThreshold; }
DWORD TieredCompilation_StartupTier_CallCountingDelayMs() const { LIMITED_METHOD_CONTRACT; return tieredCompilation_StartupTier_CallCountingDelayMs; }
bool TieredCompilation_QuickJitForLoops() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_QuickJitForLoops; }
bool TieredCompilation_CallCounting() const { LIMITED_METHOD_CONTRACT; return fTieredCompilation_CallCounting; }
DWORD TieredCompilation_CallCountThreshold() const { LIMITED_METHOD_CONTRACT; return tieredCompilation_CallCountThreshold; }
DWORD TieredCompilation_CallCountingDelayMs() const { LIMITED_METHOD_CONTRACT; return tieredCompilation_CallCountingDelayMs; }
#endif

#ifndef CROSSGEN_COMPILE
Expand Down Expand Up @@ -1014,10 +1014,10 @@ class EEConfig
#if defined(FEATURE_TIERED_COMPILATION)
bool fTieredCompilation;
bool fTieredCompilation_QuickJit;
bool fTieredCompilation_StartupTier_CallCounting;
bool fTieredCompilation_StartupTier_OptimizeCode;
DWORD tieredCompilation_StartupTier_CallCountThreshold;
DWORD tieredCompilation_StartupTier_CallCountingDelayMs;
bool fTieredCompilation_QuickJitForLoops;
bool fTieredCompilation_CallCounting;
DWORD tieredCompilation_CallCountThreshold;
DWORD tieredCompilation_CallCountingDelayMs;
#endif

#ifndef CROSSGEN_COMPILE
Expand Down
15 changes: 15 additions & 0 deletions src/vm/jitinterface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6849,6 +6849,13 @@ DWORD CEEInfo::getMethodAttribsInternal (CORINFO_METHOD_HANDLE ftn)
result |= CORINFO_FLG_DELEGATE_INVOKE;
}

#ifndef CROSSGEN_COMPILE
if (!g_pConfig->TieredCompilation_QuickJitForLoops())
{
result |= CORINFO_FLG_TIER0_TO_TIER1_FOR_LOOPS;
}
#endif

return result;
}

Expand Down Expand Up @@ -6901,6 +6908,14 @@ void CEEInfo::setMethodAttribs (
}
}

#ifdef FEATURE_TIERED_COMPILATION
if (attribs & CORINFO_FLG_TIER0_TO_TIER1)
{
_ASSERTE(ftn->IsEligibleForTieredCompilation());
ftn->GetCallCounter()->DisableTier0CallCounting(ftn);
}
#endif

EE_TO_JIT_TRANSITION();
}

Expand Down
5 changes: 5 additions & 0 deletions src/vm/methodtablebuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6941,6 +6941,11 @@ MethodTableBuilder::NeedsNativeCodeSlot(bmtMDMethod * pMDMethod)
#ifdef FEATURE_TIERED_COMPILATION
// Keep in-sync with MethodDesc::DetermineAndSetIsEligibleForTieredCompilation()
if (g_pConfig->TieredCompilation() &&

// Policy - If QuickJit is disabled and the module is not ReadyToRun, the method would be ineligible for tiering
// currently to avoid some unnecessary overhead
(g_pConfig->TieredCompilation_QuickJit() || GetModule()->IsReadyToRun()) &&

(pMDMethod->GetMethodType() == METHOD_TYPE_NORMAL || pMDMethod->GetMethodType() == METHOD_TYPE_INSTANTIATED))
{
return TRUE;
Expand Down
Loading

0 comments on commit 0ae3d02

Please sign in to comment.