Request for reviews (XS): 6552561: MaxRecursiveInlineLevel flag doesn't operate correctly
Christian Thalinger
christian.thalinger at oracle.com
Fri Apr 29 04:03:03 PDT 2011
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