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));
|