Inliner: allow replay log to override force inlines
authorAndy Ayers <andya@microsoft.com>
Tue, 7 Jun 2016 22:09:16 +0000 (15:09 -0700)
committerAndy Ayers <andya@microsoft.com>
Tue, 7 Jun 2016 22:09:16 +0000 (15:09 -0700)
ReplayPolicy only impacts discretionary inlines, so could not control
force inline candidates. This has lead to some confusion during inline
studies.

Since most cases of force inline are performance related, allow replay
to override and control these force inline candidates.

This might be useful down the road to study how likely it is that a force
inline directive is either unnecessary or perhaps even detremental to
performance.

Commit migrated from https://github.com/dotnet/coreclr/commit/3dec80f0a06a477b5e831b2944a86db43333e64a

src/coreclr/src/jit/inlinepolicy.cpp
src/coreclr/src/jit/inlinepolicy.h

index 0f1bd0c..d63f065 100644 (file)
@@ -2079,6 +2079,8 @@ CritSecObject ReplayPolicy::s_XmlReaderLock;
 ReplayPolicy::ReplayPolicy(Compiler* compiler, bool isPrejitRoot)
     : DiscretionaryPolicy(compiler, isPrejitRoot)
     , m_InlineContext(nullptr)
+    , m_Offset(BAD_IL_OFFSET)
+    , m_WasForceInline(false)
 {
     // Is there a log file open already? If so, we can use it.
     if (s_ReplayFile == nullptr)
@@ -2439,7 +2441,7 @@ bool ReplayPolicy::FindInline(CORINFO_METHOD_HANDLE callee)
     {
         offset = (int) jitGetILoffs(m_Offset);
     }
-    
+
     unsigned calleeOffset = (unsigned) offset;
 
     bool foundInline = FindInline(calleeToken, calleeHash, calleeOffset);
@@ -2448,6 +2450,29 @@ bool ReplayPolicy::FindInline(CORINFO_METHOD_HANDLE callee)
 }
 
 //------------------------------------------------------------------------
+// NoteBool: handle an observed boolean value
+//
+// Arguments:
+//    obs      - the current obsevation
+//    value    - the value being observed
+//
+// Notes:
+//    Overrides parent so Replay can control force inlines.
+
+void ReplayPolicy::NoteBool(InlineObservation obs, bool value)
+{
+    // When inlining, let log override force inline.
+    // Make a note of the actual value for later reporting during observations.
+    if (!m_IsPrejitRoot && (obs == InlineObservation::CALLEE_IS_FORCE_INLINE))
+    {
+        m_WasForceInline = value;
+        value = false;
+    }
+
+    DiscretionaryPolicy::NoteBool(obs, value);
+}
+
+//------------------------------------------------------------------------
 // DetermineProfitability: determine if this inline is profitable
 //
 // Arguments:
@@ -2470,6 +2495,7 @@ void ReplayPolicy::DetermineProfitability(CORINFO_METHOD_INFO* methodInfo)
     {
         MethodInfoObservations(methodInfo);
         EstimateCodeSize();
+        m_IsForceInline = m_WasForceInline;
     }
 
     // Try and find this candiate in the Xml.
index 4b71106..3965b8d 100644 (file)
@@ -348,6 +348,9 @@ public:
     // Construct a ReplayPolicy
     ReplayPolicy(Compiler* compiler, bool isPrejitRoot);
 
+    // Policy observations
+    void NoteBool(InlineObservation obs, bool value) override;
+
     // Optional observations
     void NoteContext(InlineContext* context) override
     {
@@ -379,6 +382,7 @@ private:
     static CritSecObject s_XmlReaderLock;
     InlineContext*       m_InlineContext;
     IL_OFFSETX           m_Offset;
+    bool                 m_WasForceInline;
 };
 
 #endif // defined(DEBUG) || defined(INLINE_DATA)