7171824: assert(_offset >= 1) failed: illegal call to offset()

Wed, 22 Aug 2012 14:29:57 +0200

author
roland
date
Wed, 22 Aug 2012 14:29:57 +0200
changeset 4005
0bfcb7a3e12d
parent 4004
4b0d6fd74911
child 4006
5af51c882207

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);

mercurial