src/hotspot/share/gc/shenandoah/c2/shenandoahBarrierSetC2.cpp
changeset 55654 92ab031d6540
parent 55394 b444bbe5c45c
child 55679 aa96c53c592b
equal deleted inserted replaced
55653:3243c42d737d 55654:92ab031d6540
   470   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
   470   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+0, fields);
   471 
   471 
   472   return TypeFunc::make(domain, range);
   472   return TypeFunc::make(domain, range);
   473 }
   473 }
   474 
   474 
       
   475 const TypeFunc* ShenandoahBarrierSetC2::oop_load_from_native_barrier_Type() {
       
   476   const Type **fields = TypeTuple::fields(1);
       
   477   fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
       
   478   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
       
   479 
       
   480   // create result type (range)
       
   481   fields = TypeTuple::fields(1);
       
   482   fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL;
       
   483   const TypeTuple *range = TypeTuple::make(TypeFunc::Parms+1, fields);
       
   484 
       
   485   return TypeFunc::make(domain, range);
       
   486 }
       
   487 
   475 const TypeFunc* ShenandoahBarrierSetC2::shenandoah_load_reference_barrier_Type() {
   488 const TypeFunc* ShenandoahBarrierSetC2::shenandoah_load_reference_barrier_Type() {
   476   const Type **fields = TypeTuple::fields(1);
   489   const Type **fields = TypeTuple::fields(1);
   477   fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
   490   fields[TypeFunc::Parms+0] = TypeInstPtr::NOTNULL; // original field value
   478   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
   491   const TypeTuple *domain = TypeTuple::make(TypeFunc::Parms+1, fields);
   479 
   492 
   539 
   552 
   540   Node* top = Compile::current()->top();
   553   Node* top = Compile::current()->top();
   541 
   554 
   542   Node* offset = adr->is_AddP() ? adr->in(AddPNode::Offset) : top;
   555   Node* offset = adr->is_AddP() ? adr->in(AddPNode::Offset) : top;
   543   Node* load = BarrierSetC2::load_at_resolved(access, val_type);
   556   Node* load = BarrierSetC2::load_at_resolved(access, val_type);
       
   557 
       
   558   if ((decorators & IN_NATIVE) != 0) {
       
   559     assert(access.is_oop(), "IN_NATIVE access only for oop values");
       
   560     assert(access.is_parse_access(), "IN_NATIVE access only during parsing");
       
   561     GraphKit* kit = static_cast<C2ParseAccess &>(access).kit();
       
   562     Node* call = kit->make_runtime_call(GraphKit::RC_LEAF,
       
   563                                         oop_load_from_native_barrier_Type(),
       
   564                                         CAST_FROM_FN_PTR(address, ShenandoahRuntime::oop_load_from_native_barrier),
       
   565                                         "ShenandoahRuntime::oop_load_from_native_barrier",
       
   566                                         NULL, load);
       
   567     Node* proj = kit->gvn().transform(new ProjNode(call, TypeFunc::Parms+0));
       
   568     return kit->gvn().transform(new CheckCastPPNode(kit->control(), proj, load->bottom_type()));
       
   569   }
   544 
   570 
   545   if (access.is_oop()) {
   571   if (access.is_oop()) {
   546     if (ShenandoahLoadRefBarrier) {
   572     if (ShenandoahLoadRefBarrier) {
   547       load = new ShenandoahLoadReferenceBarrierNode(NULL, load);
   573       load = new ShenandoahLoadReferenceBarrierNode(NULL, load);
   548       if (access.is_parse_access()) {
   574       if (access.is_parse_access()) {
   721     return false;
   747     return false;
   722   }
   748   }
   723 
   749 
   724   return strcmp(call->_name, "shenandoah_clone_barrier") == 0 ||
   750   return strcmp(call->_name, "shenandoah_clone_barrier") == 0 ||
   725          strcmp(call->_name, "shenandoah_cas_obj") == 0 ||
   751          strcmp(call->_name, "shenandoah_cas_obj") == 0 ||
   726          strcmp(call->_name, "shenandoah_wb_pre") == 0;
   752          strcmp(call->_name, "shenandoah_wb_pre") == 0 ||
       
   753          strcmp(call->_name, "ShenandoahRuntime::oop_load_from_native_barrier") == 0;
   727 }
   754 }
   728 
   755 
   729 Node* ShenandoahBarrierSetC2::step_over_gc_barrier(Node* c) const {
   756 Node* ShenandoahBarrierSetC2::step_over_gc_barrier(Node* c) const {
   730   if (c->Opcode() == Op_ShenandoahLoadReferenceBarrier) {
   757   if (c->Opcode() == Op_ShenandoahLoadReferenceBarrier) {
   731     return c->in(ShenandoahLoadReferenceBarrierNode::ValueIn);
   758     return c->in(ShenandoahLoadReferenceBarrierNode::ValueIn);
  1153       conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(1), delayed_worklist);
  1180       conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(1), delayed_worklist);
  1154       break;
  1181       break;
  1155     case Op_ShenandoahLoadReferenceBarrier:
  1182     case Op_ShenandoahLoadReferenceBarrier:
  1156       conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(ShenandoahLoadReferenceBarrierNode::ValueIn), delayed_worklist);
  1183       conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(ShenandoahLoadReferenceBarrierNode::ValueIn), delayed_worklist);
  1157       return true;
  1184       return true;
       
  1185     case Op_CallLeaf:
       
  1186       if (strcmp(n->as_CallLeaf()->_name, "ShenandoahRuntime::oop_load_from_native_barrier") == 0) {
       
  1187         conn_graph->map_ideal_node(n, conn_graph->phantom_obj);
       
  1188         return true;
       
  1189       }
  1158     default:
  1190     default:
  1159       // Nothing
  1191       // Nothing
  1160       break;
  1192       break;
  1161   }
  1193   }
  1162   return false;
  1194   return false;