Request for reviews (XS): 6552561: MaxRecursiveInlineLevel flag doesn't operate correctly
Christian Thalinger
christian.thalinger at oracle.com
Mon May 2 00:59:17 PDT 2011
Thank you, Tom and Vladimir. -- Christian
On Apr 29, 2011, at 7:37 PM, Tom Rodriguez wrote:
> 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