RFR: Backport SFX-related changes to sh/jdk8

Aleksey Shipilev shade at redhat.com
Mon May 25 08:34:46 UTC 2020


On 5/23/20 10:40 PM, Roman Kennke wrote:
> http://cr.openjdk.java.net/~rkennke/sfx-jdk8/webrev.03/
Cannot shake the feeling this is too risky for July release.

*) We cannot pick up changesets like that:
  8202976: Add C1 lea patching support for x86

...because it messes up tracking. It should be something like:
  Cherry-pick 8202976: Add C1 lea patching support for x86

*) src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp: the new block should be guarded by UseShenandoahGC?

*) src/cpu/x86/vm/c1_LIRAssembler_x86.cpp: I thought we were discussing how to isolate this with
UseShenandoahGC? It is odd to change upstream LIR_Assembler::leal.

*) src/cpu/aarch64/vm/macroAssembler_aarch64.cpp

It looks to me Shenandoah interception is cleaner with early return like this:

 void MacroAssembler::load_heap_oop(Register dst, Address src)
 {
 #if INCLUDE_ALL_GCS
   if (UseShenandoahGC) {
     ShenandoahBarrierSetAssembler::bsasm()->load_heap_oop(this, dst, src);
     return;
   }
 #endif

   if (UseCompressedOops) {
     ldrw(dst, src);
     decode_heap_oop(dst);
   } else {
     ldr(dst, src);
   }
 }

*) src/cpu/x86/vm/macroAssembler_x86.cpp: same as above. Should just use early return.

*) src/cpu/x86/vm/shenandoahBarrierSetAssembler_x86.cpp: bad indent at L437, L468.

 430 static void load_at(MacroAssembler* masm, Register dst, Address src) {
 431 #ifdef _LP64
 432   if (UseCompressedOops) {
 433     __ movl(dst, src);
 434     __ decode_heap_oop(dst);
 435   } else
 436 #endif
 437     __ movptr(dst, src);
 438 }

 461 static void load_at_not_null(MacroAssembler* masm, Register dst, Address src) {
 462 #ifdef _LP64
 463   if (UseCompressedOops) {
 464     __ movl(dst, src);
 465     __ decode_heap_oop_not_null(dst);
 466   } else
 467 #endif
 468     __ movptr(dst, src);
 469 }

*) src/share/vm/c1/c1_LIRGenerator.cpp, I do not understand this change:

-    if (is_volatile && !needs_patching) {
-      volatile_field_load(address, tmp, info);
+    if (is_volatile) {
+      volatile_field_load(addr->as_address_ptr(), tmp, info);
     } else {
-      LIR_PatchCode patch_code = needs_patching ? lir_patch_normal : lir_patch_none;
-      __ load(address, tmp, info, patch_code);
+      __ load(addr->as_address_ptr(), tmp, info);
     }
     if (is_volatile && os::is_MP()) {
       __ membar_acquire();

Does this mean we always call load(..., lir_patch_none), even when need_patching is true?

*) src/share/vm/gc_implementation/shenandoah/shenandoahBarrierSetC1.cpp, this is odd:

 108 #ifdef AARCH64
 109       // AArch64 expects double-size register.
 110       obj_reg = gen->new_pointer_register();
 111 #else
 112       // x86 expects single-size register.
 113       obj_reg = gen->new_register(T_OBJECT);
 114 #endif

I thought we eliminated it with:
  https://hg.openjdk.java.net/jdk/jdk/rev/732


-- 
Thanks,
-Aleksey



More information about the shenandoah-dev mailing list