[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