src/hotspot/share/gc/z/c2/zBarrierSetC2.cpp
changeset 55536 8313c42345d5
parent 55326 50270ff05a65
child 55553 b9171be3cf2a
child 55563 d56b192c73e9
equal deleted inserted replaced
55535:df1925d3d409 55536:8313c42345d5
   520   Node* in_ctrl = barrier->in(LoadBarrierNode::Control);
   520   Node* in_ctrl = barrier->in(LoadBarrierNode::Control);
   521   Node* in_mem = barrier->in(LoadBarrierNode::Memory);
   521   Node* in_mem = barrier->in(LoadBarrierNode::Memory);
   522   Node* in_val = barrier->in(LoadBarrierNode::Oop);
   522   Node* in_val = barrier->in(LoadBarrierNode::Oop);
   523   Node* in_adr = barrier->in(LoadBarrierNode::Address);
   523   Node* in_adr = barrier->in(LoadBarrierNode::Address);
   524 
   524 
   525   Node* out_ctrl = barrier->proj_out_or_null(LoadBarrierNode::Control);
   525   Node* out_ctrl = barrier->proj_out(LoadBarrierNode::Control);
   526   Node* out_res = barrier->proj_out(LoadBarrierNode::Oop);
   526   Node* out_res = barrier->proj_out(LoadBarrierNode::Oop);
   527 
   527 
   528   assert(barrier->in(LoadBarrierNode::Oop) != NULL, "oop to loadbarrier node cannot be null");
   528   assert(barrier->in(LoadBarrierNode::Oop) != NULL, "oop to loadbarrier node cannot be null");
   529 
   529 
   530   Node* jthread = igvn.transform(new ThreadLocalNode());
   530   Node* jthread = igvn.transform(new ThreadLocalNode());
   550 
   550 
   551   Node* result_phi = igvn.transform(new PhiNode(result_region, TypeInstPtr::BOTTOM));
   551   Node* result_phi = igvn.transform(new PhiNode(result_region, TypeInstPtr::BOTTOM));
   552   result_phi->set_req(1, new_loadp);
   552   result_phi->set_req(1, new_loadp);
   553   result_phi->set_req(2, barrier->in(LoadBarrierNode::Oop));
   553   result_phi->set_req(2, barrier->in(LoadBarrierNode::Oop));
   554 
   554 
   555   if (out_ctrl != NULL) {
   555 
   556     igvn.replace_node(out_ctrl, result_region);
   556   igvn.replace_node(out_ctrl, result_region);
   557   }
       
   558   igvn.replace_node(out_res, result_phi);
   557   igvn.replace_node(out_res, result_phi);
   559 
   558 
   560   assert(barrier->outcnt() == 0,"LoadBarrier macro node has non-null outputs after expansion!");
   559   assert(barrier->outcnt() == 0,"LoadBarrier macro node has non-null outputs after expansion!");
   561 
   560 
   562   igvn.remove_dead_node(barrier);
   561   igvn.remove_dead_node(barrier);
   633     Node* n = phi->in(1);
   632     Node* n = phi->in(1);
   634     if (n != NULL && n->is_LoadBarrierSlowReg()) {
   633     if (n != NULL && n->is_LoadBarrierSlowReg()) {
   635       assert(c == node, "projections from step 1 should only be seen before macro expansion");
   634       assert(c == node, "projections from step 1 should only be seen before macro expansion");
   636       return phi->in(2);
   635       return phi->in(2);
   637     }
   636     }
       
   637   }
       
   638 
       
   639   return c;
       
   640 }
       
   641 
       
   642 Node* ZBarrierSetC2::step_over_gc_barrier_ctrl(Node* c) const {
       
   643   Node* node = c;
       
   644 
       
   645   // 1. This step follows potential ctrl projections of a load barrier before expansion
       
   646   if (node->is_Proj()) {
       
   647     node = node->in(0);
       
   648   }
       
   649 
       
   650   // 2. This step checks for unexpanded load barriers
       
   651   if (node->is_LoadBarrier()) {
       
   652     return node->in(LoadBarrierNode::Control);
   638   }
   653   }
   639 
   654 
   640   return c;
   655   return c;
   641 }
   656 }
   642 
   657