src/share/vm/opto/loopPredicate.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 7068051 Cdiff src/share/vm/opto/loopPredicate.cpp

src/share/vm/opto/loopPredicate.cpp

Print this page

        

*** 325,409 **** igvn->hash_delete(iff); iff->set_req(1, bol); return new_predicate_proj; } - //--------------------------move_predicate----------------------- - // Cut predicate from old place and move it to new. - ProjNode* PhaseIdealLoop::move_predicate(ProjNode* predicate_proj, Node* new_entry, - Deoptimization::DeoptReason reason, - PhaseIdealLoop* loop_phase, - PhaseIterGVN* igvn) { - assert(new_entry != NULL, "must be"); - assert(predicate_proj->in(0)->in(1)->in(1)->Opcode()==Op_Opaque1, "must be"); - IfNode* iff = predicate_proj->in(0)->as_If(); - Node* old_entry = iff->in(0); - // Cut predicate from old place. - Node* old = predicate_proj; - igvn->_worklist.push(old); - for (DUIterator_Last imin, i = old->last_outs(imin); i >= imin;) { - Node* use = old->last_out(i); // for each use... - igvn->hash_delete(use); - igvn->_worklist.push(use); - // Update use-def info - uint uses_found = 0; - for (uint j = 0; j < use->req(); j++) { - if (use->in(j) == old) { - use->set_req(j, old_entry); - uses_found++; - if (loop_phase != NULL) { - if (use->is_CFG()) { - // When called from beautify_loops() idom is not constructed yet. - if (loop_phase->_idom != NULL) - loop_phase->set_idom(use, old_entry, loop_phase->dom_depth(use)); - } else { - loop_phase->set_ctrl(use, old_entry); - } - } - } - } - i -= uses_found; // we deleted 1 or more copies of this edge - } - - // Move predicate. - igvn->hash_delete(iff); - iff->set_req(0, new_entry); - igvn->_worklist.push(iff); - - if (loop_phase != NULL) { - // Fix up idom and ctrl. - loop_phase->set_ctrl(iff->in(1), new_entry); - loop_phase->set_ctrl(iff->in(1)->in(1), new_entry); - // When called from beautify_loops() idom is not constructed yet. - if (loop_phase->_idom != NULL) - loop_phase->set_idom(iff, new_entry, loop_phase->dom_depth(iff)); - } - - return predicate_proj; - } - //--------------------------clone_loop_predicates----------------------- // Interface from IGVN Node* PhaseIterGVN::clone_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check) { ! return PhaseIdealLoop::clone_loop_predicates(old_entry, new_entry, false, clone_limit_check, NULL, this); } - Node* PhaseIterGVN::move_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check) { - return PhaseIdealLoop::clone_loop_predicates(old_entry, new_entry, true, clone_limit_check, NULL, this); - } // Interface from PhaseIdealLoop Node* PhaseIdealLoop::clone_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check) { ! return clone_loop_predicates(old_entry, new_entry, false, clone_limit_check, this, &this->_igvn); } - Node* PhaseIdealLoop::move_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check) { - return clone_loop_predicates(old_entry, new_entry, true, clone_limit_check, this, &this->_igvn); - } // Clone loop predicates to cloned loops (peeled, unswitched, split_if). Node* PhaseIdealLoop::clone_loop_predicates(Node* old_entry, Node* new_entry, - bool move_predicates, bool clone_limit_check, PhaseIdealLoop* loop_phase, PhaseIterGVN* igvn) { #ifdef ASSERT if (new_entry == NULL || !(new_entry->is_Proj() || new_entry->is_Region() || new_entry->is_SafePoint())) { --- 325,348 ---- igvn->hash_delete(iff); iff->set_req(1, bol); return new_predicate_proj; } //--------------------------clone_loop_predicates----------------------- // Interface from IGVN Node* PhaseIterGVN::clone_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check) { ! return PhaseIdealLoop::clone_loop_predicates(old_entry, new_entry, clone_limit_check, NULL, this); } // Interface from PhaseIdealLoop Node* PhaseIdealLoop::clone_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check) { ! return clone_loop_predicates(old_entry, new_entry, clone_limit_check, this, &this->_igvn); } // Clone loop predicates to cloned loops (peeled, unswitched, split_if). Node* PhaseIdealLoop::clone_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check, PhaseIdealLoop* loop_phase, PhaseIterGVN* igvn) { #ifdef ASSERT if (new_entry == NULL || !(new_entry->is_Proj() || new_entry->is_Region() || new_entry->is_SafePoint())) {
*** 422,492 **** } } if (UseLoopPredicate) { ProjNode* predicate_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate); if (predicate_proj != NULL) { // right pattern that can be used by loop predication - if (move_predicates) { - new_entry = move_predicate(predicate_proj, new_entry, - Deoptimization::Reason_predicate, - loop_phase, igvn); - assert(new_entry == predicate_proj, "old predicate fall through projection"); - } else { // clone predicate new_entry = clone_predicate(predicate_proj, new_entry, Deoptimization::Reason_predicate, loop_phase, igvn); assert(new_entry != NULL && new_entry->is_Proj(), "IfTrue or IfFalse after clone predicate"); - } if (TraceLoopPredicate) { ! tty->print_cr("Loop Predicate %s: ", move_predicates ? "moved" : "cloned"); debug_only( new_entry->in(0)->dump(); ) } } } if (limit_check_proj != NULL && clone_limit_check) { // Clone loop limit check last to insert it before loop. // Don't clone a limit check which was already finalized // for this counted loop (only one limit check is needed). - if (move_predicates) { - new_entry = move_predicate(limit_check_proj, new_entry, - Deoptimization::Reason_loop_limit_check, - loop_phase, igvn); - assert(new_entry == limit_check_proj, "old limit check fall through projection"); - } else { new_entry = clone_predicate(limit_check_proj, new_entry, Deoptimization::Reason_loop_limit_check, loop_phase, igvn); assert(new_entry != NULL && new_entry->is_Proj(), "IfTrue or IfFalse after clone limit check"); - } if (TraceLoopLimitCheck) { ! tty->print_cr("Loop Limit Check %s: ", move_predicates ? "moved" : "cloned"); debug_only( new_entry->in(0)->dump(); ) } } return new_entry; } - //--------------------------eliminate_loop_predicates----------------------- - void PhaseIdealLoop::eliminate_loop_predicates(Node* entry) { - if (LoopLimitCheck) { - Node* predicate = find_predicate_insertion_point(entry, Deoptimization::Reason_loop_limit_check); - if (predicate != NULL) { - entry = entry->in(0)->in(0); - } - } - if (UseLoopPredicate) { - ProjNode* predicate_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate); - if (predicate_proj != NULL) { // right pattern that can be used by loop predication - Node* n = entry->in(0)->in(1)->in(1); - assert(n->Opcode()==Op_Opaque1, "must be"); - // Remove Opaque1 node from predicates list. - // IGVN will remove this predicate check. - _igvn.replace_node(n, n->in(1)); - } - } - } - //--------------------------skip_loop_predicates------------------------------ // Skip related predicates. Node* PhaseIdealLoop::skip_loop_predicates(Node* entry) { Node* predicate = NULL; if (LoopLimitCheck) { --- 361,397 ---- } } if (UseLoopPredicate) { ProjNode* predicate_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate); if (predicate_proj != NULL) { // right pattern that can be used by loop predication // clone predicate new_entry = clone_predicate(predicate_proj, new_entry, Deoptimization::Reason_predicate, loop_phase, igvn); assert(new_entry != NULL && new_entry->is_Proj(), "IfTrue or IfFalse after clone predicate"); if (TraceLoopPredicate) { ! tty->print("Loop Predicate cloned: "); debug_only( new_entry->in(0)->dump(); ) } } } if (limit_check_proj != NULL && clone_limit_check) { // Clone loop limit check last to insert it before loop. // Don't clone a limit check which was already finalized // for this counted loop (only one limit check is needed). new_entry = clone_predicate(limit_check_proj, new_entry, Deoptimization::Reason_loop_limit_check, loop_phase, igvn); assert(new_entry != NULL && new_entry->is_Proj(), "IfTrue or IfFalse after clone limit check"); if (TraceLoopLimitCheck) { ! tty->print("Loop Limit Check cloned: "); debug_only( new_entry->in(0)->dump(); ) } } return new_entry; } //--------------------------skip_loop_predicates------------------------------ // Skip related predicates. Node* PhaseIdealLoop::skip_loop_predicates(Node* entry) { Node* predicate = NULL; if (LoopLimitCheck) {
src/share/vm/opto/loopPredicate.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File