OpenJDK / amber / amber
changeset 56440:de371e2d1acc
8224496: Shenandoah compilation fails with assert(is_CountedLoopEnd()) failed: invalid node class
Reviewed-by: rkennke
author | roland |
---|---|
date | Wed, 22 May 2019 10:11:04 +0200 |
parents | e63a624da347 |
children | ef713640430e |
files | src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp |
diffstat | 1 files changed, 21 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp Wed May 29 13:30:17 2019 +0200 +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp Wed May 22 10:11:04 2019 +0200 @@ -1191,12 +1191,6 @@ void ShenandoahBarrierC2Support::pin_and_expand(PhaseIdealLoop* phase) { ShenandoahBarrierSetC2State* state = ShenandoahBarrierSetC2::bsc2()->state(); - // Collect raw memory state at CFG points in the entire graph and - // record it in memory_nodes. Optimize the raw memory graph in the - // process. Optimizing the memory graph also makes the memory graph - // simpler. - GrowableArray<MemoryGraphFixer*> memory_graph_fixers; - Unique_Node_List uses; for (int i = 0; i < state->enqueue_barriers_count(); i++) { Node* barrier = state->enqueue_barrier(i); @@ -1412,6 +1406,22 @@ } } + for (int i = 0; i < state->load_reference_barriers_count(); i++) { + ShenandoahLoadReferenceBarrierNode* lrb = state->load_reference_barrier(i); + if (lrb->get_barrier_strength() == ShenandoahLoadReferenceBarrierNode::NONE) { + continue; + } + Node* ctrl = phase->get_ctrl(lrb); + IdealLoopTree* loop = phase->get_loop(ctrl); + if (loop->_head->is_OuterStripMinedLoop()) { + // Expanding a barrier here will break loop strip mining + // verification. Transform the loop so the loop nest doesn't + // appear as strip mined. + OuterStripMinedLoopNode* outer = loop->_head->as_OuterStripMinedLoop(); + hide_strip_mined_loop(outer, outer->unique_ctrl_out()->as_CountedLoop(), phase); + } + } + // Expand load-reference-barriers MemoryGraphFixer fixer(Compile::AliasIdxRaw, true, phase); Unique_Node_List uses_to_ignore; @@ -1431,7 +1441,6 @@ Node* raw_mem = fixer.find_mem(ctrl, lrb); Node* init_raw_mem = raw_mem; Node* raw_mem_for_ctrl = fixer.find_mem(ctrl, NULL); - // int alias = phase->C->get_alias_index(lrb->adr_type()); IdealLoopTree *loop = phase->get_loop(ctrl); CallStaticJavaNode* unc = lrb->pin_and_expand_null_check(phase->igvn()); @@ -2607,7 +2616,11 @@ IdealLoopTree* l = loop; create_phi = false; while (l != _phase->ltree_root()) { - if (_phase->is_dominator(l->_head, u) && _phase->is_dominator(_phase->idom(u), l->_head)) { + Node* head = l->_head; + if (head->in(0) == NULL) { + head = _phase->get_ctrl(head); + } + if (_phase->is_dominator(head, u) && _phase->is_dominator(_phase->idom(u), head)) { create_phi = true; do_check = false; break;