From f022a20c7b8236ea1f7676f078de2c84cce351f2 Mon Sep 17 00:00:00 2001 From: Bruce Forstall Date: Fri, 23 Jun 2017 14:26:56 -0700 Subject: [PATCH] Fix JitMinOptsTrackGCrefs for legacy x86 back-end (dotnet/coreclr#12416) Addresses dotnet/coreclr#12415 Commit migrated from https://github.com/dotnet/coreclr/commit/16cee64552b4fd6d08dd84b273cc223094d5b5f6 --- src/coreclr/src/jit/gcencode.cpp | 7 +++++-- src/coreclr/src/jit/jitconfigvalues.h | 8 +++++--- src/coreclr/src/jit/lclvars.cpp | 2 ++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/coreclr/src/jit/gcencode.cpp b/src/coreclr/src/jit/gcencode.cpp index a29da24..a48f745 100644 --- a/src/coreclr/src/jit/gcencode.cpp +++ b/src/coreclr/src/jit/gcencode.cpp @@ -4134,8 +4134,11 @@ void GCInfo::gcMakeRegPtrTable( GCENCODER_WITH_LOGGING(gcInfoEncoderWithLog, gcInfoEncoder); const bool noTrackedGCSlots = - (compiler->opts.MinOpts() && !compiler->opts.jitFlags->IsSet(JitFlags::JIT_FLAG_PREJIT) && - !JitConfig.JitMinOptsTrackGCrefs()); + (compiler->opts.MinOpts() && !compiler->opts.jitFlags->IsSet(JitFlags::JIT_FLAG_PREJIT) +#if !defined(JIT32_GCENCODER) || !defined(LEGACY_BACKEND) + && !JitConfig.JitMinOptsTrackGCrefs() +#endif // !defined(JIT32_GCENCODER) || !defined(LEGACY_BACKEND) + ); if (mode == MAKE_REG_PTR_MODE_ASSIGN_SLOTS) { diff --git a/src/coreclr/src/jit/jitconfigvalues.h b/src/coreclr/src/jit/jitconfigvalues.h index 3657696a..2db5dfe 100644 --- a/src/coreclr/src/jit/jitconfigvalues.h +++ b/src/coreclr/src/jit/jitconfigvalues.h @@ -218,14 +218,16 @@ CONFIG_INTEGER(JitEnableNoWayAssert, W("JitEnableNoWayAssert"), 0) CONFIG_INTEGER(JitEnableNoWayAssert, W("JitEnableNoWayAssert"), 1) #endif // !defined(DEBUG) && !defined(_DEBUG) -#if !defined(JIT32_GCENCODER) -#if defined(_TARGET_AMD64_) && defined(FEATURE_CORECLR) +// It was originally intended that JitMinOptsTrackGCrefs only be enabled for amd64 on CoreCLR. A mistake was +// made, and it was enabled for x86 as well. However, it doesn't currently work with x86 legacy back-end, so +// disable it for that. Whether it should continue to be enabled for x86 non-legacy-backend should be investigated. +// This is tracked by issue https://github.com/dotnet/coreclr/issues/12415. +#if (defined(_TARGET_AMD64_) && defined(FEATURE_CORECLR)) || (defined(_TARGET_X86_) && !defined(LEGACY_BACKEND)) #define JitMinOptsTrackGCrefs_Default 0 // Not tracking GC refs in MinOpts is new behavior #else #define JitMinOptsTrackGCrefs_Default 1 #endif CONFIG_INTEGER(JitMinOptsTrackGCrefs, W("JitMinOptsTrackGCrefs"), JitMinOptsTrackGCrefs_Default) // Track GC roots -#endif // !defined(JIT32_GCENCODER) // The following should be wrapped inside "#if MEASURE_MEM_ALLOC / #endif", but // some files include this one without bringing in the definitions from "jit.h" diff --git a/src/coreclr/src/jit/lclvars.cpp b/src/coreclr/src/jit/lclvars.cpp index f662bcc..48a88ba 100644 --- a/src/coreclr/src/jit/lclvars.cpp +++ b/src/coreclr/src/jit/lclvars.cpp @@ -3289,10 +3289,12 @@ void Compiler::lvaSortByRefCount() lvaSetVarDoNotEnregister(lclNum DEBUGARG(DNER_PinningRef)); #endif } +#if !defined(JIT32_GCENCODER) || !defined(LEGACY_BACKEND) else if (opts.MinOpts() && !JitConfig.JitMinOptsTrackGCrefs() && varTypeIsGC(varDsc->TypeGet())) { varDsc->lvTracked = 0; } +#endif // !defined(JIT32_GCENCODER) || !defined(LEGACY_BACKEND) #if defined(JIT32_GCENCODER) && defined(WIN64EXCEPTIONS) else if (lvaIsOriginalThisArg(lclNum) && (info.compMethodInfo->options & CORINFO_GENERICS_CTXT_FROM_THIS) != 0) { -- 2.7.4