< 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

*** 1528,1537 **** --- 1528,1562 ---- VectorSet visited(Thread::current()->resource_area()); addr = get_load_addr(phase, visited, lrb); } else { addr = phase->igvn().zerocon(T_OBJECT); } + if (addr->Opcode() == Op_AddP) { + Node* orig_base = addr->in(AddPNode::Base); + Node* base = new CheckCastPPNode(ctrl, orig_base, orig_base->bottom_type(), true); + phase->register_new_node(base, ctrl); + if (addr->in(AddPNode::Base) == addr->in((AddPNode::Address))) { + // Field access + addr = addr->clone(); + addr->set_req(AddPNode::Base, base); + addr->set_req(AddPNode::Address, base); + phase->register_new_node(addr, ctrl); + } else { + Node* addr2 = addr->in(AddPNode::Address); + assert(addr2->Opcode() == Op_AddP, "expected"); + assert(addr2->in(AddPNode::Base) == orig_base, "expected"); + assert(addr2->in(AddPNode::Base) == addr2->in(AddPNode::Address), "expected"); + addr2 = addr2->clone(); + addr2->set_req(AddPNode::Base, base); + addr2->set_req(AddPNode::Address, base); + phase->register_new_node(addr2, ctrl); + addr = addr->clone(); + addr->set_req(AddPNode::Base, base); + addr->set_req(AddPNode::Address, addr2); + phase->register_new_node(addr, ctrl); + } + } call_lrb_stub(ctrl, fwd, addr, result_mem, raw_mem, phase); region->init_req(_evac_path, ctrl); val_phi->init_req(_evac_path, fwd); raw_mem_phi->init_req(_evac_path, result_mem);
< prev index next >