< prev index next >

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

Print this page
rev 56465 : Handle Op_Parm in get_load_addr()
rev 56466 : Clone address before LRB runtime calls, fixes implicit null-checking


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


< prev index next >