[16] RFR(S): 8249603: C1: assert(has_error == false) failed: register allocation invalid
Vladimir Kozlov
vladimir.kozlov at oracle.com
Thu Aug 6 19:19:13 UTC 2020
Fix looks good. And very nice description of the issue.
Thanks,
Vladimir K
On 8/6/20 2:34 AM, Christian Hagedorn wrote:
> 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