{
if (!opts.OptEnabled(CLFLG_INLINING))
{
- /* XXX Mon 8/18/2008
- * This assert is misleading. The caller does not ensure that we have CLFLG_INLINING set before
- * calling impMarkInlineCandidate. However, if this assert trips it means that we're an inlinee and
- * CLFLG_MINOPT is set. That doesn't make a lot of sense. If you hit this assert, work back and
- * figure out why we did not set MAXOPT for this compile.
- */
assert(!compIsForInlining());
return;
}
assert(call->GetInlineCandidatesCount() > 0);
for (uint8_t candidateId = 0; candidateId < call->GetInlineCandidatesCount(); candidateId++)
{
- InlineResult inlineResult(this, call, nullptr, "impMarkInlineCandidate", true);
+ InlineResult inlineResult(this, call, nullptr, "impMarkInlineCandidate for GDV");
// Do the actual evaluation
impMarkInlineCandidateHelper(call, candidateId, exactContextHnd, exactContextNeedsRuntimeLookup, callInfo,
ilOffset, &inlineResult);
-
// Ignore non-inlineable candidates
// TODO: Consider keeping them to just devirtualize without inlining, at least for interface
// calls on NativeAOT, but that requires more changes elsewhere too.
candidateId--;
}
}
+
+ // None of the candidates made it, make sure the call is no longer marked as "has inline info"
+ if (call->GetInlineCandidatesCount() == 0)
+ {
+ assert(!call->IsInlineCandidate());
+ assert(!call->IsGuardedDevirtualizationCandidate());
+ }
}
else
{
const uint8_t candidatesCount = call->GetInlineCandidatesCount();
assert(candidatesCount <= 1);
- InlineResult inlineResult(this, call, nullptr, "impMarkInlineCandidate", true);
+ InlineResult inlineResult(this, call, nullptr, "impMarkInlineCandidate");
impMarkInlineCandidateHelper(call, 0, exactContextHnd, exactContextNeedsRuntimeLookup, callInfo, ilOffset,
&inlineResult);
}
INLINE_OBSERVATION(BAD_ARGUMENT_NUMBER, bool, "invalid argument number", FATAL, CALLEE)
INLINE_OBSERVATION(BAD_LOCAL_NUMBER, bool, "invalid local number", FATAL, CALLEE)
INLINE_OBSERVATION(COMPILATION_ERROR, bool, "compilation error", FATAL, CALLEE)
-INLINE_OBSERVATION(EXCEEDS_THRESHOLD, bool, "exceeds profit threshold", FATAL, CALLEE)
INLINE_OBSERVATION(HAS_EH, bool, "has exception handling", FATAL, CALLEE)
INLINE_OBSERVATION(HAS_ENDFILTER, bool, "has endfilter", FATAL, CALLEE)
INLINE_OBSERVATION(HAS_ENDFINALLY, bool, "has endfinally", FATAL, CALLEE)
INLINE_OBSERVATION(CANT_CLASS_INIT, bool, "can't class init", FATAL, CALLSITE)
INLINE_OBSERVATION(COMPILATION_ERROR, bool, "compilation error", FATAL, CALLSITE)
INLINE_OBSERVATION(COMPILATION_FAILURE, bool, "failed to compile", FATAL, CALLSITE)
-INLINE_OBSERVATION(EXCEEDS_THRESHOLD, bool, "exceeds profit threshold", FATAL, CALLSITE)
INLINE_OBSERVATION(EXPLICIT_TAIL_PREFIX, bool, "explicit tail prefix", FATAL, CALLSITE)
INLINE_OBSERVATION(GENERIC_DICTIONARY_LOOKUP, bool, "runtime dictionary lookup", FATAL, CALLSITE)
INLINE_OBSERVATION(HAS_CALL_VIA_LDVIRTFTN, bool, "call via ldvirtftn", FATAL, CALLSITE)
//
switch (m_Observation)
{
+ // Not-profitable depends on call-site:
case InlineObservation::CALLEE_NOT_PROFITABLE_INLINE:
+ return false;
+
+ // If we mark no-returns as noinline we won't be able to recognize them
+ // as no-returns in future inlines.
case InlineObservation::CALLEE_DOES_NOT_RETURN:
return false;