JIT: modify inline budget update to use estimated imported IL size
authorAndy Ayers <andya@microsoft.com>
Tue, 8 Jan 2019 19:27:32 +0000 (11:27 -0800)
committerAndy Ayers <andya@microsoft.com>
Tue, 8 Jan 2019 22:16:43 +0000 (14:16 -0800)
commitf9bc2ee6150266dce691b542b036e1866466c29e
tree99671252955d7783f88a94016f2cbaefeb406d12
parenta57b000e5bbdd55b6c9ab5c93d379f89ed658b85
JIT: modify inline budget update to use estimated imported IL size

The inliner keeps a time budget to try and avoid pathological runaway inline
behavior (see dotnet/coreclr#4375). The jit estimates the time impact of an inline using a
simple projection based on IL size. If an prospective inline would put the jit
over the time budget, the inline is blocked -- and note even aggressive inlines
can be blocked this way.

We now have a fair number of aggressive inline methods like
`Vector256<T>.IsSupported` where the IL is optimized early on by the jit and the
actual impact on the calling method is much less than the initial IL size would
suggest. For instance `IsSupported` is 286 bytes of IL, but the net contribution
of this method at jit time is either a constant 0 or 1, and so the effective size
is more like 2 bytes of IL.

This set of changes updates the jit to estimate the imported IL size of a method
when updating the budget.

Closes dotnet/coreclr#21794.

Commit migrated from https://github.com/dotnet/coreclr/commit/3f182cfcf80af6500217673d920c52ccf6919661
src/coreclr/src/jit/compiler.cpp
src/coreclr/src/jit/compiler.h
src/coreclr/src/jit/flowgraph.cpp
src/coreclr/src/jit/inline.cpp
src/coreclr/src/jit/inline.h