< 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 >