changeset 51983:2a12a3865916

8211231: BarrierSetC1::generate_referent_check() confuses register allocator Reviewed-by: iveresov, kvn
author roland
date Thu, 27 Sep 2018 16:25:25 +0200
parents df8ae450fce3
children 2ef304ee001d
files src/hotspot/share/gc/shared/c1/barrierSetC1.cpp
diffstat 1 files changed, 6 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/share/gc/shared/c1/barrierSetC1.cpp	Tue Oct 02 14:17:30 2018 +0100
+++ b/src/hotspot/share/gc/shared/c1/barrierSetC1.cpp	Thu Sep 27 16:25:25 2018 +0200
@@ -296,6 +296,10 @@
   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 @@
     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);