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