Wed, 22 Aug 2012 14:29:57 +0200
7171824: assert(_offset >= 1) failed: illegal call to offset()
Summary: C1 value numbering hits unloaded klass.
Reviewed-by: kvn, twisti
src/share/vm/c1/c1_ValueMap.cpp | file | annotate | diff | comparison | revisions | |
src/share/vm/c1/c1_ValueMap.hpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/c1/c1_ValueMap.cpp Tue Aug 21 14:50:02 2012 -0700 1.2 +++ b/src/share/vm/c1/c1_ValueMap.cpp Wed Aug 22 14:29:57 2012 +0200 1.3 @@ -190,7 +190,7 @@ 1.4 LoadField* lf = value->as_LoadField(); \ 1.5 bool must_kill = lf != NULL \ 1.6 && lf->field()->holder() == field->holder() \ 1.7 - && lf->field()->offset() == field->offset(); 1.8 + && (all_offsets || lf->field()->offset() == field->offset()); 1.9 1.10 #define MUST_KILL_EXCEPTION(must_kill, entry, value) \ 1.11 assert(entry->nesting() < nesting(), "must not find bigger nesting than current"); \ 1.12 @@ -205,7 +205,7 @@ 1.13 GENERIC_KILL_VALUE(MUST_KILL_ARRAY); 1.14 } 1.15 1.16 -void ValueMap::kill_field(ciField* field) { 1.17 +void ValueMap::kill_field(ciField* field, bool all_offsets) { 1.18 GENERIC_KILL_VALUE(MUST_KILL_FIELD); 1.19 } 1.20 1.21 @@ -280,9 +280,9 @@ 1.22 ValueMap* value_map_of(BlockBegin* block) { return _gvn->value_map_of(block); } 1.23 1.24 // implementation for abstract methods of ValueNumberingVisitor 1.25 - void kill_memory() { _too_complicated_loop = true; } 1.26 - void kill_field(ciField* field) { current_map()->kill_field(field); }; 1.27 - void kill_array(ValueType* type) { current_map()->kill_array(type); }; 1.28 + void kill_memory() { _too_complicated_loop = true; } 1.29 + void kill_field(ciField* field, bool all_offsets) { current_map()->kill_field(field, all_offsets); }; 1.30 + void kill_array(ValueType* type) { current_map()->kill_array(type); }; 1.31 1.32 public: 1.33 ShortLoopOptimizer(GlobalValueNumbering* gvn)
2.1 --- a/src/share/vm/c1/c1_ValueMap.hpp Tue Aug 21 14:50:02 2012 -0700 2.2 +++ b/src/share/vm/c1/c1_ValueMap.hpp Wed Aug 22 14:29:57 2012 +0200 2.3 @@ -114,7 +114,7 @@ 2.4 Value find_insert(Value x); 2.5 2.6 void kill_memory(); 2.7 - void kill_field(ciField* field); 2.8 + void kill_field(ciField* field, bool all_offsets); 2.9 void kill_array(ValueType* type); 2.10 void kill_exception(); 2.11 void kill_map(ValueMap* map); 2.12 @@ -136,7 +136,7 @@ 2.13 protected: 2.14 // called by visitor functions for instructions that kill values 2.15 virtual void kill_memory() = 0; 2.16 - virtual void kill_field(ciField* field) = 0; 2.17 + virtual void kill_field(ciField* field, bool all_offsets) = 0; 2.18 virtual void kill_array(ValueType* type) = 0; 2.19 2.20 // visitor functions 2.21 @@ -148,7 +148,7 @@ 2.22 x->field()->is_volatile()) { 2.23 kill_memory(); 2.24 } else { 2.25 - kill_field(x->field()); 2.26 + kill_field(x->field(), x->needs_patching()); 2.27 } 2.28 } 2.29 void do_StoreIndexed (StoreIndexed* x) { kill_array(x->type()); } 2.30 @@ -214,9 +214,9 @@ 2.31 2.32 public: 2.33 // implementation for abstract methods of ValueNumberingVisitor 2.34 - void kill_memory() { _map->kill_memory(); } 2.35 - void kill_field(ciField* field) { _map->kill_field(field); } 2.36 - void kill_array(ValueType* type) { _map->kill_array(type); } 2.37 + void kill_memory() { _map->kill_memory(); } 2.38 + void kill_field(ciField* field, bool all_offsets) { _map->kill_field(field, all_offsets); } 2.39 + void kill_array(ValueType* type) { _map->kill_array(type); } 2.40 2.41 ValueNumberingEffects(ValueMap* map): _map(map) {} 2.42 }; 2.43 @@ -234,9 +234,9 @@ 2.44 void set_value_map_of(BlockBegin* block, ValueMap* map) { assert(value_map_of(block) == NULL, ""); _value_maps.at_put(block->linear_scan_number(), map); } 2.45 2.46 // implementation for abstract methods of ValueNumberingVisitor 2.47 - void kill_memory() { current_map()->kill_memory(); } 2.48 - void kill_field(ciField* field) { current_map()->kill_field(field); } 2.49 - void kill_array(ValueType* type) { current_map()->kill_array(type); } 2.50 + void kill_memory() { current_map()->kill_memory(); } 2.51 + void kill_field(ciField* field, bool all_offsets) { current_map()->kill_field(field, all_offsets); } 2.52 + void kill_array(ValueType* type) { current_map()->kill_array(type); } 2.53 2.54 // main entry point that performs global value numbering 2.55 GlobalValueNumbering(IR* ir);