hotspot/src/share/vm/c1/c1_ValueMap.hpp
changeset 16611 6807a703dd6b
parent 13963 e5b53c306fb5
child 17011 def8879c5b81
equal deleted inserted replaced
16381:806d87cb0cc7 16611:6807a703dd6b
   204   void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) { /* nothing to do */ }
   204   void do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) { /* nothing to do */ }
   205   void do_ProfileCall    (ProfileCall*     x) { /* nothing to do */ }
   205   void do_ProfileCall    (ProfileCall*     x) { /* nothing to do */ }
   206   void do_ProfileInvoke  (ProfileInvoke*   x) { /* nothing to do */ };
   206   void do_ProfileInvoke  (ProfileInvoke*   x) { /* nothing to do */ };
   207   void do_RuntimeCall    (RuntimeCall*     x) { /* nothing to do */ };
   207   void do_RuntimeCall    (RuntimeCall*     x) { /* nothing to do */ };
   208   void do_MemBar         (MemBar*          x) { /* nothing to do */ };
   208   void do_MemBar         (MemBar*          x) { /* nothing to do */ };
       
   209   void do_RangeCheckPredicate(RangeCheckPredicate* x) { /* nothing to do */ };
       
   210   void do_Assert         (Assert*          x) { /* nothing to do */ };
   209 };
   211 };
   210 
   212 
   211 
   213 
   212 class ValueNumberingEffects: public ValueNumberingVisitor {
   214 class ValueNumberingEffects: public ValueNumberingVisitor {
   213  private:
   215  private:
   223 };
   225 };
   224 
   226 
   225 
   227 
   226 class GlobalValueNumbering: public ValueNumberingVisitor {
   228 class GlobalValueNumbering: public ValueNumberingVisitor {
   227  private:
   229  private:
       
   230   Compilation*  _compilation;     // compilation data
   228   ValueMap*     _current_map;     // value map of current block
   231   ValueMap*     _current_map;     // value map of current block
   229   ValueMapArray _value_maps;      // list of value maps for all blocks
   232   ValueMapArray _value_maps;      // list of value maps for all blocks
       
   233   ValueSet      _processed_values;  // marker for instructions that were already processed
       
   234   bool          _has_substitutions; // set to true when substitutions must be resolved
   230 
   235 
   231  public:
   236  public:
   232   // accessors
   237   // accessors
       
   238   Compilation*  compilation() const              { return _compilation; }
   233   ValueMap*     current_map()                    { return _current_map; }
   239   ValueMap*     current_map()                    { return _current_map; }
   234   ValueMap*     value_map_of(BlockBegin* block)  { return _value_maps.at(block->linear_scan_number()); }
   240   ValueMap*     value_map_of(BlockBegin* block)  { return _value_maps.at(block->linear_scan_number()); }
   235   void          set_value_map_of(BlockBegin* block, ValueMap* map)   { assert(value_map_of(block) == NULL, ""); _value_maps.at_put(block->linear_scan_number(), map); }
   241   void          set_value_map_of(BlockBegin* block, ValueMap* map)   { assert(value_map_of(block) == NULL, ""); _value_maps.at_put(block->linear_scan_number(), map); }
       
   242 
       
   243   bool          is_processed(Value v)            { return _processed_values.contains(v); }
       
   244   void          set_processed(Value v)           { _processed_values.put(v); }
   236 
   245 
   237   // implementation for abstract methods of ValueNumberingVisitor
   246   // implementation for abstract methods of ValueNumberingVisitor
   238   void          kill_memory()                                 { current_map()->kill_memory(); }
   247   void          kill_memory()                                 { current_map()->kill_memory(); }
   239   void          kill_field(ciField* field, bool all_offsets)  { current_map()->kill_field(field, all_offsets); }
   248   void          kill_field(ciField* field, bool all_offsets)  { current_map()->kill_field(field, all_offsets); }
   240   void          kill_array(ValueType* type)                   { current_map()->kill_array(type); }
   249   void          kill_array(ValueType* type)                   { current_map()->kill_array(type); }
   241 
   250 
   242   // main entry point that performs global value numbering
   251   // main entry point that performs global value numbering
   243   GlobalValueNumbering(IR* ir);
   252   GlobalValueNumbering(IR* ir);
       
   253   void          substitute(Instruction* instr);  // substitute instruction if it is contained in current value map
   244 };
   254 };
   245 
   255 
   246 #endif // SHARE_VM_C1_C1_VALUEMAP_HPP
   256 #endif // SHARE_VM_C1_C1_VALUEMAP_HPP