< prev index next >

src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp

Print this page

        

*** 759,777 **** if (barrier->can_be_eliminated()) { // Clone and pin the load for this barrier below the dominating // barrier: the load cannot be allowed to float above the // dominating barrier Node* load = in_val; ! Node* decode = NULL; ! if (load->is_DecodeN()) { ! decode = load; ! load = load->in(1); ! } if (load->is_Load()) { Node* new_load = load->clone(); Node* addp = new_load->in(MemNode::Address); ! assert(addp->is_AddP() || addp->is_Phi(), "bad address"); Node* cast = new CastPPNode(addp, igvn.type(addp), true); Node* ctrl = NULL; Node* similar = barrier->in(LoadBarrierNode::Similar); if (similar->is_Phi()) { // already expanded --- 759,773 ---- if (barrier->can_be_eliminated()) { // Clone and pin the load for this barrier below the dominating // barrier: the load cannot be allowed to float above the // dominating barrier Node* load = in_val; ! if (load->is_Load()) { Node* new_load = load->clone(); Node* addp = new_load->in(MemNode::Address); ! assert(addp->is_AddP() || addp->is_Phi() || addp->is_Load(), "bad address"); Node* cast = new CastPPNode(addp, igvn.type(addp), true); Node* ctrl = NULL; Node* similar = barrier->in(LoadBarrierNode::Similar); if (similar->is_Phi()) { // already expanded
*** 784,801 **** cast->set_req(0, ctrl); igvn.transform(cast); new_load->set_req(MemNode::Address, cast); igvn.transform(new_load); ! Node* new_in_val = new_load; ! if (decode != NULL) { ! new_in_val = decode->clone(); ! new_in_val->set_req(1, new_load); ! igvn.transform(new_in_val); ! } ! ! igvn.replace_node(out_res, new_in_val); igvn.replace_node(out_ctrl, in_ctrl); return; } // cannot eliminate } --- 780,790 ---- cast->set_req(0, ctrl); igvn.transform(cast); new_load->set_req(MemNode::Address, cast); igvn.transform(new_load); ! igvn.replace_node(out_res, new_load); igvn.replace_node(out_ctrl, in_ctrl); return; } // cannot eliminate }
< prev index next >