RFR: 8272563: Possible assertion failure in CardTableBarrierSetC1
    Tobias Hartmann 
    thartmann at openjdk.java.net
       
    Fri Aug 20 06:28:25 UTC 2021
    
    
  
On Wed, 18 Aug 2021 12:37:00 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
Using an additional register + move does not seem right to fix this.
The problem is that `addr->type()` is `T_OBJECT` and the type of the virtual register `tmp` is `T_LONG`, right?
What about this?
LIR_Opr tmp = gen->new_register(addr->type());
Could the reporter provide a reproducer?
-------------
Changes requested by thartmann (Reviewer).
PR: https://git.openjdk.java.net/jdk/pull/5164
    
    
More information about the hotspot-dev
mailing list