< prev index next >

src/hotspot/share/opto/loopopts.cpp

Print this page

        

*** 1092,1113 **** //------------------------------place_near_use--------------------------------- // Place some computation next to use but not inside inner loops. // For inner loop uses move it to the preheader area. Node *PhaseIdealLoop::place_near_use( Node *useblock ) const { IdealLoopTree *u_loop = get_loop( useblock ); ! return (u_loop->_irreducible || u_loop->_child) ! ? useblock ! : u_loop->_head->as_Loop()->skip_strip_mined()->in(LoopNode::EntryControl); } bool PhaseIdealLoop::identical_backtoback_ifs(Node *n) { if (!n->is_If()) { return false; } Node* region = NULL; bool shenandoah_evac = ShenandoahWriteBarrierNode::is_evacuation_in_progress_test(n); if (shenandoah_evac) { assert(UseShenandoahGC, "for shenandoah only"); region = ShenandoahWriteBarrierNode::evacuation_in_progress_test_ctrl(n); } else { region = n->in(0); --- 1092,1121 ---- //------------------------------place_near_use--------------------------------- // Place some computation next to use but not inside inner loops. // For inner loop uses move it to the preheader area. Node *PhaseIdealLoop::place_near_use( Node *useblock ) const { IdealLoopTree *u_loop = get_loop( useblock ); ! if (u_loop->_irreducible) { ! return useblock; ! } ! if (u_loop->_child) { ! if (useblock == u_loop->_head && u_loop->_head->is_OuterStripMinedLoop()) { ! return u_loop->_head->in(LoopNode::EntryControl); ! } ! return useblock; ! } ! return u_loop->_head->as_Loop()->skip_strip_mined()->in(LoopNode::EntryControl); } bool PhaseIdealLoop::identical_backtoback_ifs(Node *n) { if (!n->is_If()) { return false; } Node* region = NULL; bool shenandoah_evac = ShenandoahWriteBarrierNode::is_evacuation_in_progress_test(n); + bool shenandoah_heap_stable = ShenandoahWriteBarrierNode::is_heap_stable_test(n); if (shenandoah_evac) { assert(UseShenandoahGC, "for shenandoah only"); region = ShenandoahWriteBarrierNode::evacuation_in_progress_test_ctrl(n); } else { region = n->in(0);
*** 1122,1131 **** --- 1130,1143 ---- } if (shenandoah_evac) { if (!ShenandoahWriteBarrierNode::is_evacuation_in_progress_test(dom)) { return false; } + } else if (shenandoah_heap_stable) { + if (!ShenandoahWriteBarrierNode::is_heap_stable_test(dom)) { + return false; + } } else { if (dom->in(1) != n->in(1)) { return false; } }
< prev index next >