<div class="__aliyun_email_body_block"><div  style="line-height:1.7;font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14.0px;color:#000000;"><div  style="clear:both;">Hi Tobias,</div><div  style="clear:both;"><br ></div><div  style="clear:both;"> I made the change to check with RegionNode::is_copy, could you check the new patch?</div><div  style="clear:both;"><br ></div><div  style="clear:both;">diff --git a/src/hotspot/share/opto/graphKit.cpp b/src/hotspot/share/opto/graphKit.cpp</div><div  style="clear:both;">index 068141f..884a76c 100644</div><div  style="clear:both;">--- a/src/hotspot/share/opto/graphKit.cpp</div><div  style="clear:both;">+++ b/src/hotspot/share/opto/graphKit.cpp</div><div  style="clear:both;">@@ -2126,7 +2126,15 @@ void GraphKit::uncommon_trap(int trap_request,</div><div  style="clear:both;"> // We use this to determine if an object is so "fresh" that</div><div  style="clear:both;"> // it does not require card marks.</div><div  style="clear:both;"> Node* GraphKit::just_allocated_object(Node* current_control) {</div><div  style="clear:both;">-  if (C->recent_alloc_ctl() == current_control)</div><div  style="clear:both;">+  Node * ctrl = current_control;</div><div  style="clear:both;">+  // Object::<init> is invoked after allocation, most of invoke nodes</div><div  style="clear:both;">+  // will be reduced, but a region node is kept in parse time, we check</div><div  style="clear:both;">+  // the pattern and skip the region node</div><div  style="clear:both;">+  if (ctrl != NULL && ctrl->is_Region() && ctrl->as_Region()->is_copy()) {</div><div  style="clear:both;">+    assert(ctrl->req() == 2, "copy region has only 2 inputs");</div><div  style="clear:both;">+    ctrl = ctrl->as_Region()->is_copy();</div><div  style="clear:both;">+  }</div><div  style="clear:both;">+  if (C->recent_alloc_ctl() == ctrl)</div><div  style="clear:both;">     return C->recent_alloc_obj();</div><div  style="clear:both;">   return NULL;</div><div  style="clear:both;"> }</div><div  style="clear:both;"></div><div  style="clear:both;">Thanks, </div><div  style="clear:both;">Kevin</div><blockquote  style="margin-right:.0px;margin-top:.0px;margin-bottom:.0px;font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14.0px;color:#000000;"><div  style="clear:both;">------------------------------------------------------------------</div><div  style="clear:both;">From:蒯微(麦庶) <kuaiwei.kw@alibaba-inc.com></div><div  style="clear:both;">Send Time:2018年9月25日(星期二) 21:50</div><div  style="clear:both;">To:Tobias Hartmann <tobias.hartmann@oracle.com>; hotspot compiler <hotspot-compiler-dev@openjdk.java.net></div><div  style="clear:both;">Cc:李三红(三红) <sanhong.lsh@alibaba-inc.com></div><div  style="clear:both;">Subject:回复:回复:[Patch] 8210853: C2 doesn't skip post barrier for new allocated objects</div><div  style="clear:both;"><br ></div><div  style="line-height:1.7;font-family:Tahoma,Arial,STHeiti,SimSun;font-size:14.0px;color:#000000;"><div  style="clear:both;">Hi Tobias,</div><div  style="clear:both;"><br ></div><div  style="clear:both;">  Thanks for your comments. I will check RegionNode::is_copy to see if it can be used to detect </div><div  style="clear:both;">unnecessary region node. I will send new review after testing.</div><div  style="clear:both;"><br ></div><div  style="clear:both;">Best Regards,</div><div  style="clear:both;">Kevin</div><div  style="clear:both;"><br ></div><div  style="clear:both;">------------------------------------------------------------------</div><div  style="clear:both;">发件人:Tobias Hartmann <tobias.hartmann@oracle.com></div><div  style="clear:both;">发送时间:2018年9月24日(星期一) 21:34</div><div  style="clear:both;">收件人:蒯微(麦庶) <kuaiwei.kw@alibaba-inc.com>; hotspot compiler <hotspot-compiler-dev@openjdk.java.net></div><div  style="clear:both;">抄 送:李三红(三红) <sanhong.lsh@alibaba-inc.com></div><div  style="clear:both;">主 题:Re: 回复:[Patch] 8210853: C2 doesn't skip post barrier for new allocated objects</div><div  style="clear:both;"><br ></div>Hi Kevin,<br ><br >On 24.09.2018 08:06, Kuai Wei wrote:<br >>   Thanks for your suggestion. I think your point is the region node may have new path in later parse<br >> phase, so we can not make sure the region node will be optimized.<br ><br >Yes, my point is that a new path to the region might be added after your optimization and that path<br >might contain stores to the newly allocated object.<br ><br >>   It's a good question and I checked it. Now I think it may not cause trouble. In post barrier<br >> reduce, the oop store use allocation node as base pointer. The data graph guarantee control of<br >> allocation node should dominate control of store. If allocation node is in pred of region node and<br >> there's a new path into region, the graph is bad because we can reach store without allocation.<br ><br >Yes but the new path might be a backedge from a loop that is dominated by the allocation.<br ><br >> If allocation node is in a domination ancestor, the graph shape is a little complicated, so we can not<br >> reach control of allocation by skipping one region.<br ><br >Right, that's basically the implicit assumption of your patch. I'm not sure if it always holds. But<br >I think you should at least use RegionNode::is_copy().<br ><br >Let's see what other reviewers think.<br ><br >>   The better solution is we can know the region node is created in exit_map and we will not change<br >> it in later. Is there any way to know it in compile time?<br ><br >The region node is created in Parse::build_exits(). I don't think there is a way to keep track of this.<br ><br >Thanks,<br >Tobias</div></blockquote></div></div>