< 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,10 +1528,35 @@
       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,10 +1802,11 @@
     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 >