Skip to content

Commit

Permalink
Allow some intrinsics in Tier0 (dotnet#77357)
Browse files Browse the repository at this point in the history
Co-authored-by: Jakob Botsch Nielsen <[email protected]>
  • Loading branch information
EgorBo and jakobbotsch committed Feb 13, 2023
1 parent cc14f35 commit e1edb16
Showing 1 changed file with 40 additions and 1 deletion.
41 changes: 40 additions & 1 deletion src/coreclr/jit/importercalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2597,14 +2597,53 @@ GenTree* Compiler::impIntrinsic(GenTree* newobjThis,
break;
}

// Allow some lighweight intrinsics in Tier0 which can improve throughput
// we introduced betterToExpand here because we're fine if intrinsic decides to not expand itself
// in this case unlike mustExpand.
bool betterToExpand = false;

// NOTE: MinOpts() is always true for Tier0 so we have to check explicit flags instead.
// To be fixed in https://github.com/dotnet/runtime/pull/77465
const bool tier0opts = !opts.compDbgCode && !opts.jitFlags->IsSet(JitFlags::JIT_FLAG_MIN_OPT);

if (!mustExpand && tier0opts)
{
switch (ni)
{
// This one is just `return true/false`
case NI_System_Runtime_CompilerServices_RuntimeHelpers_IsKnownConstant:

// We need these to be able to fold "typeof(...) == typeof(...)"
case NI_System_RuntimeTypeHandle_GetValueInternal:
case NI_System_Type_GetTypeFromHandle:
case NI_System_Type_op_Equality:
case NI_System_Type_op_Inequality:

// Simple cases
case NI_System_String_get_Chars:
case NI_System_String_get_Length:
case NI_System_Span_get_Item:
case NI_System_Span_get_Length:
case NI_System_ReadOnlySpan_get_Item:
case NI_System_ReadOnlySpan_get_Length:
betterToExpand = true;
break;

default:
// Unsafe.* are all small enough to prefer expansions.
betterToExpand = ni >= NI_SRCS_UNSAFE_START && ni <= NI_SRCS_UNSAFE_END;
break;
}
}

GenTree* retNode = nullptr;

// Under debug and minopts, only expand what is required.
// NextCallReturnAddress intrinsic returns the return address of the next call.
// If that call is an intrinsic and is expanded, codegen for NextCallReturnAddress will fail.
// To avoid that we conservatively expand only required intrinsics in methods that call
// the NextCallReturnAddress intrinsic.
if (!mustExpand && (opts.OptimizationDisabled() || info.compHasNextCallRetAddr))
if (!mustExpand && ((opts.OptimizationDisabled() && !betterToExpand) || info.compHasNextCallRetAddr))
{
*pIntrinsicName = NI_Illegal;
return retNode;
Expand Down

0 comments on commit e1edb16

Please sign in to comment.