mirror of
https://github.com/openjdk/jdk.git
synced 2026-03-20 04:43:32 +00:00
8211231: BarrierSetC1::generate_referent_check() confuses register allocator
Reviewed-by: iveresov, kvn
This commit is contained in:
parent
bb0074a569
commit
b00f4560cb
@ -296,6 +296,10 @@ void BarrierSetC1::generate_referent_check(LIRAccess& access, LabelObj* cont) {
|
||||
if (gen_pre_barrier) {
|
||||
// We can have generate one runtime check here. Let's start with
|
||||
// the offset check.
|
||||
// Allocate temp register to base and load it here, otherwise
|
||||
// control flow below may confuse register allocator.
|
||||
LIR_Opr base_reg = gen->new_register(T_OBJECT);
|
||||
__ move(base.result(), base_reg);
|
||||
if (gen_offset_check) {
|
||||
// if (offset != referent_offset) -> continue
|
||||
// If offset is an int then we can do the comparison with the
|
||||
@ -318,14 +322,14 @@ void BarrierSetC1::generate_referent_check(LIRAccess& access, LabelObj* cont) {
|
||||
if (gen_source_check) {
|
||||
// offset is a const and equals referent offset
|
||||
// if (source == null) -> continue
|
||||
__ cmp(lir_cond_equal, base.result(), LIR_OprFact::oopConst(NULL));
|
||||
__ cmp(lir_cond_equal, base_reg, LIR_OprFact::oopConst(NULL));
|
||||
__ branch(lir_cond_equal, T_OBJECT, cont->label());
|
||||
}
|
||||
LIR_Opr src_klass = gen->new_register(T_METADATA);
|
||||
if (gen_type_check) {
|
||||
// We have determined that offset == referent_offset && src != null.
|
||||
// if (src->_klass->_reference_type == REF_NONE) -> continue
|
||||
__ move(new LIR_Address(base.result(), oopDesc::klass_offset_in_bytes(), T_ADDRESS), src_klass);
|
||||
__ move(new LIR_Address(base_reg, oopDesc::klass_offset_in_bytes(), T_ADDRESS), src_klass);
|
||||
LIR_Address* reference_type_addr = new LIR_Address(src_klass, in_bytes(InstanceKlass::reference_type_offset()), T_BYTE);
|
||||
LIR_Opr reference_type = gen->new_register(T_INT);
|
||||
__ move(reference_type_addr, reference_type);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user