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