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