8039050: Crash in C2 compiler at Node::rematerialize
Summary: Added missing calls to record_for_igvn() in loop opts. Added verification of def-use domination.
Reviewed-by: iveresov
--- a/hotspot/src/share/vm/opto/loopTransform.cpp Tue Apr 15 02:27:34 2014 -0700
+++ b/hotspot/src/share/vm/opto/loopTransform.cpp Tue Apr 15 14:34:48 2014 -0700
@@ -1150,6 +1150,7 @@
// Now force out all loop-invariant dominating tests. The optimizer
// finds some, but we _know_ they are all useless.
peeled_dom_test_elim(loop,old_new);
+ loop->record_for_igvn();
}
//------------------------------is_invariant-----------------------------
--- a/hotspot/src/share/vm/opto/loopnode.cpp Tue Apr 15 02:27:34 2014 -0700
+++ b/hotspot/src/share/vm/opto/loopnode.cpp Tue Apr 15 14:34:48 2014 -0700
@@ -3172,17 +3172,16 @@
bool had_error = false;
#ifdef ASSERT
if (early != C->root()) {
- // Make sure that there's a dominance path from use to LCA
- Node* d = use;
- while (d != LCA) {
- d = idom(d);
+ // Make sure that there's a dominance path from LCA to early
+ Node* d = LCA;
+ while (d != early) {
if (d == C->root()) {
- tty->print_cr("*** Use %d isn't dominated by def %s", use->_idx, n->_idx);
- n->dump();
- use->dump();
+ dump_bad_graph("Bad graph detected in compute_lca_of_uses", n, early, LCA);
+ tty->print_cr("*** Use %d isn't dominated by def %d ***", use->_idx, n->_idx);
had_error = true;
break;
}
+ d = idom(d);
}
}
#endif
@@ -3435,6 +3434,13 @@
_igvn._worklist.push(n); // Maybe we'll normalize it, if no more loops.
}
+#ifdef ASSERT
+ if (_verify_only && !n->is_CFG()) {
+ // Check def-use domination.
+ compute_lca_of_uses(n, get_ctrl(n), true /* verify */);
+ }
+#endif
+
// CFG and pinned nodes already handled
if( n->in(0) ) {
if( n->in(0)->is_top() ) return; // Dead?
--- a/hotspot/src/share/vm/opto/loopopts.cpp Tue Apr 15 02:27:34 2014 -0700
+++ b/hotspot/src/share/vm/opto/loopopts.cpp Tue Apr 15 14:34:48 2014 -0700
@@ -2700,6 +2700,7 @@
// Inhibit more partial peeling on this loop
new_head_clone->set_partial_peel_loop();
C->set_major_progress();
+ loop->record_for_igvn();
#if !defined(PRODUCT)
if (TracePartialPeeling) {