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);
|