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,11 +261,11 @@
 //----------------------------------------------------------------------
 
 
 void LIRGenerator::do_StoreIndexed(StoreIndexed* x) {
   assert(x->is_pinned(),"");
-  bool needs_range_check = true;
+  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,16 +276,14 @@
   LIRItem length(this);
 
   array.load_item();
   index.load_nonconstant();
 
-  if (use_length) {
-    needs_range_check = x->compute_needs_range_check();
-    if (needs_range_check) {
+  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());