Mercurial > hg > truffle
comparison src/share/vm/opto/lcm.cpp @ 253:b0fe4deeb9fb
6726999: nsk/stress/jck12a/jck12a010 assert(n != null,"Bad immediate dominator info.")
Summary: Escape Analysis fixes.
Reviewed-by: never, rasbold
author | kvn |
---|---|
date | Mon, 28 Jul 2008 17:12:52 -0700 |
parents | d1605aabd0a1 |
children | c792b641b8bd 1ee8caae33af |
comparison
equal
deleted
inserted
replaced
252:be7facf71163 | 253:b0fe4deeb9fb |
---|---|
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 } |