diff --git a/eng/pipelines/common/templates/runtimes/run-test-job.yml b/eng/pipelines/common/templates/runtimes/run-test-job.yml index 40da880c11387..54436b52f7a52 100644 --- a/eng/pipelines/common/templates/runtimes/run-test-job.yml +++ b/eng/pipelines/common/templates/runtimes/run-test-job.yml @@ -471,13 +471,10 @@ jobs: scenarios: - jitosr - jitosr_stress - - jitguardeddevirtualization - jitehwritethru - jitobjectstackallocation - jitpgo - jitpgo_inline - - jitpgo_classes - - jitpgo_edgeinstrumentation ${{ if in(parameters.testGroup, 'ilasm') }}: scenarios: - ilasmroundtrip diff --git a/src/coreclr/jit/fgprofile.cpp b/src/coreclr/jit/fgprofile.cpp index 9e9e3faa7a05a..e81d61c2398c7 100644 --- a/src/coreclr/jit/fgprofile.cpp +++ b/src/coreclr/jit/fgprofile.cpp @@ -1487,35 +1487,54 @@ PhaseStatus Compiler::fgPrepareToInstrumentMethod() // Choose instrumentation technology. // + // We enable edge profiling by default, except when: + // * disabled by option + // * we are prejitting via classic ngen + // * we are jitting osr methods + // // Currently, OSR is incompatible with edge profiling. So if OSR is enabled, // always do block profiling. // // Note this incompatibility only exists for methods that actually have // patchpoints, but we won't know that until we import. // - const bool methodMayHavePatchpoints = - (opts.jitFlags->IsSet(JitFlags::JIT_FLAG_TIER0) && (JitConfig.TC_OnStackReplacement() > 0)); + CLANG_FORMAT_COMMENT_ANCHOR; - if ((JitConfig.JitEdgeProfiling() > 0) && !methodMayHavePatchpoints) +#ifdef FEATURE_READYTORUN_COMPILER + const bool r2r = opts.IsReadyToRun(); +#else + const bool r2r = false; +#endif + const bool prejit = opts.jitFlags->IsSet(JitFlags::JIT_FLAG_PREJIT); + const bool classicNgen = prejit && !r2r; + const bool osr = (opts.jitFlags->IsSet(JitFlags::JIT_FLAG_TIER0) && (JitConfig.TC_OnStackReplacement() > 0)); + const bool useEdgeProfiles = (JitConfig.JitEdgeProfiling() > 0) && !classicNgen && !osr; + + if (useEdgeProfiles) { fgCountInstrumentor = new (this, CMK_Pgo) EfficientEdgeCountInstrumentor(this); } else { - if (JitConfig.JitEdgeProfiling() > 0) - { - JITDUMP("OSR and edge profiling not yet compatible; using block profiling\n"); - } + JITDUMP("Using block profiling, because %s\n", + (JitConfig.JitEdgeProfiling() > 0) ? "edge profiles disabled" : classicNgen ? "classic Ngen" : "OSR"); fgCountInstrumentor = new (this, CMK_Pgo) BlockCountInstrumentor(this); } - if (JitConfig.JitClassProfiling() > 0) + // Enable class profiling by default, when jitting. + // Todo: we may also want this on by default for prejitting. + // + const bool useClassProfiles = (JitConfig.JitClassProfiling() > 0) && !prejit; + if (useClassProfiles) { fgClassInstrumentor = new (this, CMK_Pgo) ClassProbeInstrumentor(this); } else { + JITDUMP("Not doing class profiling, because %s\n", + (JitConfig.JitClassProfiling() > 0) ? "class profiles disabled" : "prejit"); + fgClassInstrumentor = new (this, CMK_Pgo) NonInstrumentor(this); } @@ -1575,13 +1594,29 @@ PhaseStatus Compiler::fgInstrumentMethod() // assert(fgClassInstrumentor->SchemaCount() == info.compClassProbeCount); - // Optionally, if there were no class probes and only one count probe, + // Optionally, when jitting, if there were no class probes and only one count probe, // suppress instrumentation. // - if ((JitConfig.JitMinimalProfiling() > 0) && (fgCountInstrumentor->SchemaCount() == 1) && - (fgClassInstrumentor->SchemaCount() == 0)) + // We leave instrumentation in place when prejitting as the sample hits in the method + // may be used to determine if the method should be prejitted or not. + // + // For jitting, no information is conveyed by the count in a single=block method. + // + bool minimalProbeMode = false; + + if (opts.jitFlags->IsSet(JitFlags::JIT_FLAG_PREJIT)) + { + minimalProbeMode = (JitConfig.JitMinimalPrejitProfiling() > 0); + } + else + { + minimalProbeMode = (JitConfig.JitMinimalJitProfiling() > 0); + } + + if (minimalProbeMode && (fgCountInstrumentor->SchemaCount() == 1) && (fgClassInstrumentor->SchemaCount() == 0)) { - JITDUMP("Not instrumenting method: only one counter, and no class probes\n"); + JITDUMP( + "Not instrumenting method: minimal probing enabled, and method has only one counter and no class probes\n"); return PhaseStatus::MODIFIED_NOTHING; } diff --git a/src/coreclr/jit/jitconfigvalues.h b/src/coreclr/jit/jitconfigvalues.h index 8019c61e0496d..eb89d630e67fa 100644 --- a/src/coreclr/jit/jitconfigvalues.h +++ b/src/coreclr/jit/jitconfigvalues.h @@ -439,8 +439,8 @@ CONFIG_INTEGER(JitEnableFinallyCloning, W("JitEnableFinallyCloning"), 1) CONFIG_INTEGER(JitEnableRemoveEmptyTry, W("JitEnableRemoveEmptyTry"), 1) #endif // DEBUG -// Overall master enable for Guarded Devirtualization. Currently not enabled by default. -CONFIG_INTEGER(JitEnableGuardedDevirtualization, W("JitEnableGuardedDevirtualization"), 0) +// Overall master enable for Guarded Devirtualization. +CONFIG_INTEGER(JitEnableGuardedDevirtualization, W("JitEnableGuardedDevirtualization"), 1) #if defined(DEBUG) // Various policies for GuardedDevirtualization @@ -453,9 +453,10 @@ CONFIG_INTEGER(TC_OnStackReplacement, W("TC_OnStackReplacement"), 0) CONFIG_INTEGER(TC_OnStackReplacement_InitialCounter, W("TC_OnStackReplacement_InitialCounter"), 1000) // Profile instrumentation options -CONFIG_INTEGER(JitMinimalProfiling, W("JitMinimalProfiling"), 0) -CONFIG_INTEGER(JitClassProfiling, W("JitClassProfiling"), 0) -CONFIG_INTEGER(JitEdgeProfiling, W("JitEdgeProfiling"), 0) +CONFIG_INTEGER(JitMinimalJitProfiling, W("JitMinimalJitProfiling"), 1) +CONFIG_INTEGER(JitMinimalPrejitProfiling, W("JitMinimalPrejitProfiling"), 0) +CONFIG_INTEGER(JitClassProfiling, W("JitClassProfiling"), 1) +CONFIG_INTEGER(JitEdgeProfiling, W("JitEdgeProfiling"), 1) // Control when Virtual Calls are expanded CONFIG_INTEGER(JitExpandCallsEarly, W("JitExpandCallsEarly"), 1) // Expand Call targets early (in the global morph diff --git a/src/tests/Common/testenvironment.proj b/src/tests/Common/testenvironment.proj index a4460c53130c6..b368747b4aebd 100644 --- a/src/tests/Common/testenvironment.proj +++ b/src/tests/Common/testenvironment.proj @@ -147,11 +147,8 @@ - - - - - + +