< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page

*** 1985,1995 **** length.set_instruction(x->length()); length.load_item(); } array.load_item(); ! if (index.is_constant() && can_inline_as_constant(x->index())) { // let it be a constant index.dont_load_item(); } else { index.load_item(); } --- 1985,1996 ---- length.set_instruction(x->length()); length.load_item(); } array.load_item(); ! if (index.is_constant() && can_inline_as_constant(x->index()) ! && !x->array()->maybe_flattened_array()) { // let it be a constant index.dont_load_item(); } else { index.load_item(); }
*** 2023,2052 **** // The range check performs the null check, so clear it out for the load null_check_info = NULL; } } ! if (x->array()->is_flattened_array()) { ! if (x->array()->declared_type()->is_loaded()) { // Find the destination address (of the NewValueTypeInstance) LIR_Opr obj = x->vt()->operand(); LIRItem obj_item(x->vt(), this); access_flattened_array(true, array, index, obj_item); set_no_result(x); - return; } else { ! // If the array is indeed flattened, deopt. Otherwise access it as a normal object array. ! CodeEmitInfo* deopt_info = state_for(x, x->state_before()); ! maybe_deopt_value_array_access(array, null_check_info, deopt_info); ! } } DecoratorSet decorators = IN_HEAP | IS_ARRAY; - LIR_Opr result = rlock_result(x, x->elt_type()); access_load_at(decorators, x->elt_type(), array, index.result(), result, NULL, null_check_info); } void LIRGenerator::do_NullCheck(NullCheck* x) { if (x->can_trap()) { --- 2024,2066 ---- // The range check performs the null check, so clear it out for the load null_check_info = NULL; } } ! if (x->array()->is_loaded_flattened_array()) { // Find the destination address (of the NewValueTypeInstance) LIR_Opr obj = x->vt()->operand(); LIRItem obj_item(x->vt(), this); access_flattened_array(true, array, index, obj_item); set_no_result(x); } else { ! LIR_Opr result = rlock_result(x, x->elt_type()); ! LoadFlattenedArrayStub* slow_path = NULL; ! ! if (x->array()->maybe_flattened_array()) { ! // Check if we indeed have a flattened array ! slow_path = new LoadFlattenedArrayStub(array.result(), index.result(), result, state_for(x)); ! LIR_Opr array_klass_reg = new_register(T_METADATA); ! ! __ move(new LIR_Address(array.result(), oopDesc::klass_offset_in_bytes(), T_ADDRESS), array_klass_reg); ! LIR_Opr layout = new_register(T_INT); ! __ move(new LIR_Address(array_klass_reg, in_bytes(Klass::layout_helper_offset()), T_INT), layout); ! __ shift_right(layout, Klass::_lh_array_tag_shift, layout); ! __ cmp(lir_cond_equal, layout, LIR_OprFact::intConst(Klass::_lh_array_tag_vt_value)); ! __ branch(lir_cond_equal, T_ILLEGAL, slow_path); } + DecoratorSet decorators = IN_HEAP | IS_ARRAY; access_load_at(decorators, x->elt_type(), array, index.result(), result, NULL, null_check_info); + + if (slow_path != NULL) { + __ branch_destination(slow_path->continuation()); + } + } } void LIRGenerator::do_NullCheck(NullCheck* x) { if (x->can_trap()) {
< prev index next >