< prev index next >

src/hotspot/share/gc/shared/c2/barrierSetC2.cpp

Print this page
@@ -127,10 +127,16 @@
      _preserve.remove(OptoReg::as_OptoReg(vm_reg));
      vm_reg = vm_reg->next();
    } while (vm_reg->is_Register() && !vm_reg->is_concrete());
  }
  
+ bool BarrierStubC2::is_preserved(Register r) {
+   const VMReg vm_reg = r->as_VMReg();
+   assert(vm_reg->is_Register(), "r must be a general-purpose register");
+   return _preserve.member(OptoReg::as_OptoReg(vm_reg));
+ }
+ 
  const RegMask& BarrierStubC2::preserve_set() const {
    return _preserve;
  }
  
  Node* BarrierSetC2::store_at_resolved(C2Access& access, C2AccessValue& val) const {

@@ -1109,11 +1115,11 @@
        const uint mem_index = block_index(mem_block, mem);
  
        if (access_block == mem_block) {
          // Earlier accesses in the same block
          if (mem_index < access_index && !block_has_safepoint(mem_block, mem_index + 1, access_index)) {
-           elide_dominated_barrier(access);
+           elide_dominated_barrier(access, mem->is_Mach() ? mem->as_Mach() : nullptr);
          }
        } else if (mem_block->dominates(access_block)) {
          // Dominating block? Look around for safepoints
          ResourceMark rm;
          Block_List stack;

@@ -1139,11 +1145,11 @@
              stack.push(pred);
            }
          }
  
          if (!safepoint_found) {
-           elide_dominated_barrier(access);
+           elide_dominated_barrier(access, mem->is_Mach() ? mem->as_Mach() : nullptr);
          }
        }
      }
    }
  }
< prev index next >