< prev index next >

src/share/vm/opto/node.hpp

Print this page




 336     Node** out = _out;
 337     // Assign a limit pointer to the reference argument:
 338     max = out + (ptrdiff_t)_outcnt;
 339     // Return the base pointer:
 340     return out;
 341   }
 342   Node*    fast_out(DUIterator_Fast i) const  { return *i; }
 343   // Iterate over the out-edges of this node, deleting one at a time.
 344   // This iteration uses a pointer internal to the out array.
 345   DUIterator_Last last_outs(DUIterator_Last& min) const {
 346     Node** out = _out;
 347     // Assign a limit pointer to the reference argument:
 348     min = out;
 349     // Return the pointer to the start of the iteration:
 350     return out + (ptrdiff_t)_outcnt - 1;
 351   }
 352   Node*    last_out(DUIterator_Last i) const  { return *i; }
 353 #endif
 354 
 355   // Reference to the i'th input Node.  Error if out of bounds.
 356   Node* in(uint i) const { assert(i < _max, err_msg_res("oob: i=%d, _max=%d", i, _max)); return _in[i]; }
 357   // Reference to the i'th input Node.  NULL if out of bounds.
 358   Node* lookup(uint i) const { return ((i < _max) ? _in[i] : NULL); }
 359   // Reference to the i'th output Node.  Error if out of bounds.
 360   // Use this accessor sparingly.  We are going trying to use iterators instead.
 361   Node* raw_out(uint i) const { assert(i < _outcnt,"oob"); return _out[i]; }
 362   // Return the unique out edge.
 363   Node* unique_out() const { assert(_outcnt==1,"not unique"); return _out[0]; }
 364   // Delete out edge at position 'i' by moving last out edge to position 'i'
 365   void  raw_del_out(uint i) {
 366     assert(i < _outcnt,"oob");
 367     assert(_outcnt > 0,"oob");
 368     #if OPTO_DU_ITERATOR_ASSERT
 369     // Record that a change happened here.
 370     debug_only(_last_del = _out[i]; ++_del_tick);
 371     #endif
 372     _out[i] = _out[--_outcnt];
 373     // Smash the old edge so it can't be used accidentally.
 374     debug_only(_out[_outcnt] = (Node *)(uintptr_t)0xdeadbeef);
 375   }
 376 
 377 #ifdef ASSERT
 378   bool is_dead() const;
 379 #define is_not_dead(n) ((n) == NULL || !VerifyIterativeGVN || !((n)->is_dead()))
 380 #endif
 381   // Check whether node has become unreachable
 382   bool is_unreachable(PhaseIterGVN &igvn) const;
 383 
 384   // Set a required input edge, also updates corresponding output edge
 385   void add_req( Node *n ); // Append a NEW required input
 386   void add_req( Node *n0, Node *n1 ) {
 387     add_req(n0); add_req(n1); }
 388   void add_req( Node *n0, Node *n1, Node *n2 ) {
 389     add_req(n0); add_req(n1); add_req(n2); }
 390   void add_req_batch( Node* n, uint m ); // Append m NEW required inputs (all n).
 391   void del_req( uint idx ); // Delete required edge & compact
 392   void del_req_ordered( uint idx ); // Delete required edge & compact with preserved order
 393   void ins_req( uint i, Node *n ); // Insert a NEW required input
 394   void set_req( uint i, Node *n ) {
 395     assert( is_not_dead(n), "can not use dead node");
 396     assert( i < _cnt, err_msg_res("oob: i=%d, _cnt=%d", i, _cnt));
 397     assert( !VerifyHashTableKeys || _hash_lock == 0,
 398             "remove node from hash table before modifying it");
 399     Node** p = &_in[i];    // cache this._in, across the del_out call
 400     if (*p != NULL)  (*p)->del_out((Node *)this);
 401     (*p) = n;
 402     if (n != NULL)      n->add_out((Node *)this);
 403     Compile::current()->record_modified_node(this);
 404   }
 405   // Light version of set_req() to init inputs after node creation.
 406   void init_req( uint i, Node *n ) {
 407     assert( i == 0 && this == n ||
 408             is_not_dead(n), "can not use dead node");
 409     assert( i < _cnt, "oob");
 410     assert( !VerifyHashTableKeys || _hash_lock == 0,
 411             "remove node from hash table before modifying it");
 412     assert( _in[i] == NULL, "sanity");
 413     _in[i] = n;
 414     if (n != NULL)      n->add_out((Node *)this);
 415     Compile::current()->record_modified_node(this);
 416   }




 336     Node** out = _out;
 337     // Assign a limit pointer to the reference argument:
 338     max = out + (ptrdiff_t)_outcnt;
 339     // Return the base pointer:
 340     return out;
 341   }
 342   Node*    fast_out(DUIterator_Fast i) const  { return *i; }
 343   // Iterate over the out-edges of this node, deleting one at a time.
 344   // This iteration uses a pointer internal to the out array.
 345   DUIterator_Last last_outs(DUIterator_Last& min) const {
 346     Node** out = _out;
 347     // Assign a limit pointer to the reference argument:
 348     min = out;
 349     // Return the pointer to the start of the iteration:
 350     return out + (ptrdiff_t)_outcnt - 1;
 351   }
 352   Node*    last_out(DUIterator_Last i) const  { return *i; }
 353 #endif
 354 
 355   // Reference to the i'th input Node.  Error if out of bounds.
 356   Node* in(uint i) const { assert(i < _max, "oob: i=%d, _max=%d", i, _max); return _in[i]; }
 357   // Reference to the i'th input Node.  NULL if out of bounds.
 358   Node* lookup(uint i) const { return ((i < _max) ? _in[i] : NULL); }
 359   // Reference to the i'th output Node.  Error if out of bounds.
 360   // Use this accessor sparingly.  We are going trying to use iterators instead.
 361   Node* raw_out(uint i) const { assert(i < _outcnt,"oob"); return _out[i]; }
 362   // Return the unique out edge.
 363   Node* unique_out() const { assert(_outcnt==1,"not unique"); return _out[0]; }
 364   // Delete out edge at position 'i' by moving last out edge to position 'i'
 365   void  raw_del_out(uint i) {
 366     assert(i < _outcnt,"oob");
 367     assert(_outcnt > 0,"oob");
 368     #if OPTO_DU_ITERATOR_ASSERT
 369     // Record that a change happened here.
 370     debug_only(_last_del = _out[i]; ++_del_tick);
 371     #endif
 372     _out[i] = _out[--_outcnt];
 373     // Smash the old edge so it can't be used accidentally.
 374     debug_only(_out[_outcnt] = (Node *)(uintptr_t)0xdeadbeef);
 375   }
 376 
 377 #ifdef ASSERT
 378   bool is_dead() const;
 379 #define is_not_dead(n) ((n) == NULL || !VerifyIterativeGVN || !((n)->is_dead()))
 380 #endif
 381   // Check whether node has become unreachable
 382   bool is_unreachable(PhaseIterGVN &igvn) const;
 383 
 384   // Set a required input edge, also updates corresponding output edge
 385   void add_req( Node *n ); // Append a NEW required input
 386   void add_req( Node *n0, Node *n1 ) {
 387     add_req(n0); add_req(n1); }
 388   void add_req( Node *n0, Node *n1, Node *n2 ) {
 389     add_req(n0); add_req(n1); add_req(n2); }
 390   void add_req_batch( Node* n, uint m ); // Append m NEW required inputs (all n).
 391   void del_req( uint idx ); // Delete required edge & compact
 392   void del_req_ordered( uint idx ); // Delete required edge & compact with preserved order
 393   void ins_req( uint i, Node *n ); // Insert a NEW required input
 394   void set_req( uint i, Node *n ) {
 395     assert( is_not_dead(n), "can not use dead node");
 396     assert( i < _cnt, "oob: i=%d, _cnt=%d", i, _cnt);
 397     assert( !VerifyHashTableKeys || _hash_lock == 0,
 398             "remove node from hash table before modifying it");
 399     Node** p = &_in[i];    // cache this._in, across the del_out call
 400     if (*p != NULL)  (*p)->del_out((Node *)this);
 401     (*p) = n;
 402     if (n != NULL)      n->add_out((Node *)this);
 403     Compile::current()->record_modified_node(this);
 404   }
 405   // Light version of set_req() to init inputs after node creation.
 406   void init_req( uint i, Node *n ) {
 407     assert( i == 0 && this == n ||
 408             is_not_dead(n), "can not use dead node");
 409     assert( i < _cnt, "oob");
 410     assert( !VerifyHashTableKeys || _hash_lock == 0,
 411             "remove node from hash table before modifying it");
 412     assert( _in[i] == NULL, "sanity");
 413     _in[i] = n;
 414     if (n != NULL)      n->add_out((Node *)this);
 415     Compile::current()->record_modified_node(this);
 416   }


< prev index next >