550 Node* mem_in = in(Memory);
551
552 if (mem_in->isa_MergeMem()) {
553 const TypePtr* adr_type = brooks_pointer_type(bottom_type());
554 uint alias_idx = phase->C->get_alias_index(adr_type);
555 mem_in = mem_in->as_MergeMem()->memory_at(alias_idx);
556 set_req(Memory, mem_in);
557 return this;
558 }
559
560 Node* val = in(ValueIn);
561 if (val->is_ShenandoahBarrier()) {
562 set_req(ValueIn, val->in(ValueIn));
563 return this;
564 }
565
566 return NULL;
567 }
568
569 bool ShenandoahWriteBarrierNode::expand(Compile* C, PhaseIterGVN& igvn, int& loop_opts_cnt) {
570 if (UseShenandoahGC && ShenandoahWriteBarrierToIR) {
571 if (ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count() > 0 || (!ShenandoahWriteBarrier && ShenandoahStoreValEnqueueBarrier)) {
572 bool attempt_more_loopopts = ShenandoahLoopOptsAfterExpansion;
573 C->clear_major_progress();
574 PhaseIdealLoop ideal_loop(igvn, LoopOptsShenandoahExpand);
575 if (C->failing()) return false;
576 PhaseIdealLoop::verify(igvn);
577 DEBUG_ONLY(ShenandoahBarrierNode::verify_raw_mem(C->root());)
578 if (attempt_more_loopopts) {
579 C->set_major_progress();
580 if (!C->optimize_loops(loop_opts_cnt, igvn, LoopOptsShenandoahPostExpand)) {
581 return false;
582 }
583 C->clear_major_progress();
584 }
585 }
586 }
587 return true;
588 }
589
590 bool ShenandoahWriteBarrierNode::is_heap_state_test(Node* iff, int mask) {
|
550 Node* mem_in = in(Memory);
551
552 if (mem_in->isa_MergeMem()) {
553 const TypePtr* adr_type = brooks_pointer_type(bottom_type());
554 uint alias_idx = phase->C->get_alias_index(adr_type);
555 mem_in = mem_in->as_MergeMem()->memory_at(alias_idx);
556 set_req(Memory, mem_in);
557 return this;
558 }
559
560 Node* val = in(ValueIn);
561 if (val->is_ShenandoahBarrier()) {
562 set_req(ValueIn, val->in(ValueIn));
563 return this;
564 }
565
566 return NULL;
567 }
568
569 bool ShenandoahWriteBarrierNode::expand(Compile* C, PhaseIterGVN& igvn, int& loop_opts_cnt) {
570 if (UseShenandoahGC) {
571 if (ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count() > 0 || (!ShenandoahWriteBarrier && ShenandoahStoreValEnqueueBarrier)) {
572 bool attempt_more_loopopts = ShenandoahLoopOptsAfterExpansion;
573 C->clear_major_progress();
574 PhaseIdealLoop ideal_loop(igvn, LoopOptsShenandoahExpand);
575 if (C->failing()) return false;
576 PhaseIdealLoop::verify(igvn);
577 DEBUG_ONLY(ShenandoahBarrierNode::verify_raw_mem(C->root());)
578 if (attempt_more_loopopts) {
579 C->set_major_progress();
580 if (!C->optimize_loops(loop_opts_cnt, igvn, LoopOptsShenandoahPostExpand)) {
581 return false;
582 }
583 C->clear_major_progress();
584 }
585 }
586 }
587 return true;
588 }
589
590 bool ShenandoahWriteBarrierNode::is_heap_state_test(Node* iff, int mask) {
|