RFR(M): 8031754: Type speculation should favor profile data from outermost inlined method

Vladimir Kozlov vladimir.kozlov at oracle.com
Wed Jan 22 20:05:58 PST 2014


On 1/22/14 7:57 PM, Krystal Mok wrote:
> Hi Vladimir,
>
> My wild guess is that the outermost method generally gives you the best
> (cleanest) context information. The inner callees may have been called
> from various callers, and so their type profiles may have been polluted
> by other callers.

They can't be polluted. We record only one speculative type. If 
Interpreter see a different type it will set flags and that type 
information will not be used. At least that is how I understand it 
works. That is why I am asking Roland to clarify this.

If you have merging case:

if (x)
   m1()
else
   m2()

I don't understand why at merge point information from m2 will be more 
precise then from m3() called from m1().

Thanks,
Vladimir

>
> - Kris
>
>
> On Wed, Jan 22, 2014 at 7:51 PM, Vladimir Kozlov
> <vladimir.kozlov at oracle.com <mailto:vladimir.kozlov at oracle.com>> wrote:
>
>     Roland,
>
>     I don't see how inlining depth can define type's accuracy in general
>     case. why it can't be reverse: more accurate type from most deeply
>     inlined method?
>
>     I thought you only have speculative type if it is the only one type
>     record in MDO. How in your case you can have different types?
>
>     Can you be more specific?
>
>     Thanks,
>     Vladimir
>
>
>     On 1/22/14 1:42 AM, Roland Westrelin wrote:
>
>         When a node already has a speculative type, and parsing
>         encounters extra profiling data, the new profiling data is
>         ignored. So profiling data coming from profile points closer to
>         the root of the compilation is favored which I think makes
>         sense: it's the data that is most specific to the context of
>         this compilation.
>
>         During runs, profile data is not always entirely coherent so we
>         may hit something like this:
>         m1() {
>              m3();
>         }
>
>         m() {
>             m1();
>             m2();
>         }
>
>         With: m3() and m2() have profile data for the same node. The
>         first profile data to be encountered during parsing is from m3()
>         and profile data from m2() is ignored but profile data from m2()
>         is the one that is actually the most specific and is the one
>         that should be favored.
>
>         When a speculative type is created, this change records the
>         inline depth at which the profile point is. The inline depth is
>         then propagated together with the rest of the type information.
>         When new profile data is available for a node that already has a
>         speculative type, the current inline depth and the inline depth
>         of the current speculative type are used to decide whether the
>         new data should be used to replace the existing speculative type.
>
>         This change helps stabilize performance with nashorn.
>
>         http://cr.openjdk.java.net/~__roland/8031754/webrev.00/
>         <http://cr.openjdk.java.net/~roland/8031754/webrev.00/>
>
>         Roland.
>
>


More information about the hotspot-compiler-dev mailing list