Enable optimization of arraycopy as loads/stores with Shenandoah

Roland Westrelin rwestrel at redhat.com
Thu Dec 8 16:41:23 UTC 2016


> Ok. And what happens when ReduceInitialCardMarks is false? Because this
> might be what we need.

For instance clone:

    post_barrier(control(),
                 memory(raw_adr_type),
                 alloc_obj,
                 no_particular_field,
                 raw_adr_idx,
                 no_particular_value,
                 T_OBJECT,
                 false);

void GraphKit::post_barrier(Node* ctl,
                            Node* store,
                            Node* obj,
                            Node* adr,
                            uint  adr_idx,
                            Node* val,
                            BasicType bt,
                            bool use_precise) {
  BarrierSet* bs = Universe::heap()->barrier_set();
  set_control(ctl);
  switch (bs->kind()) {
    case BarrierSet::G1SATBCTLogging:
      g1_write_barrier_post(store, obj, adr, adr_idx, val, bt, use_precise);
      break;

    case BarrierSet::CardTableForRS:
    case BarrierSet::CardTableExtension:
      write_barrier_post(store, obj, adr, adr_idx, val, use_precise);
      break;

    case BarrierSet::ModRef:
    case BarrierSet::ShenandoahBarrierSet:
      break;

    default      :
      ShouldNotReachHere();

  }
}

For array clone, if I follow the logic correctly
arrayof_oop_disjoint_arraycopy stub.

The shenandoah clone barrier is a no-op unless
ShenandoahBarrierSet::need_update_refs_barrier() is true. If it's false
often enough, then it seems a reasonable trade off to do the bulk copy
and have an extra call.

Roland.


More information about the shenandoah-dev mailing list