< prev index next >
src/hotspot/share/opto/arraycopynode.cpp
Print this page
rev 53307 : Backport Shenadoah GC
*** 28,37 ****
--- 28,40 ----
#include "gc/shared/c2/cardTableBarrierSetC2.hpp"
#include "opto/arraycopynode.hpp"
#include "opto/graphKit.hpp"
#include "runtime/sharedRuntime.hpp"
#include "utilities/macros.hpp"
+ #if INCLUDE_SHENANDOAHGC
+ #include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
+ #endif
ArrayCopyNode::ArrayCopyNode(Compile* C, bool alloc_tightly_coupled, bool has_negative_length_guard)
: CallNode(arraycopy_type(), NULL, TypeRawPtr::BOTTOM),
_alloc_tightly_coupled(alloc_tightly_coupled),
_has_negative_length_guard(has_negative_length_guard),
*** 203,212 ****
--- 206,220 ----
type = Type::get_const_basic_type(bt);
}
Node* v = LoadNode::make(*phase, ctl, mem->memory_at(fieldidx), next_src, adr_type, type, bt, MemNode::unordered);
v = phase->transform(v);
+ #if INCLUDE_SHENANDOAHGC
+ if (UseShenandoahGC && bt == T_OBJECT) {
+ v = ShenandoahBarrierSetC2::bsc2()->arraycopy_load_reference_barrier(phase, v);
+ }
+ #endif
Node* s = StoreNode::make(*phase, ctl, mem->memory_at(fieldidx), next_dest, adr_type, v, bt, MemNode::unordered);
s = phase->transform(s);
mem->set_memory_at(fieldidx, s);
}
*** 371,388 ****
--- 379,406 ----
bool same_alias = (alias_idx_src == alias_idx_dest);
if (count > 0) {
Node* v = LoadNode::make(*phase, forward_ctl, start_mem_src, adr_src, atp_src, value_type, copy_type, MemNode::unordered);
v = phase->transform(v);
+ #if INCLUDE_SHENANDOAHGC
+ if (UseShenandoahGC && copy_type == T_OBJECT) {
+ v = ShenandoahBarrierSetC2::bsc2()->arraycopy_load_reference_barrier(phase, v);
+ }
+ #endif
mem = StoreNode::make(*phase, forward_ctl, mem, adr_dest, atp_dest, v, copy_type, MemNode::unordered);
mem = phase->transform(mem);
for (int i = 1; i < count; i++) {
Node* off = phase->MakeConX(type2aelembytes(copy_type) * i);
Node* next_src = phase->transform(new AddPNode(base_src,adr_src,off));
Node* next_dest = phase->transform(new AddPNode(base_dest,adr_dest,off));
v = LoadNode::make(*phase, forward_ctl, same_alias ? mem : start_mem_src, next_src, atp_src, value_type, copy_type, MemNode::unordered);
v = phase->transform(v);
+ #if INCLUDE_SHENANDOAHGC
+ if (UseShenandoahGC && copy_type == T_OBJECT) {
+ v = ShenandoahBarrierSetC2::bsc2()->arraycopy_load_reference_barrier(phase, v);
+ }
+ #endif
mem = StoreNode::make(*phase, forward_ctl,mem,next_dest,atp_dest,v, copy_type, MemNode::unordered);
mem = phase->transform(mem);
}
} else if(can_reshape) {
PhaseIterGVN* igvn = phase->is_IterGVN();
*** 420,434 ****
--- 438,462 ----
Node* off = phase->MakeConX(type2aelembytes(copy_type) * i);
Node* next_src = phase->transform(new AddPNode(base_src,adr_src,off));
Node* next_dest = phase->transform(new AddPNode(base_dest,adr_dest,off));
Node* v = LoadNode::make(*phase, backward_ctl, same_alias ? mem : start_mem_src, next_src, atp_src, value_type, copy_type, MemNode::unordered);
v = phase->transform(v);
+ #if INCLUDE_SHENANDOAHGC
+ if (UseShenandoahGC && copy_type == T_OBJECT) {
+ v = ShenandoahBarrierSetC2::bsc2()->arraycopy_load_reference_barrier(phase, v);
+ }
+ #endif
mem = StoreNode::make(*phase, backward_ctl,mem,next_dest,atp_dest,v, copy_type, MemNode::unordered);
mem = phase->transform(mem);
}
Node* v = LoadNode::make(*phase, backward_ctl, same_alias ? mem : start_mem_src, adr_src, atp_src, value_type, copy_type, MemNode::unordered);
v = phase->transform(v);
+ #if INCLUDE_SHENANDOAHGC
+ if (UseShenandoahGC && copy_type == T_OBJECT) {
+ v = ShenandoahBarrierSetC2::bsc2()->arraycopy_load_reference_barrier(phase, v);
+ }
+ #endif
mem = StoreNode::make(*phase, backward_ctl, mem, adr_dest, atp_dest, v, copy_type, MemNode::unordered);
mem = phase->transform(mem);
} else if(can_reshape) {
PhaseIterGVN* igvn = phase->is_IterGVN();
igvn->_worklist.push(adr_src);
*** 483,493 ****
remove_dead_region(phase, can_reshape);
}
} else {
if (in(TypeFunc::Control) != ctl) {
// we can't return new memory and control from Ideal at parse time
! assert(!is_clonebasic(), "added control for clone?");
return false;
}
}
return true;
}
--- 511,522 ----
remove_dead_region(phase, can_reshape);
}
} else {
if (in(TypeFunc::Control) != ctl) {
// we can't return new memory and control from Ideal at parse time
! assert(!is_clonebasic() || UseShenandoahGC, "added control for clone?");
! phase->record_for_igvn(this);
return false;
}
}
return true;
}
< prev index next >