[16] RFR(S): 8249603: C1: assert(has_error == false) failed: register allocation invalid
Christian Hagedorn
christian.hagedorn at oracle.com
Thu Aug 6 09:34:11 UTC 2020
Hi
Please review the following patch:
https://bugs.openjdk.java.net/browse/JDK-8249603
http://cr.openjdk.java.net/~chagedorn/8249603/webrev.00/
Register allocation fails in C1 in the testcase because two intervals
overlap (they both have the same stack slot assigned). The problem can
be traced back to the optimization to assign the same spill slot to
non-intersecting intervals in LinearScanWalker::combine_spilled_intervals().
In this method, we look at a split parent interval 'cur' and its
register hint interval 'register_hint'. A register hint is present when
the interval represents either the source or the target operand of a
move operation and the register hint the target or source operand,
respectively (the register hint is used to try to assign the same
register to the source and target operand such that we can completely
remove the move operation).
If the register hint is set, then we do some additional checks and make
sure that the split parent and the register hint do not intersect. If
all checks pass, the split parent 'cur' gets the same spill slot as the
register hint [1]. This means that both intervals get the same slot on
the stack if they are spilled.
The problem now is that we do not consider any split children of the
register hint which all share the same spill slot with the register hint
(their split parent). In the testcase, the split parent 'cur' does not
intersect with the register hint but with one of its split children. As
a result, they both get the same spill slot and are later indeed both
spilled (i.e. both virtual registers/operands are put to the same stack
location at the same time).
The fix now additionally checks if the split parent 'cur' does not
intersect any split children of the register hint in
combine_spilled_intervals(). If there is such an intersection, then we
bail out of the optimization.
Some standard benchmark testing did not show any regressions.
Thank you!
Best regards,
Christian
[1]
http://hg.openjdk.java.net/jdk/jdk/file/7a3522ab48b3/src/hotspot/share/c1/c1_LinearScan.cpp#l5728
More information about the hotspot-compiler-dev
mailing list