OpenJDK / jdk / jdk10
changeset 24020:d73865d27efc
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
author | kvn |
---|---|
date | Tue, 15 Apr 2014 14:34:48 -0700 |
parents | fd58d5121d7a |
children | c55dabab1599 |
files | hotspot/src/share/vm/opto/loopTransform.cpp hotspot/src/share/vm/opto/loopnode.cpp hotspot/src/share/vm/opto/loopopts.cpp |
diffstat | 3 files changed, 15 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- 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) {