< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page

*** 1646,1674 **** NULL, NULL); } } } ! void LIRGenerator::maybe_deopt_value_array_access(LIRItem& array, CodeEmitInfo* null_check_info, CodeEmitInfo* deopt_info) { ! LIR_Opr klass = new_register(T_METADATA); ! __ move(new LIR_Address(array.result(), oopDesc::klass_offset_in_bytes(), T_ADDRESS), klass, null_check_info); LIR_Opr layout = new_register(T_INT); ! __ move(new LIR_Address(klass, 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)); ! ! CodeStub* stub = new DeoptimizeStub(deopt_info, Deoptimization::Reason_unloaded, Deoptimization::Action_make_not_entrant); ! __ branch(lir_cond_equal, T_ILLEGAL, stub); } void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { assert(x->is_pinned(),""); ! bool is_flattened = x->array()->is_flattened_array(); bool needs_range_check = x->compute_needs_range_check(); bool use_length = x->length() != NULL; bool obj_store = x->elt_type() == T_ARRAY || x->elt_type() == T_OBJECT; ! bool needs_store_check = obj_store && !is_flattened && (x->value()->as_Constant() == NULL || !get_jobject_constant(x->value())->is_null_object() || x->should_profile()); LIRItem array(x->array(), this); --- 1646,1673 ---- NULL, NULL); } } } ! void LIRGenerator::check_flattened_array(LIRItem& array, CodeStub* slow_path) { ! 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); } void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { assert(x->is_pinned(),""); ! bool is_loaded_flattened_array = x->array()->is_loaded_flattened_array(); bool needs_range_check = x->compute_needs_range_check(); bool use_length = x->length() != NULL; bool obj_store = x->elt_type() == T_ARRAY || x->elt_type() == T_OBJECT; ! bool needs_store_check = obj_store && !is_loaded_flattened_array && (x->value()->as_Constant() == NULL || !get_jobject_constant(x->value())->is_null_object() || x->should_profile()); LIRItem array(x->array(), this);
*** 1680,1693 **** index.load_nonconstant(); if (use_length && needs_range_check) { length.set_instruction(x->length()); length.load_item(); - } ! if (needs_store_check || x->check_boolean() || is_flattened) { value.load_item(); } else { value.load_for_store(x->elt_type()); } --- 1679,1692 ---- index.load_nonconstant(); if (use_length && needs_range_check) { length.set_instruction(x->length()); length.load_item(); } ! if (needs_store_check || x->check_boolean() ! || is_loaded_flattened_array || x->array()->maybe_flattened_array()) { value.load_item(); } else { value.load_for_store(x->elt_type()); }
*** 1716,1744 **** if (GenerateArrayStoreCheck && needs_store_check) { CodeEmitInfo* store_check_info = new CodeEmitInfo(range_check_info); array_store_check(value.result(), array.result(), store_check_info, x->profiled_method(), x->profiled_bci()); } ! if (is_flattened) { ! if (x->array()->declared_type()->is_loaded()) { index.load_item(); access_flattened_array(false, array, index, value); - 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; if (x->check_boolean()) { decorators |= C1_MASK_BOOLEAN; } access_store_at(decorators, x->elt_type(), array, index.result(), value.result(), NULL, null_check_info); } void LIRGenerator::access_load_at(DecoratorSet decorators, BasicType type, LIRItem& base, LIR_Opr offset, LIR_Opr result, CodeEmitInfo* patch_info, CodeEmitInfo* load_emit_info) { --- 1715,1748 ---- if (GenerateArrayStoreCheck && needs_store_check) { CodeEmitInfo* store_check_info = new CodeEmitInfo(range_check_info); array_store_check(value.result(), array.result(), store_check_info, x->profiled_method(), x->profiled_bci()); } ! if (is_loaded_flattened_array) { index.load_item(); access_flattened_array(false, array, index, value); } else { ! StoreFlattenedArrayStub* slow_path = NULL; ! ! if (x->array()->maybe_flattened_array()) { ! // Check if we indeed have a flattened array ! index.load_item(); ! slow_path = new StoreFlattenedArrayStub(array.result(), index.result(), value.result(), state_for(x)); ! check_flattened_array(array, slow_path); } DecoratorSet decorators = IN_HEAP | IS_ARRAY; if (x->check_boolean()) { decorators |= C1_MASK_BOOLEAN; } access_store_at(decorators, x->elt_type(), array, index.result(), value.result(), NULL, null_check_info); + if (slow_path != NULL) { + __ branch_destination(slow_path->continuation()); + } + } } void LIRGenerator::access_load_at(DecoratorSet decorators, BasicType type, LIRItem& base, LIR_Opr offset, LIR_Opr result, CodeEmitInfo* patch_info, CodeEmitInfo* load_emit_info) {
*** 2038,2055 **** 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, --- 2042,2052 ---- 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)); ! check_flattened_array(array, slow_path); } DecoratorSet decorators = IN_HEAP | IS_ARRAY; access_load_at(decorators, x->elt_type(), array, index.result(), result,
< prev index next >