< prev index next >

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

Print this page

1464     }
1465 
1466     Node* init_ctrl = ctrl;
1467     IdealLoopTree* loop = phase->get_loop(ctrl);
1468     Node* raw_mem = fixer.find_mem(ctrl, barrier);
1469     Node* init_raw_mem = raw_mem;
1470     Node* raw_mem_for_ctrl = fixer.find_mem(ctrl, NULL);
1471     Node* heap_stable_ctrl = NULL;
1472     Node* null_ctrl = NULL;
1473     uint last = phase->C->unique();
1474 
1475     enum { _heap_stable = 1, _heap_unstable, PATH_LIMIT };
1476     Node* region = new RegionNode(PATH_LIMIT);
1477     Node* phi = PhiNode::make(region, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
1478 
1479     enum { _fast_path = 1, _slow_path, _null_path, PATH_LIMIT2 };
1480     Node* region2 = new RegionNode(PATH_LIMIT2);
1481     Node* phi2 = PhiNode::make(region2, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
1482 
1483     // Stable path.
1484     test_gc_state(ctrl, raw_mem, heap_stable_ctrl, phase, ShenandoahHeap::MARKING);
1485     region->init_req(_heap_stable, heap_stable_ctrl);
1486     phi->init_req(_heap_stable, raw_mem);
1487 
1488     // Null path
1489     Node* reg2_ctrl = NULL;
1490     test_null(ctrl, pre_val, null_ctrl, phase);
1491     if (null_ctrl != NULL) {
1492       reg2_ctrl = null_ctrl->in(0);
1493       region2->init_req(_null_path, null_ctrl);
1494       phi2->init_req(_null_path, raw_mem);
1495     } else {
1496       region2->del_req(_null_path);
1497       phi2->del_req(_null_path);
1498     }
1499 
1500     const int index_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset());
1501     const int buffer_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset());
1502     Node* thread = new ThreadLocalNode();
1503     phase->register_new_node(thread, ctrl);
1504     Node* buffer_adr = new AddPNode(phase->C->top(), thread, phase->igvn().MakeConX(buffer_offset));

1464     }
1465 
1466     Node* init_ctrl = ctrl;
1467     IdealLoopTree* loop = phase->get_loop(ctrl);
1468     Node* raw_mem = fixer.find_mem(ctrl, barrier);
1469     Node* init_raw_mem = raw_mem;
1470     Node* raw_mem_for_ctrl = fixer.find_mem(ctrl, NULL);
1471     Node* heap_stable_ctrl = NULL;
1472     Node* null_ctrl = NULL;
1473     uint last = phase->C->unique();
1474 
1475     enum { _heap_stable = 1, _heap_unstable, PATH_LIMIT };
1476     Node* region = new RegionNode(PATH_LIMIT);
1477     Node* phi = PhiNode::make(region, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
1478 
1479     enum { _fast_path = 1, _slow_path, _null_path, PATH_LIMIT2 };
1480     Node* region2 = new RegionNode(PATH_LIMIT2);
1481     Node* phi2 = PhiNode::make(region2, raw_mem, Type::MEMORY, TypeRawPtr::BOTTOM);
1482 
1483     // Stable path.
1484     test_gc_state(ctrl, raw_mem, heap_stable_ctrl, phase, (ShenandoahHeap::YOUNG_MARKING | ShenandoahHeap::OLD_MARKING));
1485     region->init_req(_heap_stable, heap_stable_ctrl);
1486     phi->init_req(_heap_stable, raw_mem);
1487 
1488     // Null path
1489     Node* reg2_ctrl = NULL;
1490     test_null(ctrl, pre_val, null_ctrl, phase);
1491     if (null_ctrl != NULL) {
1492       reg2_ctrl = null_ctrl->in(0);
1493       region2->init_req(_null_path, null_ctrl);
1494       phi2->init_req(_null_path, raw_mem);
1495     } else {
1496       region2->del_req(_null_path);
1497       phi2->del_req(_null_path);
1498     }
1499 
1500     const int index_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_index_offset());
1501     const int buffer_offset = in_bytes(ShenandoahThreadLocalData::satb_mark_queue_buffer_offset());
1502     Node* thread = new ThreadLocalNode();
1503     phase->register_new_node(thread, ctrl);
1504     Node* buffer_adr = new AddPNode(phase->C->top(), thread, phase->igvn().MakeConX(buffer_offset));
< prev index next >