hotspot/src/share/vm/opto/lcm.cpp
changeset 961 7fb3b13d4205
parent 670 ddf3e9583f2f
child 1388 3677f5f3d66b
child 1136 9f6351874414
equal deleted inserted replaced
960:ca698c8e5917 961:7fb3b13d4205
   320   }
   320   }
   321 
   321 
   322   uint choice  = 0; // Bigger is most important
   322   uint choice  = 0; // Bigger is most important
   323   uint latency = 0; // Bigger is scheduled first
   323   uint latency = 0; // Bigger is scheduled first
   324   uint score   = 0; // Bigger is better
   324   uint score   = 0; // Bigger is better
   325   uint idx;         // Index in worklist
   325   int idx = -1;     // Index in worklist
   326 
   326 
   327   for( uint i=0; i<cnt; i++ ) { // Inspect entire worklist
   327   for( uint i=0; i<cnt; i++ ) { // Inspect entire worklist
   328     // Order in worklist is used to break ties.
   328     // Order in worklist is used to break ties.
   329     // See caller for how this is used to delay scheduling
   329     // See caller for how this is used to delay scheduling
   330     // of induction variable increments to after the other
   330     // of induction variable increments to after the other
   410       score   = n_score;
   410       score   = n_score;
   411       idx     = i;               // Also keep index in worklist
   411       idx     = i;               // Also keep index in worklist
   412     }
   412     }
   413   } // End of for all ready nodes in worklist
   413   } // End of for all ready nodes in worklist
   414 
   414 
   415   Node *n = worklist[idx];      // Get the winner
   415   assert(idx >= 0, "index should be set");
   416 
   416   Node *n = worklist[(uint)idx];      // Get the winner
   417   worklist.map(idx,worklist.pop());     // Compress worklist
   417 
       
   418   worklist.map((uint)idx, worklist.pop());     // Compress worklist
   418   return n;
   419   return n;
   419 }
   420 }
   420 
   421 
   421 
   422 
   422 //------------------------------set_next_call----------------------------------
   423 //------------------------------set_next_call----------------------------------
   597           n->del_req(n->req() - 1);
   598           n->del_req(n->req() - 1);
   598           n->add_prec(oop_store);
   599           n->add_prec(oop_store);
   599           assert(cfg->_bbs[oop_store->_idx]->_dom_depth <= this->_dom_depth, "oop_store must dominate card-mark");
   600           assert(cfg->_bbs[oop_store->_idx]->_dom_depth <= this->_dom_depth, "oop_store must dominate card-mark");
   600         }
   601         }
   601       }
   602       }
   602       if( n->is_Mach() && n->as_Mach()->ideal_Opcode() == Op_MemBarAcquire ) {
   603       if( n->is_Mach() && n->as_Mach()->ideal_Opcode() == Op_MemBarAcquire &&
       
   604           n->req() > TypeFunc::Parms ) {
       
   605         // MemBarAcquire could be created without Precedent edge.
       
   606         // del_req() replaces the specified edge with the last input edge
       
   607         // and then removes the last edge. If the specified edge > number of
       
   608         // edges the last edge will be moved outside of the input edges array
       
   609         // and the edge will be lost. This is why this code should be
       
   610         // executed only when Precedent (== TypeFunc::Parms) edge is present.
   603         Node *x = n->in(TypeFunc::Parms);
   611         Node *x = n->in(TypeFunc::Parms);
   604         n->del_req(TypeFunc::Parms);
   612         n->del_req(TypeFunc::Parms);
   605         n->add_prec(x);
   613         n->add_prec(x);
   606       }
   614       }
   607     }
   615     }