equal
deleted
inserted
replaced
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 |