406
407 if (mem_in->isa_MergeMem()) {
408 const TypePtr* adr_type = brooks_pointer_type(bottom_type());
409 uint alias_idx = phase->C->get_alias_index(adr_type);
410 mem_in = mem_in->as_MergeMem()->memory_at(alias_idx);
411 set_req(Memory, mem_in);
412 return this;
413 }
414
415 Node* val = in(ValueIn);
416 if (val->is_ShenandoahBarrier()) {
417 set_req(ValueIn, val->in(ValueIn));
418 return this;
419 }
420
421 return NULL;
422 }
423
424 bool ShenandoahWriteBarrierNode::expand(Compile* C, PhaseIterGVN& igvn, int& loop_opts_cnt) {
425 if (UseShenandoahGC) {
426 if (ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count() > 0 || (!ShenandoahWriteBarrier && ShenandoahStoreValEnqueueBarrier)) {
427 bool attempt_more_loopopts = ShenandoahLoopOptsAfterExpansion;
428 C->clear_major_progress();
429 PhaseIdealLoop ideal_loop(igvn, LoopOptsShenandoahExpand);
430 if (C->failing()) return false;
431 PhaseIdealLoop::verify(igvn);
432 DEBUG_ONLY(ShenandoahBarrierNode::verify_raw_mem(C->root());)
433 if (attempt_more_loopopts) {
434 C->set_major_progress();
435 if (!C->optimize_loops(loop_opts_cnt, igvn, LoopOptsShenandoahPostExpand)) {
436 return false;
437 }
438 C->clear_major_progress();
439 }
440 }
441 }
442 return true;
443 }
444
445 bool ShenandoahWriteBarrierNode::is_heap_state_test(Node* iff, int mask) {
446 if (!UseShenandoahGC) {
447 return false;
448 }
449 assert(iff->is_If(), "bad input");
450 if (iff->Opcode() != Op_If) {
451 return false;
452 }
453 Node* bol = iff->in(1);
454 if (!bol->is_Bool() || bol->as_Bool()->_test._test != BoolTest::ne) {
455 return false;
456 }
457 Node* cmp = bol->in(1);
458 if (cmp->Opcode() != Op_CmpI) {
459 return false;
460 }
|
406
407 if (mem_in->isa_MergeMem()) {
408 const TypePtr* adr_type = brooks_pointer_type(bottom_type());
409 uint alias_idx = phase->C->get_alias_index(adr_type);
410 mem_in = mem_in->as_MergeMem()->memory_at(alias_idx);
411 set_req(Memory, mem_in);
412 return this;
413 }
414
415 Node* val = in(ValueIn);
416 if (val->is_ShenandoahBarrier()) {
417 set_req(ValueIn, val->in(ValueIn));
418 return this;
419 }
420
421 return NULL;
422 }
423
424 bool ShenandoahWriteBarrierNode::expand(Compile* C, PhaseIterGVN& igvn, int& loop_opts_cnt) {
425 if (UseShenandoahGC) {
426 // if (ShenandoahBarrierSetC2::bsc2()->state()->shenandoah_barriers_count() > 0 || (!ShenandoahWriteBarrier && ShenandoahStoreValEnqueueBarrier)) {
427 bool attempt_more_loopopts = ShenandoahLoopOptsAfterExpansion;
428 C->clear_major_progress();
429 PhaseIdealLoop ideal_loop(igvn, LoopOptsShenandoahExpand);
430 if (C->failing()) return false;
431 PhaseIdealLoop::verify(igvn);
432 DEBUG_ONLY(ShenandoahBarrierNode::verify_raw_mem(C->root());)
433 if (attempt_more_loopopts) {
434 C->set_major_progress();
435 if (!C->optimize_loops(loop_opts_cnt, igvn, LoopOptsShenandoahPostExpand)) {
436 return false;
437 }
438 C->clear_major_progress();
439 }
440 // }
441 }
442 return true;
443 }
444
445 bool ShenandoahWriteBarrierNode::is_heap_state_test(Node* iff, int mask) {
446 if (!UseShenandoahGC) {
447 return false;
448 }
449 assert(iff->is_If(), "bad input");
450 if (iff->Opcode() != Op_If) {
451 return false;
452 }
453 Node* bol = iff->in(1);
454 if (!bol->is_Bool() || bol->as_Bool()->_test._test != BoolTest::ne) {
455 return false;
456 }
457 Node* cmp = bol->in(1);
458 if (cmp->Opcode() != Op_CmpI) {
459 return false;
460 }
|