< prev index next >
src/hotspot/share/c1/c1_LIRGenerator.cpp
Print this page
rev 51436 : 8209667: Explicit barriers for C1/LIR
@@ -1688,10 +1688,20 @@
} else {
return _barrier_set->atomic_add_at(access, value);
}
}
+LIR_Opr LIRGenerator::access_resolve(DecoratorSet decorators, LIR_Opr obj, CodeEmitInfo* info) {
+ // Use stronger ACCESS_WRITE|ACCESS_READ by default.
+ if ((decorators & (ACCESS_READ | ACCESS_WRITE)) == 0) {
+ decorators |= ACCESS_READ | ACCESS_WRITE;
+ }
+
+ LIRAccess access(this, decorators, obj, obj /* dummy */, T_OBJECT, NULL, info);
+ return _barrier_set->resolve(access);
+}
+
void LIRGenerator::do_LoadField(LoadField* x) {
bool needs_patching = x->needs_patching();
bool is_volatile = x->field()->is_volatile();
BasicType field_type = x->field_type();
@@ -1765,15 +1775,16 @@
LIR_Opr result = rlock_result(x);
if (GenerateRangeChecks) {
CodeEmitInfo* info = state_for(x);
CodeStub* stub = new RangeCheckStub(info, index.result());
+ LIR_Opr buf_obj = access_resolve(IN_HEAP | IS_NOT_NULL | ACCESS_READ, buf.result(), NULL);
if (index.result()->is_constant()) {
- cmp_mem_int(lir_cond_belowEqual, buf.result(), java_nio_Buffer::limit_offset(), index.result()->as_jint(), info);
+ cmp_mem_int(lir_cond_belowEqual, buf_obj, java_nio_Buffer::limit_offset(), index.result()->as_jint(), info);
__ branch(lir_cond_belowEqual, T_INT, stub);
} else {
- cmp_reg_mem(lir_cond_aboveEqual, index.result(), buf.result(),
+ cmp_reg_mem(lir_cond_aboveEqual, index.result(), buf_obj,
java_nio_Buffer::limit_offset(), T_INT, info);
__ branch(lir_cond_aboveEqual, T_INT, stub);
}
__ move(index.result(), result);
} else {
< prev index next >