< prev index next >

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

Print this page

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

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