1.1 --- a/src/share/vm/c1/c1_ValueMap.cpp Tue Apr 09 09:54:17 2013 -0700 1.2 +++ b/src/share/vm/c1/c1_ValueMap.cpp Wed Apr 10 09:52:49 2013 +0200 1.3 @@ -316,6 +316,7 @@ 1.4 ShortLoopOptimizer* _short_loop_optimizer; 1.5 Instruction* _insertion_point; 1.6 ValueStack * _state; 1.7 + bool _insert_is_pred; 1.8 1.9 void set_invariant(Value v) const { _gvn->set_processed(v); } 1.10 bool is_invariant(Value v) const { return _gvn->is_processed(v); } 1.11 @@ -339,6 +340,7 @@ 1.12 1.13 assert(insertion_block->end()->as_Base() == NULL, "cannot insert into entry block"); 1.14 _insertion_point = insertion_block->end()->prev(); 1.15 + _insert_is_pred = loop_header->is_predecessor(insertion_block); 1.16 1.17 BlockEnd *block_end = insertion_block->end(); 1.18 _state = block_end->state_before(); 1.19 @@ -379,13 +381,13 @@ 1.20 } else if (cur->as_LoadField() != NULL) { 1.21 LoadField* lf = (LoadField*)cur; 1.22 // deoptimizes on NullPointerException 1.23 - cur_invariant = !lf->needs_patching() && !lf->field()->is_volatile() && !_short_loop_optimizer->has_field_store(lf->field()->type()->basic_type()) && is_invariant(lf->obj()); 1.24 + cur_invariant = !lf->needs_patching() && !lf->field()->is_volatile() && !_short_loop_optimizer->has_field_store(lf->field()->type()->basic_type()) && is_invariant(lf->obj()) && _insert_is_pred; 1.25 } else if (cur->as_ArrayLength() != NULL) { 1.26 ArrayLength *length = cur->as_ArrayLength(); 1.27 cur_invariant = is_invariant(length->array()); 1.28 } else if (cur->as_LoadIndexed() != NULL) { 1.29 LoadIndexed *li = (LoadIndexed *)cur->as_LoadIndexed(); 1.30 - cur_invariant = !_short_loop_optimizer->has_indexed_store(as_BasicType(cur->type())) && is_invariant(li->array()) && is_invariant(li->index()); 1.31 + cur_invariant = !_short_loop_optimizer->has_indexed_store(as_BasicType(cur->type())) && is_invariant(li->array()) && is_invariant(li->index()) && _insert_is_pred; 1.32 } 1.33 1.34 if (cur_invariant) {