< prev index next >

src/hotspot/share/opto/loopPredicate.cpp

Print this page




 519 }
 520 
 521 //------------------------------Invariance-----------------------------------
 522 // Helper class for loop_predication_impl to compute invariance on the fly and
 523 // clone invariants.
 524 class Invariance : public StackObj {
 525   VectorSet _visited, _invariant;
 526   Node_Stack _stack;
 527   VectorSet _clone_visited;
 528   Node_List _old_new; // map of old to new (clone)
 529   IdealLoopTree* _lpt;
 530   PhaseIdealLoop* _phase;
 531 
 532   // Helper function to set up the invariance for invariance computation
 533   // If n is a known invariant, set up directly. Otherwise, look up the
 534   // the possibility to push n onto the stack for further processing.
 535   void visit(Node* use, Node* n) {
 536     if (_lpt->is_invariant(n)) { // known invariant
 537       _invariant.set(n->_idx);
 538     } else if (!n->is_CFG()) {
 539       if (n->Opcode() == Op_ShenandoahWriteBarrier) {
 540         return;
 541       }
 542       Node *n_ctrl = _phase->ctrl_or_self(n);
 543       Node *u_ctrl = _phase->ctrl_or_self(use); // self if use is a CFG
 544       if (_phase->is_dominator(n_ctrl, u_ctrl)) {
 545         _stack.push(n, n->in(0) == NULL ? 1 : 0);
 546       }
 547     }
 548   }
 549 
 550   // Compute invariance for "the_node" and (possibly) all its inputs recursively
 551   // on the fly
 552   void compute_invariance(Node* n) {
 553     assert(_visited.test(n->_idx), "must be");
 554     visit(n, n);
 555     while (_stack.is_nonempty()) {
 556       Node*  n = _stack.node();
 557       uint idx = _stack.index();
 558       if (idx == n->req()) { // all inputs are processed
 559         _stack.pop();
 560         // n is invariant if it's inputs are all invariant
 561         bool all_inputs_invariant = true;




 519 }
 520 
 521 //------------------------------Invariance-----------------------------------
 522 // Helper class for loop_predication_impl to compute invariance on the fly and
 523 // clone invariants.
 524 class Invariance : public StackObj {
 525   VectorSet _visited, _invariant;
 526   Node_Stack _stack;
 527   VectorSet _clone_visited;
 528   Node_List _old_new; // map of old to new (clone)
 529   IdealLoopTree* _lpt;
 530   PhaseIdealLoop* _phase;
 531 
 532   // Helper function to set up the invariance for invariance computation
 533   // If n is a known invariant, set up directly. Otherwise, look up the
 534   // the possibility to push n onto the stack for further processing.
 535   void visit(Node* use, Node* n) {
 536     if (_lpt->is_invariant(n)) { // known invariant
 537       _invariant.set(n->_idx);
 538     } else if (!n->is_CFG()) {



 539       Node *n_ctrl = _phase->ctrl_or_self(n);
 540       Node *u_ctrl = _phase->ctrl_or_self(use); // self if use is a CFG
 541       if (_phase->is_dominator(n_ctrl, u_ctrl)) {
 542         _stack.push(n, n->in(0) == NULL ? 1 : 0);
 543       }
 544     }
 545   }
 546 
 547   // Compute invariance for "the_node" and (possibly) all its inputs recursively
 548   // on the fly
 549   void compute_invariance(Node* n) {
 550     assert(_visited.test(n->_idx), "must be");
 551     visit(n, n);
 552     while (_stack.is_nonempty()) {
 553       Node*  n = _stack.node();
 554       uint idx = _stack.index();
 555       if (idx == n->req()) { // all inputs are processed
 556         _stack.pop();
 557         // n is invariant if it's inputs are all invariant
 558         bool all_inputs_invariant = true;


< prev index next >