< prev index next >
src/share/vm/opto/arraycopynode.cpp
Print this page
rev 12906 : [mq]: gc_interface
*** 249,259 ****
if (src_elem != dest_elem || dest_elem == T_VOID) {
// We don't know if arguments are arrays of the same type
return false;
}
! if (dest_elem == T_OBJECT && (!is_alloc_tightly_coupled() || !GraphKit::use_ReduceInitialCardMarks())) {
// It's an object array copy but we can't emit the card marking
// that is needed
return false;
}
--- 249,261 ----
if (src_elem != dest_elem || dest_elem == T_VOID) {
// We don't know if arguments are arrays of the same type
return false;
}
! C2BarrierSetCodeGen* code_gen = Universe::heap()->barrier_set()->c2_code_gen();
! if (dest_elem == T_OBJECT && (!is_alloc_tightly_coupled() ||
! code_gen->array_copy_requires_gc_barriers(T_OBJECT))) {
// It's an object array copy but we can't emit the card marking
// that is needed
return false;
}
*** 431,443 ****
PhaseIterGVN* igvn = phase->is_IterGVN();
igvn->set_delay_transform(false);
if (is_clonebasic()) {
Node* out_mem = proj_out(TypeFunc::Memory);
if (out_mem->outcnt() != 1 || !out_mem->raw_out(0)->is_MergeMem() ||
out_mem->raw_out(0)->outcnt() != 1 || !out_mem->raw_out(0)->raw_out(0)->is_MemBar()) {
! assert(!GraphKit::use_ReduceInitialCardMarks(), "can only happen with card marking");
return false;
}
igvn->replace_node(out_mem->raw_out(0), mem);
--- 433,446 ----
PhaseIterGVN* igvn = phase->is_IterGVN();
igvn->set_delay_transform(false);
if (is_clonebasic()) {
Node* out_mem = proj_out(TypeFunc::Memory);
+ C2BarrierSetCodeGen* code_gen = Universe::heap()->barrier_set()->c2_code_gen();
if (out_mem->outcnt() != 1 || !out_mem->raw_out(0)->is_MergeMem() ||
out_mem->raw_out(0)->outcnt() != 1 || !out_mem->raw_out(0)->raw_out(0)->is_MemBar()) {
! assert(code_gen->array_copy_requires_gc_barriers(T_OBJECT), "can only happen with card marking");
return false;
}
igvn->replace_node(out_mem->raw_out(0), mem);
< prev index next >