< prev index next >
src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp
Print this page
rev 56465 : [mq]: fix.patch
rev 56466 : [mq]: fix-addr.patch
*** 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);
*** 1777,1786 ****
--- 1802,1812 ----
case Op_CallDynamicJava:
case Op_CallLeaf:
case Op_CallStaticJava:
case Op_ConN:
case Op_ConP:
+ case Op_Parm:
return phase->igvn().zerocon(T_OBJECT);
default:
#ifdef ASSERT
in->dump();
ShouldNotReachHere();
< prev index next >