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

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