RFR: Improve C2 barrier filtering: heap-stable check should test for HAS_FORWARDED only

Aleksey Shipilev shade at redhat.com
Fri Jul 20 11:04:03 UTC 2018


http://cr.openjdk.java.net/~shade/shenandoah/c2-has-forwarded/webrev.01/

This irritated me for quite a while. Our current strategy is to check that gc-state is zero, and
claim the heap is stable then. However, this has a significant drawback in barriers filtering, when
marking is active on heap that has no forwarded objects, and gc-state = 2 (marking): WB enters the
mid-path and does RB, even though we know there are no forwarded objects. SATB barriers jumps to
midpath even when marking is not enabled, but we have e.g. forwarded objects or evac/update-refs in
progress.

The improvement is to redefine what is "heap stable" in C2: look for HAS_FORWARDED bit only. Since
this check shape had been changed, there is no reason to have the gc-state = 0 check before SATB
barriers too. If we consider further barrier coalescing, it would need to common tests for gc-state
= 1 (has_forwarded) and gc-state = 2 (marking) under new gc-state = 0 (idle) branch. But until that
happens, WB fast-path performance is important.

Look at disassemblies here:
  http://cr.openjdk.java.net/~shade/shenandoah/c2-has-forwarded/baseline.perfasm
  http://cr.openjdk.java.net/~shade/shenandoah/c2-has-forwarded/patched.perfasm

WB fastpath used to be:

       0x00007f966ca34654: cmpb   $0x0,0x20(%r15)       ; <--- jump if anything is happening
  ╭    0x00007f966ca34659: jne    0x00007f966ca3468a
  │↗   0x00007f966ca3465b: mov    %rdx,%rbx
  ││    ...
  ↘│   0x00007f966ca3468a: testb  $0x14,0x20(%r15)
   │   0x00007f966ca3468f: jne    0x00007f966ca346de
   │   0x00007f966ca34691: mov    -0x8(%rdx),%r8        ; <--- meet the RB (mostly useless)
   │   0x00007f966ca34695: mov    %r8,%rdx
   ╰   0x00007f966ca34698: jmp    0x00007f966ca3465b

WB fastpath now:

       0x00007fd204a341d4: testb  $0x1,0x20(%r15)       ; <--- only jump if HAS_FORWARDED
  ╭    0x00007fd204a341d9: jne    0x00007fd204a3420a
  │↗   0x00007fd204a341db: mov    %rdx,%rbx
  ││   ...
  ↘│   0x00007fd204a3420a: testb  $0x14,0x20(%r15)
   │   0x00007fd204a3420f: jne    0x00007fd204a34256
   │   0x00007fd204a34211: mov    -0x8(%rdx),%r8
   │   0x00007fd204a34215: mov    %r8,%rdx
   ╰   0x00007fd204a34218: jmp    0x00007fd204a341db


SATB fastpath used to be:

       0x00007f966ca3466c: cmpb   $0x0,0x20(%r15)      ; <--- jump if anything is happening
  ╭    0x00007f966ca34671: jne    0x00007f966ca3469e
  │↗↗  0x00007f966ca34673: mov    %rbp,%r11
  │││    ..
  ↘││  0x00007f966ca3469e: testb  $0x2,0x20(%r15)      ; <--- jump back if that was not marking
   ╰│  0x00007f966ca346a3: je     0x00007f966ca34673
    │  0x00007f966ca346a5: mov    0xc(%rdx),%r10d      ; satb barrier head
    │  0x00007f966ca346a9: test   %r10d,%r10d
    ╰  0x00007f966ca346ac: je     0x00007f966ca34673


SATB fastpath now:

       0x00007fd204a341ec: testb  $0x2,0x20(%r15)      ; <--- straight test for MARKING
   ╭   0x00007fd204a341f1: jne    0x00007fd204a3421e
   │↗  0x00007fd204a341f3: mov    %rbp,%r10
   ││..
   ↘│  0x00007fd204a3421e: mov    0xc(%rdx),%r11d      ; satb barrier head
    │  0x00007fd204a34222: test   %r11d,%r11d
    ╰  0x00007fd204a34225: je     0x00007fd204a341f3
       0x00007fd204a34227: mov    0x40(%r15),%r10
       0x00007fd204a3422b: mov    %r11,%rdi


Testing: tier3_gc_shenandoah, benchmarks

Thanks,
-Aleksey



More information about the shenandoah-dev mailing list