< prev index next >

src/share/vm/opto/loopPredicate.cpp

Print this page




 424       Node*  n = _stack.node();
 425       uint idx = _stack.index();
 426       if (idx == n->req()) { // all inputs are processed
 427         _stack.pop();
 428         // n is invariant if it's inputs are all invariant
 429         bool all_inputs_invariant = true;
 430         for (uint i = 0; i < n->req(); i++) {
 431           Node* in = n->in(i);
 432           if (in == NULL) continue;
 433           assert(_visited.test(in->_idx), "must have visited input");
 434           if (!_invariant.test(in->_idx)) { // bad guy
 435             all_inputs_invariant = false;
 436             break;
 437           }
 438         }
 439         if (all_inputs_invariant) {
 440           // If n's control is a predicate that was moved out of the
 441           // loop, it was marked invariant but n is only invariant if
 442           // it depends only on that test. Otherwise, unless that test
 443           // is out of the loop, it's not invariant.
 444           if (n->is_CFG() || n->depends_only_on_test() || n->in(0) == NULL || !_phase->is_member(_lpt, n->in(0))) {
 445             _invariant.set(n->_idx); // I am a invariant too
 446           }
 447         }
 448       } else { // process next input
 449         _stack.set_index(idx + 1);
 450         Node* m = n->in(idx);
 451         if (m != NULL && !_visited.test_set(m->_idx)) {
 452           visit(n, m);
 453         }
 454       }
 455     }
 456   }
 457 
 458   // Helper function to set up _old_new map for clone_nodes.
 459   // If n is a known invariant, set up directly ("clone" of n == n).
 460   // Otherwise, push n onto the stack for real cloning.
 461   void clone_visit(Node* n) {
 462     assert(_invariant.test(n->_idx), "must be invariant");
 463     if (_lpt->is_invariant(n)) { // known invariant
 464       _old_new.map(n->_idx, n);




 424       Node*  n = _stack.node();
 425       uint idx = _stack.index();
 426       if (idx == n->req()) { // all inputs are processed
 427         _stack.pop();
 428         // n is invariant if it's inputs are all invariant
 429         bool all_inputs_invariant = true;
 430         for (uint i = 0; i < n->req(); i++) {
 431           Node* in = n->in(i);
 432           if (in == NULL) continue;
 433           assert(_visited.test(in->_idx), "must have visited input");
 434           if (!_invariant.test(in->_idx)) { // bad guy
 435             all_inputs_invariant = false;
 436             break;
 437           }
 438         }
 439         if (all_inputs_invariant) {
 440           // If n's control is a predicate that was moved out of the
 441           // loop, it was marked invariant but n is only invariant if
 442           // it depends only on that test. Otherwise, unless that test
 443           // is out of the loop, it's not invariant.
 444           if (n->Opcode() == Op_ShenandoahWBMemProj || n->is_CFG() || n->depends_only_on_test() || n->in(0) == NULL || !_phase->is_member(_lpt, n->in(0))) {
 445             _invariant.set(n->_idx); // I am a invariant too
 446           }
 447         }
 448       } else { // process next input
 449         _stack.set_index(idx + 1);
 450         Node* m = n->in(idx);
 451         if (m != NULL && !_visited.test_set(m->_idx)) {
 452           visit(n, m);
 453         }
 454       }
 455     }
 456   }
 457 
 458   // Helper function to set up _old_new map for clone_nodes.
 459   // If n is a known invariant, set up directly ("clone" of n == n).
 460   // Otherwise, push n onto the stack for real cloning.
 461   void clone_visit(Node* n) {
 462     assert(_invariant.test(n->_idx), "must be invariant");
 463     if (_lpt->is_invariant(n)) { // known invariant
 464       _old_new.map(n->_idx, n);


< prev index next >