提交 54c4be2a 编写于 作者: R roland

8211231: BarrierSetC1::generate_referent_check() confuses register allocator

Reviewed-by: iveresov, kvn
上级 360e58f8
......@@ -2305,6 +2305,10 @@ void LIRGenerator::do_UnsafeGetObject(UnsafeGetObject* x) {
// We can have generate one runtime check here. Let's start with
// the offset check.
// Allocate temp register to src and load it here, otherwise
// control flow below may confuse register allocator.
LIR_Opr src_reg = new_register(T_OBJECT);
__ move(src.result(), src_reg);
if (gen_offset_check) {
// if (offset != referent_offset) -> continue
// If offset is an int then we can do the comparison with the
......@@ -2327,14 +2331,14 @@ void LIRGenerator::do_UnsafeGetObject(UnsafeGetObject* x) {
if (gen_source_check) {
// offset is a const and equals referent offset
// if (source == null) -> continue
__ cmp(lir_cond_equal, src.result(), LIR_OprFact::oopConst(NULL));
__ cmp(lir_cond_equal, src_reg, LIR_OprFact::oopConst(NULL));
__ branch(lir_cond_equal, T_OBJECT, Lcont->label());
}
LIR_Opr src_klass = new_register(T_OBJECT);
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(src.result(), oopDesc::klass_offset_in_bytes(), T_ADDRESS), src_klass);
__ move(new LIR_Address(src_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 = new_register(T_INT);
__ move(reference_type_addr, reference_type);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册