src/cpu/x86/vm/c1_LIRGenerator_x86.cpp

Print this page
rev 4136 : 7153771: array bound check elimination for c1
Summary: when possible optimize out array bound checks, inserting predicates when needed.
Reviewed-by:

*** 261,271 **** //---------------------------------------------------------------------- void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { assert(x->is_pinned(),""); ! bool needs_range_check = true; 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 && (x->value()->as_Constant() == NULL || !get_jobject_constant(x->value())->is_null_object() || x->should_profile()); --- 261,271 ---- //---------------------------------------------------------------------- void LIRGenerator::do_StoreIndexed(StoreIndexed* x) { assert(x->is_pinned(),""); ! 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 && (x->value()->as_Constant() == NULL || !get_jobject_constant(x->value())->is_null_object() || x->should_profile());
*** 276,291 **** LIRItem length(this); array.load_item(); index.load_nonconstant(); ! if (use_length) { ! needs_range_check = x->compute_needs_range_check(); ! if (needs_range_check) { length.set_instruction(x->length()); length.load_item(); ! } } if (needs_store_check) { value.load_item(); } else { value.load_for_store(x->elt_type()); --- 276,289 ---- LIRItem length(this); array.load_item(); index.load_nonconstant(); ! if (use_length && needs_range_check) { length.set_instruction(x->length()); length.load_item(); ! } if (needs_store_check) { value.load_item(); } else { value.load_for_store(x->elt_type());