RFR: 8272563: Possible assertion failure in CardTableBarrierSetC1 [v3]

Igor Veresov iveresov at openjdk.java.net
Wed Sep 1 06:55:45 UTC 2021


On Wed, 1 Sep 2021 05:56:09 GMT, Fairoz Matte <fmatte at openjdk.org> wrote:

>> This patch is proposed by the submitter of the bug - ugawa at ci.i.u-tokyo.ac.jp
>> 
>> The method CardTableBarrierSetC1::post_barrier generates a move LIR when TwoOperandLIRForm flag is true to move the address to be marked in the card table to a temporary register.
>>> __ move(addr, tmp);
>> However, this code only guarantees that `addr` is a valid register for LIR, which can be a virtual register. If the virtual register for `addr` is spilled to the stack by chance, the `move(addr, tmp)` is compiled to a memory-to-register which causes an assertion failure because a memory-to-register move requires their arguments to have the same size. 
>> The fix is to check if it is is_oop() and call the mov appropriately.
>> 
>> No issues found in local testing and Mach5 tier1-3
>
> Fairoz Matte has updated the pull request incrementally with one additional commit since the last revision:
> 
>   8272563: Possible assertion failure in CardTableBarrierSetC1

src/hotspot/share/gc/shared/c1/cardTableBarrierSetC1.cpp line 72:

> 70:     LIR_Opr addr_opr = LIR_OprFact::address(new LIR_Address(addr, addr->type()));
> 71:     __ leal(addr_opr, tmp);
> 72:     __ move(addr, tmp);

You don't need the move anymore.

-------------

PR: https://git.openjdk.java.net/jdk/pull/5164



More information about the hotspot-gc-dev mailing list