1513 Node* new_val = uncasted_val;
1514 if (unc_ctrl != NULL) {
1515 // Clone the null check in this branch to allow implicit null check
1516 new_val = clone_null_check(ctrl, val, unc_ctrl, phase);
1517 fix_null_check(unc, unc_ctrl, ctrl->in(0)->as_If()->proj_out(0), uses, phase);
1518
1519 IfNode* iff = unc_ctrl->in(0)->as_If();
1520 phase->igvn().replace_input_of(iff, 1, phase->igvn().intcon(1));
1521 }
1522
1523 // Call lrb-stub and wire up that path in slots 4
1524 Node* result_mem = NULL;
1525 Node* fwd = new_val;
1526 Node* addr;
1527 if (ShenandoahSelfFixing) {
1528 VectorSet visited(Thread::current()->resource_area());
1529 addr = get_load_addr(phase, visited, lrb);
1530 } else {
1531 addr = phase->igvn().zerocon(T_OBJECT);
1532 }
1533 call_lrb_stub(ctrl, fwd, addr, result_mem, raw_mem, phase);
1534 region->init_req(_evac_path, ctrl);
1535 val_phi->init_req(_evac_path, fwd);
1536 raw_mem_phi->init_req(_evac_path, result_mem);
1537
1538 phase->register_control(region, loop, heap_stable_iff);
1539 Node* out_val = val_phi;
1540 phase->register_new_node(val_phi, region);
1541 phase->register_new_node(raw_mem_phi, region);
1542
1543 fix_ctrl(lrb, region, fixer, uses, uses_to_ignore, last, phase);
1544
1545 ctrl = orig_ctrl;
1546
1547 if (unc != NULL) {
1548 for (DUIterator_Fast imax, i = val->fast_outs(imax); i < imax; i++) {
1549 Node* u = val->fast_out(i);
1550 Node* c = phase->ctrl_or_self(u);
1551 if (u != lrb && (c != ctrl || is_dominator_same_ctrl(c, lrb, u, phase))) {
1552 phase->igvn().rehash_node_delayed(u);
|
1513 Node* new_val = uncasted_val;
1514 if (unc_ctrl != NULL) {
1515 // Clone the null check in this branch to allow implicit null check
1516 new_val = clone_null_check(ctrl, val, unc_ctrl, phase);
1517 fix_null_check(unc, unc_ctrl, ctrl->in(0)->as_If()->proj_out(0), uses, phase);
1518
1519 IfNode* iff = unc_ctrl->in(0)->as_If();
1520 phase->igvn().replace_input_of(iff, 1, phase->igvn().intcon(1));
1521 }
1522
1523 // Call lrb-stub and wire up that path in slots 4
1524 Node* result_mem = NULL;
1525 Node* fwd = new_val;
1526 Node* addr;
1527 if (ShenandoahSelfFixing) {
1528 VectorSet visited(Thread::current()->resource_area());
1529 addr = get_load_addr(phase, visited, lrb);
1530 } else {
1531 addr = phase->igvn().zerocon(T_OBJECT);
1532 }
1533 if (addr->Opcode() == Op_AddP) {
1534 Node* orig_base = addr->in(AddPNode::Base);
1535 Node* base = new CheckCastPPNode(ctrl, orig_base, orig_base->bottom_type(), true);
1536 phase->register_new_node(base, ctrl);
1537 if (addr->in(AddPNode::Base) == addr->in((AddPNode::Address))) {
1538 // Field access
1539 addr = addr->clone();
1540 addr->set_req(AddPNode::Base, base);
1541 addr->set_req(AddPNode::Address, base);
1542 phase->register_new_node(addr, ctrl);
1543 } else {
1544 Node* addr2 = addr->in(AddPNode::Address);
1545 assert(addr2->Opcode() == Op_AddP, "expected");
1546 assert(addr2->in(AddPNode::Base) == orig_base, "expected");
1547 assert(addr2->in(AddPNode::Base) == addr2->in(AddPNode::Address), "expected");
1548 addr2 = addr2->clone();
1549 addr2->set_req(AddPNode::Base, base);
1550 addr2->set_req(AddPNode::Address, base);
1551 phase->register_new_node(addr2, ctrl);
1552 addr = addr->clone();
1553 addr->set_req(AddPNode::Base, base);
1554 addr->set_req(AddPNode::Address, addr2);
1555 phase->register_new_node(addr, ctrl);
1556 }
1557 }
1558 call_lrb_stub(ctrl, fwd, addr, result_mem, raw_mem, phase);
1559 region->init_req(_evac_path, ctrl);
1560 val_phi->init_req(_evac_path, fwd);
1561 raw_mem_phi->init_req(_evac_path, result_mem);
1562
1563 phase->register_control(region, loop, heap_stable_iff);
1564 Node* out_val = val_phi;
1565 phase->register_new_node(val_phi, region);
1566 phase->register_new_node(raw_mem_phi, region);
1567
1568 fix_ctrl(lrb, region, fixer, uses, uses_to_ignore, last, phase);
1569
1570 ctrl = orig_ctrl;
1571
1572 if (unc != NULL) {
1573 for (DUIterator_Fast imax, i = val->fast_outs(imax); i < imax; i++) {
1574 Node* u = val->fast_out(i);
1575 Node* c = phase->ctrl_or_self(u);
1576 if (u != lrb && (c != ctrl || is_dominator_same_ctrl(c, lrb, u, phase))) {
1577 phase->igvn().rehash_node_delayed(u);
|