< prev index next >
src/hotspot/share/opto/loopnode.cpp
Print this page
*** 4663,4682 ****
}
}
}
}
tty->cr();
! int ct = 0;
! Node *dbg_legal = LCA;
! while(!dbg_legal->is_Start() && ct < 100) {
! tty->print("idom[%d] ",ct); dbg_legal->dump();
! ct++;
! dbg_legal = idom(dbg_legal);
! }
tty->cr();
}
! #endif
#ifndef PRODUCT
//------------------------------dump-------------------------------------------
void PhaseIdealLoop::dump() const {
ResourceMark rm;
--- 4663,4747 ----
}
}
}
}
tty->cr();
! tty->print_cr("idoms of early %d:", early->_idx);
! dump_idom(early);
! tty->cr();
! tty->print_cr("idoms of (wrong) LCA %d:", LCA->_idx);
! dump_idom(LCA);
! tty->cr();
! dump_real_LCA(early, LCA);
tty->cr();
}
!
! // Find the real LCA of early and the wrongly assumed LCA.
! void PhaseIdealLoop::dump_real_LCA(Node* early, Node* wrong_lca) {
! assert(!is_dominator(early, wrong_lca) && !is_dominator(early, wrong_lca),
! "sanity check that one node does not dominate the other");
! assert(!has_ctrl(early) && !has_ctrl(wrong_lca), "sanity check, no data nodes");
!
! ResourceMark rm;
! Node_List nodes_seen;
! Node* real_LCA = NULL;
! Node* n1 = wrong_lca;
! Node* n2 = early;
! uint count_1 = 0;
! uint count_2 = 0;
! // Add early and wrong_lca to simplify calculation of idom indices
! nodes_seen.push(n1);
! nodes_seen.push(n2);
!
! // Walk the idom chain up from early and wrong_lca and stop when they intersect.
! while (!n1->is_Start() && !n2->is_Start()) {
! n1 = idom(n1);
! n2 = idom(n2);
! if (n1 == n2) {
! // Both idom chains intersect at the same index
! real_LCA = n1;
! count_1 = nodes_seen.size() / 2;
! count_2 = count_1;
! break;
! }
! if (check_idom_chains_intersection(n1, count_1, count_2, &nodes_seen)) {
! real_LCA = n1;
! break;
! }
! if (check_idom_chains_intersection(n2, count_2, count_1, &nodes_seen)) {
! real_LCA = n2;
! break;
! }
! nodes_seen.push(n1);
! nodes_seen.push(n2);
! }
!
! assert(real_LCA != NULL, "must always find an LCA");
! tty->print_cr("Real LCA of early %d (idom[%d]) and (wrong) LCA %d (idom[%d]):", early->_idx, count_2, wrong_lca->_idx, count_1);
! real_LCA->dump();
! }
!
! // Check if n is already on nodes_seen (i.e. idom chains of early and wrong_lca intersect at n). Determine the idom index of n
! // on both idom chains and return them in idom_idx_new and idom_idx_other, respectively.
! bool PhaseIdealLoop::check_idom_chains_intersection(const Node* n, uint& idom_idx_new, uint& idom_idx_other, const Node_List* nodes_seen) const {
! if (nodes_seen->contains(n)) {
! // The idom chain has just discovered n.
! // Divide by 2 because nodes_seen contains the same amount of nodes from both chains.
! idom_idx_new = nodes_seen->size() / 2;
!
! // The other chain already contained n. Search the index.
! for (uint i = 0; i < nodes_seen->size(); i++) {
! if (nodes_seen->at(i) == n) {
! // Divide by 2 because nodes_seen contains the same amount of nodes from both chains.
! idom_idx_other = i / 2;
! }
! }
! return true;
! }
! return false;
! }
! #endif // ASSERT
#ifndef PRODUCT
//------------------------------dump-------------------------------------------
void PhaseIdealLoop::dump() const {
ResourceMark rm;
*** 4742,4752 ****
}
}
}
}
}
! #endif
// Collect a R-P-O for the whole CFG.
// Result list is in post-order (scan backwards for RPO)
void PhaseIdealLoop::rpo(Node* start, Node_Stack &stk, VectorSet &visited, Node_List &rpo_list) const {
stk.push(start, 0);
--- 4807,4829 ----
}
}
}
}
}
!
! void PhaseIdealLoop::dump_idom(Node* n) const {
! if (has_ctrl(n)) {
! tty->print_cr("No idom for data nodes");
! } else {
! for (int i = 0; i < 100 && !n->is_Start(); i++) {
! tty->print("idom[%d] ", i);
! n->dump();
! n = idom(n);
! }
! }
! }
! #endif // NOT PRODUCT
// Collect a R-P-O for the whole CFG.
// Result list is in post-order (scan backwards for RPO)
void PhaseIdealLoop::rpo(Node* start, Node_Stack &stk, VectorSet &visited, Node_List &rpo_list) const {
stk.push(start, 0);
< prev index next >