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