< prev index next >

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

Print this page

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

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