提交 2d191657 编写于 作者: V vlivanov

8144935: C2: safepoint is pruned from a non-counted loop

Reviewed-by: roland
上级 77a3acc8
......@@ -1811,10 +1811,9 @@ void PhaseIdealLoop::replace_parallel_iv(IdealLoopTree *loop) {
}
void IdealLoopTree::remove_safepoints(PhaseIdealLoop* phase, bool keep_one) {
// Look for a safepoint on the idom-path.
Node* keep = NULL;
if (keep_one) {
// Keep one if possible
// Look for a safepoint on the idom-path.
for (Node* i = tail(); i != _head; i = phase->idom(i)) {
if (i->Opcode() == Op_SafePoint && phase->get_loop(i) == this) {
keep = i;
......@@ -1823,9 +1822,14 @@ void IdealLoopTree::remove_safepoints(PhaseIdealLoop* phase, bool keep_one) {
}
}
// Don't remove any safepoints if it is requested to keep a single safepoint and
// no safepoint was found on idom-path. It is not safe to remove any safepoint
// in this case since there's no safepoint dominating all paths in the loop body.
bool prune = !keep_one || keep != NULL;
// Delete other safepoints in this loop.
Node_List* sfpts = _safepts;
if (sfpts != NULL) {
if (prune && sfpts != NULL) {
assert(keep == NULL || keep->Opcode() == Op_SafePoint, "not safepoint");
for (uint i = 0; i < sfpts->size(); i++) {
Node* n = sfpts->at(i);
......@@ -1918,6 +1922,15 @@ void IdealLoopTree::dump_head( ) const {
if (cl->is_main_loop()) tty->print(" main");
if (cl->is_post_loop()) tty->print(" post");
}
if (_has_call) tty->print(" has_call");
if (_has_sfpt) tty->print(" has_sfpt");
if (_rce_candidate) tty->print(" rce");
if (_safepts != NULL && _safepts->size() > 0) {
tty->print(" sfpts={"); _safepts->dump_simple(); tty->print(" }");
}
if (_required_safept != NULL && _required_safept->size() > 0) {
tty->print(" req={"); _required_safept->dump_simple(); tty->print(" }");
}
tty->cr();
}
......
......@@ -2107,6 +2107,17 @@ void Node_List::dump() const {
#endif
}
void Node_List::dump_simple() const {
#ifndef PRODUCT
for( uint i = 0; i < _cnt; i++ )
if( _nodes[i] ) {
tty->print(" %d", _nodes[i]->_idx);
} else {
tty->print(" NULL");
}
#endif
}
//=============================================================================
//------------------------------remove-----------------------------------------
void Unique_Node_List::remove( Node *n ) {
......
......@@ -1374,6 +1374,7 @@ public:
void clear() { _cnt = 0; Node_Array::clear(); } // retain storage
uint size() const { return _cnt; }
void dump() const;
void dump_simple() const;
};
//------------------------------Unique_Node_List-------------------------------
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册