Does G1's C1 barrier implementation always call the runtime write barrier function?

Per Liden per.liden at oracle.com
Thu Mar 21 08:03:26 UTC 2019


Hi,

On 3/20/19 4:40 PM, William Kemper wrote:
> I've been comparing the JIT assembly emitted by C1 and C2 and have come 
> to believe that the code emitted by C1 always calls the runtime stub for 
> the write barrier. Is there a reason for this? It seems the 
> interpreter's assembler and C2 both emit assembly instructions for the 
> write barrier, but C1 doesn't? have I missed something? I'm looking at 
> OpenJDK 11.0.2.

It doesn't always call a stub, it does some basic filtering before that 
(see G1BarrierSetC1::post_barrier() and G1BarrierSetC1::pre_barrier()). 
Also note that C1 has a multi-level stub setup here, one call-site stub 
(G1BarrierSetAssembler::gen_pre_barrier_stub/G1BarrierSetAssembler::gen_post_barrier_stub), 
which calls a global stub 
(G1BarrierSetAssembler::generate_c1_pre_barrier_runtime_stub/G1BarrierSetAssembler::generate_c1_post_barrier_runtime_stub), 
which in turn might call into the VM. Each layer does some level of work 
and/or filtering. You typically only call into the VM if the STAB/DCQ 
buffer is full.

/Per

> 
> Thanks,
> William


More information about the hotspot-gc-dev mailing list