# HG changeset patch # Parent 6ea9c058f2f942a8a7528edeffd6f0ab3dc49df8 diff --git a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp --- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp @@ -2621,6 +2621,7 @@ Node* null = new IfFalseNode(null_iff); phase->register_control(null, loop, null_iff); null_ctrl = null; + heap_unstable_ctrl = not_null; } } @@ -2772,10 +2773,10 @@ Node* in_cset_fast_test_success = new IfFalseNode(in_cset_fast_test_iff); phase->register_control(in_cset_fast_test_success, loop, in_cset_fast_test_iff); - region->init_req(3, in_cset_fast_test_success); - val_phi->init_req(3, rbtrue); - mem_phi->init_req(3, wb_mem); - raw_mem_phi->init_req(3, raw_mem); + region->init_req(2, in_cset_fast_test_success); + val_phi->init_req(2, rbtrue); + mem_phi->init_req(2, wb_mem); + raw_mem_phi->init_req(2, raw_mem); Node* in_cset_fast_test_failure = new IfTrueNode(in_cset_fast_test_iff); phase->register_control(in_cset_fast_test_failure, loop, in_cset_fast_test_iff); @@ -2816,10 +2817,10 @@ phase->register_new_node(res_proj, call); Node* res = new CheckCastPPNode(ctrl_proj, res_proj, phase->igvn().type(val)->is_oopptr()->cast_to_nonconst()); phase->register_new_node(res, ctrl_proj); - region->init_req(5, ctrl_proj); - val_phi->init_req(5, res); - mem_phi->init_req(5, mem_proj); - raw_mem_phi->init_req(5, mem_proj); + region->init_req(4, ctrl_proj); + val_phi->init_req(4, res); + mem_phi->init_req(4, mem_proj); + raw_mem_phi->init_req(4, mem_proj); } void ShenandoahWriteBarrierNode::fix_ctrl(Node* barrier, Node* region, const MemoryGraphFixer& fixer, Unique_Node_List& uses, Unique_Node_List& uses_to_ignore, uint last, PhaseIdealLoop* phase) { @@ -3121,16 +3122,21 @@ // Null case if (null_ctrl != NULL) { - region->init_req(2, null_ctrl); + region->init_req(5, null_ctrl); // TODO: This probably loads a new NULL into register, instead of // reusing the (just null-tested) original value. - val_phi->init_req(2, phase->igvn().zerocon(T_OBJECT)); - mem_phi->init_req(2, wb_mem); - raw_mem_phi->init_req(2, raw_mem); + val_phi->init_req(5, phase->igvn().zerocon(T_OBJECT)); + mem_phi->init_req(5, wb_mem); + raw_mem_phi->init_req(5, raw_mem); + } else { + region->del_req(5); + val_phi->del_req(5); + mem_phi->del_req(5); + raw_mem_phi->del_req(5); } // Test for in-cset. - // Wires !in_cset(obj) to slot 3 of region and phis + // Wires !in_cset(obj) to slot 2 of region and phis ctrl = heap_unstable_ctrl; in_cset_fast_test(ctrl, orig_val, raw_mem, wb_mem, region, val_phi, mem_phi, raw_mem_phi, phase); @@ -3156,13 +3162,13 @@ Node* if_eq = new IfTrueNode(iff); phase->register_control(if_eq, loop, iff); - // Wire up not-equal-path in slots 4. - region->init_req(4, if_not_eq); - val_phi->init_req(4, rb); - mem_phi->init_req(4, wb_mem); - raw_mem_phi->init_req(4, raw_mem); - - // Call wb-stub and wire up that path in slots 5 + // Wire up not-equal-path in slots 3. + region->init_req(3, if_not_eq); + val_phi->init_req(3, rb); + mem_phi->init_req(3, wb_mem); + raw_mem_phi->init_req(3, raw_mem); + + // Call wb-stub and wire up that path in slots 4 evacuation_in_progress(if_eq, rb, raw_mem, wb_mem, region, val_phi, mem_phi, raw_mem_phi, alias, phase);