mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-21 11:34:38 +02:00
6712835: Server compiler fails with assertion (loop_count < K,"infinite loop in PhaseIterGVN::transform")
Reviewed-by: kvn
This commit is contained in:
parent
97c80b8c84
commit
7b4a7f7bdc
4 changed files with 1587 additions and 1 deletions
|
@ -351,7 +351,7 @@ void ciBlock::set_exception_range(int start_bci, int limit_bci) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
static char *flagnames[] = {
|
static const char *flagnames[] = {
|
||||||
"Processed",
|
"Processed",
|
||||||
"Handler",
|
"Handler",
|
||||||
"MayThrow",
|
"MayThrow",
|
||||||
|
|
|
@ -473,10 +473,12 @@ void IdealGraphPrinter::visit_node(Node *n, void *param) {
|
||||||
print_prop("is_dontcare", "false");
|
print_prop("is_dontcare", "false");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ASSERT
|
||||||
Node* old = C->matcher()->find_old_node(node);
|
Node* old = C->matcher()->find_old_node(node);
|
||||||
if (old != NULL) {
|
if (old != NULL) {
|
||||||
print_prop("old_node_idx", old->_idx);
|
print_prop("old_node_idx", old->_idx);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
if (node->is_Proj()) {
|
if (node->is_Proj()) {
|
||||||
|
|
|
@ -725,6 +725,11 @@ static Node *remove_useless_bool(IfNode *iff, PhaseGVN *phase) {
|
||||||
int true_path = phi->is_diamond_phi();
|
int true_path = phi->is_diamond_phi();
|
||||||
if( true_path == 0 ) return NULL;
|
if( true_path == 0 ) return NULL;
|
||||||
|
|
||||||
|
// Make sure that iff and the control of the phi are different. This
|
||||||
|
// should really only happen for dead control flow since it requires
|
||||||
|
// an illegal cycle.
|
||||||
|
if (phi->in(0)->in(1)->in(0) == iff) return NULL;
|
||||||
|
|
||||||
// phi->region->if_proj->ifnode->bool->cmp
|
// phi->region->if_proj->ifnode->bool->cmp
|
||||||
BoolNode *bol2 = phi->in(0)->in(1)->in(0)->in(1)->as_Bool();
|
BoolNode *bol2 = phi->in(0)->in(1)->in(0)->in(1)->as_Bool();
|
||||||
|
|
||||||
|
@ -751,6 +756,7 @@ static Node *remove_useless_bool(IfNode *iff, PhaseGVN *phase) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Node* new_bol = (flip ? phase->transform( bol2->negate(phase) ) : bol2);
|
Node* new_bol = (flip ? phase->transform( bol2->negate(phase) ) : bol2);
|
||||||
|
assert(new_bol != iff->in(1), "must make progress");
|
||||||
iff->set_req(1, new_bol);
|
iff->set_req(1, new_bol);
|
||||||
// Intervening diamond probably goes dead
|
// Intervening diamond probably goes dead
|
||||||
phase->C->set_major_progress();
|
phase->C->set_major_progress();
|
||||||
|
|
1578
hotspot/test/compiler/6712835/Test6712835.java
Normal file
1578
hotspot/test/compiler/6712835/Test6712835.java
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue