Skip to content

Commit 636f303

Browse files
committed
initial prototype
1 parent 8fb75de commit 636f303

7 files changed

+65
-30
lines changed

src/coreclr/vm/callcounting.cpp

+31-4
Original file line numberDiff line numberDiff line change
@@ -569,12 +569,39 @@ bool CallCountingManager::SetCodeEntryPoint(
569569
_ASSERTE(!wasMethodCalled || createTieringBackgroundWorkerRef != nullptr);
570570
_ASSERTE(createTieringBackgroundWorkerRef == nullptr || !*createTieringBackgroundWorkerRef);
571571

572+
if (methodDesc->HasPrecode() &&
573+
activeCodeVersion.GetOptimizationTier() == NativeCodeVersion::OptimizationTier::OptimizationTier0Instrumented)
574+
{
575+
//CallCountingManager* callCountingManager = methodDesc->GetLoaderAllocator()->GetCallCountingManager();
576+
//CallCountingInfoByCodeVersionHash& callCountingInfoByCodeVersionHash =
577+
// callCountingManager->m_callCountingInfoByCodeVersionHash;
578+
579+
//CallCount callCountThreshold = g_pConfig->TieredCompilation_CallCountThreshold();
580+
//_ASSERTE(callCountThreshold != 0);
581+
582+
//NewHolder<CallCountingInfo> callCountingInfoHolder = new CallCountingInfo(activeCodeVersion, callCountThreshold / 2);
583+
//callCountingInfoByCodeVersionHash.Add(callCountingInfoHolder);
584+
//auto callCountingInfo = callCountingInfoHolder.Extract();
585+
586+
//auto callCountingStub = callCountingManager->m_callCountingStubAllocator.AllocateStub(
587+
// callCountingInfo->GetRemainingCallCountCell(), codeEntryPoint);
588+
589+
//callCountingInfo->SetCallCountingStub(callCountingStub);
590+
591+
//// Now we need to update method's precode to point to our new callcounting stub
592+
//Precode* precode = methodDesc->GetPrecode();
593+
//_ASSERT(precode != nullptr);
594+
//precode->SetTargetInterlocked(callCountingStub->GetEntryPoint(), false);
595+
//callCountingInfo->SetStage(CallCountingInfo::Stage::StubMayBeActive);
596+
//return true;
597+
}
598+
572599
if (!methodDesc->IsEligibleForTieredCompilation() ||
573600
(
574601
// For a default code version that is not tier 0, call counting will have been disabled by this time (checked
575602
// below). Avoid the redundant and not-insignificant expense of GetOptimizationTier() on a default code version.
576603
!activeCodeVersion.IsDefaultVersion() &&
577-
activeCodeVersion.GetOptimizationTier() != NativeCodeVersion::OptimizationTier0
604+
!activeCodeVersion.IsUnoptimizedTier()
578605
) ||
579606
!g_pConfig->TieredCompilation_CallCounting())
580607
{
@@ -602,7 +629,7 @@ bool CallCountingManager::SetCodeEntryPoint(
602629
return true;
603630
}
604631

605-
_ASSERTE(activeCodeVersion.GetOptimizationTier() == NativeCodeVersion::OptimizationTier0);
632+
_ASSERTE(activeCodeVersion.IsUnoptimizedTier());
606633

607634
// If the tiering delay is active, postpone further work
608635
if (GetAppDomain()
@@ -649,7 +676,7 @@ bool CallCountingManager::SetCodeEntryPoint(
649676
}
650677
else
651678
{
652-
_ASSERTE(activeCodeVersion.GetOptimizationTier() == NativeCodeVersion::OptimizationTier0);
679+
_ASSERTE(activeCodeVersion.IsUnoptimizedTier());
653680

654681
// If the tiering delay is active, postpone further work
655682
if (GetAppDomain()
@@ -780,7 +807,7 @@ PCODE CallCountingManager::OnCallCountThresholdReached(TransitionBlock *transiti
780807
// used going forward under appropriate locking to synchronize further with deletion.
781808
GCX_PREEMP_THREAD_EXISTS(CURRENT_THREAD);
782809

783-
_ASSERTE(codeVersion.GetOptimizationTier() == NativeCodeVersion::OptimizationTier0);
810+
_ASSERTE(codeVersion.IsUnoptimizedTier());
784811

785812
codeEntryPoint = codeVersion.GetNativeCode();
786813
do

src/coreclr/vm/codeversion.cpp

+9-2
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,13 @@ NativeCodeVersion::OptimizationTier NativeCodeVersion::GetOptimizationTier() con
333333
}
334334
}
335335

336+
bool NativeCodeVersion::IsUnoptimizedTier() const
337+
{
338+
LIMITED_METHOD_DAC_CONTRACT;
339+
OptimizationTier tier = GetOptimizationTier();
340+
return tier == OptimizationTier0 || tier == OptimizationTier0Instrumented;
341+
}
342+
336343
#ifndef DACCESS_COMPILE
337344
void NativeCodeVersion::SetOptimizationTier(OptimizationTier tier)
338345
{
@@ -808,7 +815,7 @@ bool ILCodeVersion::HasAnyOptimizedNativeCodeVersion(NativeCodeVersion tier0Nati
808815
_ASSERTE(!tier0NativeCodeVersion.IsNull());
809816
_ASSERTE(tier0NativeCodeVersion.GetILCodeVersion() == *this);
810817
_ASSERTE(tier0NativeCodeVersion.GetMethodDesc()->IsEligibleForTieredCompilation());
811-
_ASSERTE(tier0NativeCodeVersion.GetOptimizationTier() == NativeCodeVersion::OptimizationTier0);
818+
_ASSERTE(tier0NativeCodeVersion.IsUnoptimizedTier());
812819

813820
NativeCodeVersionCollection nativeCodeVersions = GetNativeCodeVersions(tier0NativeCodeVersion.GetMethodDesc());
814821
for (auto itEnd = nativeCodeVersions.End(), it = nativeCodeVersions.Begin(); it != itEnd; ++it)
@@ -1710,7 +1717,7 @@ PCODE CodeVersionManager::PublishVersionableCodeIfNecessary(
17101717
_ASSERTE(!config->ShouldCountCalls() || pMethodDesc->IsEligibleForTieredCompilation());
17111718
_ASSERTE(
17121719
!config->ShouldCountCalls() ||
1713-
activeVersion.GetOptimizationTier() == NativeCodeVersion::OptimizationTier0);
1720+
activeVersion.IsUnoptimizedTier());
17141721
if (config->ShouldCountCalls()) // the generated code was at a tier that is call-counted
17151722
{
17161723
// This is the first call to a call-counted code version of the method

src/coreclr/vm/codeversion.h

+2
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,14 @@ class NativeCodeVersion
7474
enum OptimizationTier
7575
{
7676
OptimizationTier0,
77+
OptimizationTier0Instrumented,
7778
OptimizationTier1,
7879
OptimizationTier1OSR,
7980
OptimizationTierOptimized, // may do less optimizations than tier 1
8081
};
8182
#ifdef FEATURE_TIERED_COMPILATION
8283
OptimizationTier GetOptimizationTier() const;
84+
bool IsUnoptimizedTier() const;
8385
#ifndef DACCESS_COMPILE
8486
void SetOptimizationTier(OptimizationTier tier);
8587
#endif

src/coreclr/vm/interpreter.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1802,7 +1802,7 @@ void Interpreter::JitMethodIfAppropriate(InterpreterMethodInfo* interpMethInfo,
18021802
CodeVersionManager::LockHolder _lockHolder;
18031803
NativeCodeVersion activeCodeVersion = md->GetCodeVersionManager()->GetActiveILCodeVersion(md).GetActiveNativeCodeVersion(md);
18041804
ILCodeVersion ilCodeVersion = activeCodeVersion.GetILCodeVersion();
1805-
if (activeCodeVersion.GetOptimizationTier() == NativeCodeVersion::OptimizationTier0 &&
1805+
if (activeCodeVersion.IsUnoptimizedTier() &&
18061806
!ilCodeVersion.HasAnyOptimizedNativeCodeVersion(activeCodeVersion))
18071807
{
18081808
tieredCompilationManager->AsyncPromoteToTier1(activeCodeVersion, &scheduleTieringBackgroundWork);

src/coreclr/vm/jitinterface.cpp

-17
Original file line numberDiff line numberDiff line change
@@ -12616,23 +12616,6 @@ CORJIT_FLAGS GetCompileFlags(MethodDesc * ftn, CORJIT_FLAGS flags, CORINFO_METHO
1261612616

1261712617
#ifdef FEATURE_PGO
1261812618

12619-
// Instrument, if
12620-
//
12621-
// * We're writing pgo data and we're jitting at Tier0.
12622-
// * Tiered PGO is enabled and we're jitting at Tier0.
12623-
// * Tiered PGO is enabled and we are jitting an OSR method.
12624-
//
12625-
if ((CLRConfig::GetConfigValue(CLRConfig::INTERNAL_WritePGOData) > 0)
12626-
&& flags.IsSet(CORJIT_FLAGS::CORJIT_FLAG_TIER0))
12627-
{
12628-
flags.Set(CORJIT_FLAGS::CORJIT_FLAG_BBINSTR);
12629-
}
12630-
else if ((CLRConfig::GetConfigValue(CLRConfig::INTERNAL_TieredPGO) > 0)
12631-
&& (flags.IsSet(CORJIT_FLAGS::CORJIT_FLAG_TIER0) || flags.IsSet(CORJIT_FLAGS::CORJIT_FLAG_OSR)))
12632-
{
12633-
flags.Set(CORJIT_FLAGS::CORJIT_FLAG_BBINSTR);
12634-
}
12635-
1263612619
if (CLRConfig::GetConfigValue(CLRConfig::INTERNAL_ReadPGOData) > 0)
1263712620
{
1263812621
flags.Set(CORJIT_FLAGS::CORJIT_FLAG_BBOPT);

src/coreclr/vm/prestub.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,9 @@ PCODE MethodDesc::PrepareILBasedCode(PrepareCodeConfig* pConfig)
364364
if (codeVersion.IsDefaultVersion())
365365
{
366366
pConfig->GetMethodDesc()->GetLoaderAllocator()->GetCallCountingManager()->DisableCallCounting(codeVersion);
367-
_ASSERTE(codeVersion.GetOptimizationTier() != NativeCodeVersion::OptimizationTier0);
367+
_ASSERTE(!codeVersion.IsUnoptimizedTier());
368368
}
369-
else if (codeVersion.GetOptimizationTier() == NativeCodeVersion::OptimizationTier0)
369+
else if (codeVersion.IsUnoptimizedTier())
370370
{
371371
codeVersion.SetOptimizationTier(NativeCodeVersion::OptimizationTierOptimized);
372372
}
@@ -465,7 +465,7 @@ PCODE MethodDesc::GetPrecompiledCode(PrepareCodeConfig* pConfig, bool shouldTier
465465
#ifdef FEATURE_TIERED_COMPILATION
466466
if (shouldCountCalls)
467467
{
468-
_ASSERTE(pConfig->GetCodeVersion().GetOptimizationTier() == NativeCodeVersion::OptimizationTier0);
468+
_ASSERTE(pConfig->GetCodeVersion().IsUnoptimizedTier());
469469
pConfig->SetShouldCountCalls();
470470
}
471471
#endif
@@ -1217,6 +1217,7 @@ PrepareCodeConfig::JitOptimizationTier PrepareCodeConfig::GetJitOptimizationTier
12171217
switch (config->GetCodeVersion().GetOptimizationTier())
12181218
{
12191219
case NativeCodeVersion::OptimizationTier0:
1220+
case NativeCodeVersion::OptimizationTier0Instrumented:
12201221
return JitOptimizationTier::QuickJitted;
12211222

12221223
case NativeCodeVersion::OptimizationTier1:
@@ -1299,6 +1300,7 @@ bool PrepareCodeConfig::FinalizeOptimizationTierForTier0LoadOrJit()
12991300
NativeCodeVersion::OptimizationTier previousOptimizationTier = GetCodeVersion().GetOptimizationTier();
13001301
_ASSERTE(
13011302
previousOptimizationTier == NativeCodeVersion::OptimizationTier0 ||
1303+
previousOptimizationTier == NativeCodeVersion::OptimizationTier0Instrumented ||
13021304
previousOptimizationTier == NativeCodeVersion::OptimizationTierOptimized);
13031305
#endif // _DEBUG
13041306

src/coreclr/vm/tieredcompilation.cpp

+17-3
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ void TieredCompilationManager::AsyncPromoteToTier1(
251251

252252
_ASSERTE(CodeVersionManager::IsLockOwnedByCurrentThread());
253253
_ASSERTE(!tier0NativeCodeVersion.IsNull());
254-
_ASSERTE(tier0NativeCodeVersion.GetOptimizationTier() == NativeCodeVersion::OptimizationTier0);
254+
_ASSERTE(tier0NativeCodeVersion.IsUnoptimizedTier());
255255
_ASSERTE(createTieringBackgroundWorkerRef != nullptr);
256256

257257
NativeCodeVersion t1NativeCodeVersion;
@@ -263,9 +263,19 @@ void TieredCompilationManager::AsyncPromoteToTier1(
263263
// occur between now and when jitting completes. If the IL does change in that
264264
// interval the new code entry won't be activated.
265265
MethodDesc *pMethodDesc = tier0NativeCodeVersion.GetMethodDesc();
266+
267+
NativeCodeVersion::OptimizationTier nextTier = NativeCodeVersion::OptimizationTier1;
268+
269+
if (CLRConfig::GetConfigValue(CLRConfig::INTERNAL_TieredPGO) != 0 &&
270+
tier0NativeCodeVersion.GetOptimizationTier() == NativeCodeVersion::OptimizationTier0)
271+
{
272+
_ASSERT(!pMethodDesc->RequestedAggressiveOptimization());
273+
nextTier = NativeCodeVersion::OptimizationTier0Instrumented;
274+
}
275+
266276
ILCodeVersion ilCodeVersion = tier0NativeCodeVersion.GetILCodeVersion();
267277
_ASSERTE(!ilCodeVersion.HasAnyOptimizedNativeCodeVersion(tier0NativeCodeVersion));
268-
hr = ilCodeVersion.AddNativeCodeVersion(pMethodDesc, NativeCodeVersion::OptimizationTier1, &t1NativeCodeVersion);
278+
hr = ilCodeVersion.AddNativeCodeVersion(pMethodDesc, nextTier, &t1NativeCodeVersion);
269279
if (FAILED(hr))
270280
{
271281
ThrowHR(hr);
@@ -993,7 +1003,7 @@ CORJIT_FLAGS TieredCompilationManager::GetJitFlags(PrepareCodeConfig *config)
9931003
_ASSERTE(config != nullptr);
9941004
_ASSERTE(
9951005
!config->WasTieringDisabledBeforeJitting() ||
996-
config->GetCodeVersion().GetOptimizationTier() != NativeCodeVersion::OptimizationTier0);
1006+
!config->GetCodeVersion().IsUnoptimizedTier());
9971007

9981008
CORJIT_FLAGS flags;
9991009

@@ -1041,6 +1051,10 @@ CORJIT_FLAGS TieredCompilationManager::GetJitFlags(PrepareCodeConfig *config)
10411051

10421052
switch (nativeCodeVersion.GetOptimizationTier())
10431053
{
1054+
case NativeCodeVersion::OptimizationTier0Instrumented:
1055+
flags.Set(CORJIT_FLAGS::CORJIT_FLAG_BBINSTR);
1056+
FALLTHROUGH;
1057+
10441058
case NativeCodeVersion::OptimizationTier0:
10451059
if (g_pConfig->TieredCompilation_QuickJit())
10461060
{

0 commit comments

Comments
 (0)