[9] RFR (S): 8148754: C2 loop unrolling fails due to unexpected graph shape
Zoltán Majó
zoltan.majo at oracle.com
Mon Feb 15 15:22:00 UTC 2016
Hi,
please review the patch for 8148754.
https://bugs.openjdk.java.net/browse/JDK-8148754
Problem: Compilation fails when the C2 compiler attempts loop unrolling.
The cause of the failure is that the loop unrolling optimization expects
a well-defined graph shape at the entry control of a 'CountedLoopNode'
('IfTrue'/'IfFalse' preceeded by 'If' preceeded by 'Bool' preceeded by
'CmpI').
Solution: I investigated several different instances of the same
failure. It turns out that the shape of the graph at a loop's entry
control is often different from the way loop unrolling expects it to be
(please find some examples in the bug's JBS issue). The various graph
shapes are a result of previously performed transformations, e.g.,
split-if optimization and loop peeling.
Loop unrolling requires the above mentioned graph shape so that it can
adjust the zero-trip guard of the loop. With the unexpected graph
shapes, it is not possible to perform loop unrolling. However, the graph
is still in a valid state (except for loop unrolling) and can be used to
produce correct code.
I propose that (1) we check if an unexpected graph shape is encountered
and (2) bail out of loop unrolling if it is (but not fail in the
compiler in such cases).
The failure was triggered by Aleksey's Indify String Concatenation
changes but the generated bytecodes are valid. So this seems to be a
compiler issue that was previously there but was not yet triggered.
Webrev:
http://cr.openjdk.java.net/~zmajo/8148754/webrev.00/
Testing:
- JPRT;
- local testing (linux-86_64) with the failing test case;
- executed all hotspot tests locally, all tests pass that pass with an
unmodified build.
Thank you!
Best regards,
Zoltan
More information about the hotspot-compiler-dev
mailing list