Request for reviews (XS): 6552561: MaxRecursiveInlineLevel flag doesn't operate correctly

Tom Rodriguez tom.rodriguez at oracle.com
Fri Apr 29 10:37:11 PDT 2011


Looks good.

tom

On Apr 29, 2011, at 4:03 AM, Christian Thalinger wrote:

> http://cr.openjdk.java.net/~twisti/6552561/
> 
> 6552561: MaxRecursiveInlineLevel flag doesn't operate correctly
> Reviewed-by:
> 
> The current logic around MaxRecursiveInlineLevel does not calculate
> the inline depth correctly in some situations resulting in different
> recursive inlining depending on the compiled method.
> 
> The fix is to use the logic we already use for recursive method handle
> targets.  This also handles indirect recursion correctly.
> 
> src/share/vm/opto/bytecodeInfo.cpp
> 
> ---
> 
> Some before-after examples:
> 
> 1. Direct recursive inlining...
> 
> ...with -XX:MaxRecursiveInlineLevel=1:
> 
> Before:
> 
>    282    1             fib::fib (21 bytes)
>                            @ 10   fib::fib (21 bytes)   inline (hot)
>                              @ 10   fib::fib (21 bytes)   inline (hot)
>                                @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                                @ 16   fib::fib (21 bytes)   recursively inlining too deep
>                              @ 16   fib::fib (21 bytes)   inline (hot)
>                                @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                                @ 16   fib::fib (21 bytes)   recursively inlining too deep
>                            @ 16   fib::fib (21 bytes)   inline (hot)
>                              @ 10   fib::fib (21 bytes)   inline (hot)
>                                @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                                @ 16   fib::fib (21 bytes)   recursively inlining too deep
>                              @ 16   fib::fib (21 bytes)   inline (hot)
>                                @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                                @ 16   fib::fib (21 bytes)   recursively inlining too deep
>    301    1 %           fib::main @ 2 (21 bytes)
>                            @ 10   fib::fib (21 bytes)   inline (hot)
>                              @ 10   fib::fib (21 bytes)   inline (hot)
>                                @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                                @ 16   fib::fib (21 bytes)   recursively inlining too deep
>                              @ 16   fib::fib (21 bytes)   inline (hot)
>                                @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                                @ 16   fib::fib (21 bytes)   recursively inlining too deep
> 
> Results in different recursive inlining in the two compiles (2 vs. 1).
> 
> After:
> 
>    673    1             fib::fib (21 bytes)
>                            @ 10   fib::fib (21 bytes)   inline (hot)
>                              @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                              @ 16   fib::fib (21 bytes)   recursively inlining too deep
>                            @ 16   fib::fib (21 bytes)   inline (hot)
>                              @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                              @ 16   fib::fib (21 bytes)   recursively inlining too deep
>    702    1 %           fib::main @ 2 (21 bytes)
>                            @ 10   fib::fib (21 bytes)   inline (hot)
>                              @ 10   fib::fib (21 bytes)   inline (hot)
>                                @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                                @ 16   fib::fib (21 bytes)   recursively inlining too deep
>                              @ 16   fib::fib (21 bytes)   inline (hot)
>                                @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                                @ 16   fib::fib (21 bytes)   recursively inlining too deep
> 
> ...with -XX:MaxRecursiveInlineLevel=0:
> 
> Before:
> 
>    396    1             fib::fib (21 bytes)
>                            @ 10   fib::fib (21 bytes)   inline (hot)
>                              @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                              @ 16   fib::fib (21 bytes)   recursively inlining too deep
>                            @ 16   fib::fib (21 bytes)   inline (hot)
>                              @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                              @ 16   fib::fib (21 bytes)   recursively inlining too deep
>    414    1 %           fib::main @ 2 (21 bytes)
>                            @ 10   fib::fib (21 bytes)   inline (hot)
>                              @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                              @ 16   fib::fib (21 bytes)   recursively inlining too deep
> 
> Results in different recursive inlining in the two compiles (1 vs. 0).
> 
> After:
> 
>    602    1             fib::fib (21 bytes)
>                            @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                            @ 16   fib::fib (21 bytes)   recursively inlining too deep
>    633    1 %           fib::main @ 2 (21 bytes)
>                            @ 10   fib::fib (21 bytes)   inline (hot)
>                              @ 10   fib::fib (21 bytes)   recursively inlining too deep
>                              @ 16   fib::fib (21 bytes)   recursively inlining too deep
> 
> 2. Indirect recursive inlining...
> 
> ...with -XX:MaxRecursiveInlineLevel=1:
> 
> Before:
> 
>    292    1 %           indirect::main @ 2 (21 bytes)
>                            @ 10   indirect::foo (14 bytes)   inline (hot)
>                              @ 10   indirect::bar (14 bytes)   inline (hot)
>                                @ 10   indirect::foo (14 bytes)   inline (hot)
>                                    @ 10   indirect::foo (14 bytes)   inline (hot)
>                                      @ 10   indirect::bar (14 bytes)   inline (hot)
>                                        @ 10   indirect::foo (14 bytes)   inline (hot)
>                                          @ 10   indirect::bar (14 bytes)   inline (hot)
>                                            @ 10   indirect::foo (14 bytes)   inline (hot)
>                                              @ 10   indirect::bar (14 bytes)   inline (hot)
>                                                @ 10   indirect::foo (14 bytes)   inlining too deep
> 
> Indirect recursive inlining not handled at all, the logic inlines until MaxInlineLevel is hit (which is 9 by default).
> 
> After:
> 
>    624    1 %           indirect::main @ 2 (21 bytes)
>                            @ 10   indirect::foo (14 bytes)   inline (hot)
>                              @ 10   indirect::bar (14 bytes)   inline (hot)
>                                @ 10   indirect::foo (14 bytes)   inline (hot)
>                                  @ 10   indirect::bar (14 bytes)   inline (hot)
>                                    @ 10   indirect::foo (14 bytes)   recursively inlining too deep
> 
> Every recursive call is inlined once.
> 
> ...with -XX:MaxRecursiveInlineLevel=0:
> 
> After:
> 
>    602    1             indirect::foo (14 bytes)
>                            @ 10   indirect::bar (14 bytes)   inline (hot)
>                              @ 10   indirect::foo (14 bytes)   recursively inlining too deep
>    621    2             indirect::bar (14 bytes)
>                            @ 10   indirect::foo (14 bytes)   inline (hot)
>                              @ 10   indirect::bar (14 bytes)   recursively inlining too deep
>    623    1 %           indirect::main @ 2 (21 bytes)
>                            @ 10   indirect::foo (14 bytes)   inline (hot)
>                              @ 10   indirect::bar (14 bytes)   inline (hot)
>                                @ 10   indirect::foo (14 bytes)   recursively inlining too deep
> 
> No recursive inlining.



More information about the hotspot-compiler-dev mailing list