< prev index next >

src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp

Print this page

1488     }
1489 
1490     Node* init_ctrl = ctrl;
1491     IdealLoopTree* loop = phase->get_loop(ctrl);
1492     Node* raw_mem = fixer.find_mem(ctrl, barrier);
1493     Node* init_raw_mem = raw_mem;
1494     Node* raw_mem_for_ctrl = fixer.find_mem(ctrl, NULL);
1495     Node* heap_stable_ctrl = NULL;
1496     Node* null_ctrl = NULL;
1497     uint last = phase->C->unique();
1498 
1499     enum { _heap_stable = 1, _heap_unstable, PATH_LIMIT };
1500     Node* region = new RegionNode(PATH_LIMIT);
1501     Node* phi = PhiNode::make(region, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
1502 
1503     enum { _fast_path = 1, _slow_path, _null_path, PATH_LIMIT2 };
1504     Node* region2 = new RegionNode(PATH_LIMIT2);
1505     Node* phi2 = PhiNode::make(region2, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
1506 
1507     // Stable path.
1508     test_gc_state(ctrl, raw_mem, heap_stable_ctrl, phase, ShenandoahHeap::MARKING);
1509     region->init_req(_heap_stable, heap_stable_ctrl);
1510     phi->init_req(_heap_stable, raw_mem);
1511 
1512     // Null path
1513     Node* reg2_ctrl = NULL;
1514     test_null(ctrl, pre_val, null_ctrl, phase);
1515     if (null_ctrl != NULL) {
1516       reg2_ctrl = null_ctrl->in(0);
1517       region2->init_req(_null_path, null_ctrl);
1518       phi2->init_req(_null_path, raw_mem);
1519     } else {
1520       region2->del_req(_null_path);
1521       phi2->del_req(_null_path);
1522     }
1523 
1524     const int index_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset());
1525     const int buffer_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset());
1526     Node* thread = new ThreadLocalNode();
1527     phase->register_new_node(thread, ctrl);
1528     Node* buffer_adr = new AddPNode(phase->C->top(), thread, phase->igvn().MakeConX(buffer_offset));

1488     }
1489 
1490     Node* init_ctrl = ctrl;
1491     IdealLoopTree* loop = phase->get_loop(ctrl);
1492     Node* raw_mem = fixer.find_mem(ctrl, barrier);
1493     Node* init_raw_mem = raw_mem;
1494     Node* raw_mem_for_ctrl = fixer.find_mem(ctrl, NULL);
1495     Node* heap_stable_ctrl = NULL;
1496     Node* null_ctrl = NULL;
1497     uint last = phase->C->unique();
1498 
1499     enum { _heap_stable = 1, _heap_unstable, PATH_LIMIT };
1500     Node* region = new RegionNode(PATH_LIMIT);
1501     Node* phi = PhiNode::make(region, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
1502 
1503     enum { _fast_path = 1, _slow_path, _null_path, PATH_LIMIT2 };
1504     Node* region2 = new RegionNode(PATH_LIMIT2);
1505     Node* phi2 = PhiNode::make(region2, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
1506 
1507     // Stable path.
1508     test_gc_state(ctrl, raw_mem, heap_stable_ctrl, phase, (ShenandoahHeap::YOUNG_MARKING | ShenandoahHeap::OLD_MARKING));
1509     region->init_req(_heap_stable, heap_stable_ctrl);
1510     phi->init_req(_heap_stable, raw_mem);
1511 
1512     // Null path
1513     Node* reg2_ctrl = NULL;
1514     test_null(ctrl, pre_val, null_ctrl, phase);
1515     if (null_ctrl != NULL) {
1516       reg2_ctrl = null_ctrl->in(0);
1517       region2->init_req(_null_path, null_ctrl);
1518       phi2->init_req(_null_path, raw_mem);
1519     } else {
1520       region2->del_req(_null_path);
1521       phi2->del_req(_null_path);
1522     }
1523 
1524     const int index_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset());
1525     const int buffer_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset());
1526     Node* thread = new ThreadLocalNode();
1527     phase->register_new_node(thread, ctrl);
1528     Node* buffer_adr = new AddPNode(phase->C->top(), thread, phase->igvn().MakeConX(buffer_offset));
< prev index next >