<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I just amended the change with an extended comment on why it’s enough to track base registers only and ignore multi-register effects (like multi-registers lrg definitions and fat projections), it is subtle, but saves unnecessary work:<div class=""><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(78, 144, 114);" class=""><span style="color: rgb(0, 0, 0);" class=""><br class=""></span></div><div style="margin: 0px; font-size: 11px; font-family: Monaco; color: rgb(78, 144, 114);" class=""><div style="margin: 0px;" class=""><span style="color: #000000" class="">    </span>// We just updated the last edge, now null out the value produced by the instruction itself,</div><div style="margin: 0px;" class=""><span style="color: #000000" class="">    </span>// since we're only interested in <span style="text-decoration: underline" class="">defs</span> implicitly defined by the uses. We are actually interested</div><div style="margin: 0px;" class=""><span style="color: #000000" class="">    </span>// in tracking only redefinitions of the <span style="text-decoration: underline" class="">multidef</span> <span style="text-decoration: underline" class="">lrgs</span> in the same register. For that matter it's enough</div><div style="margin: 0px;" class=""><span style="color: #000000" class="">    </span>// to track changes in the base register only and ignore other effects of <span style="text-decoration: underline" class="">multi</span>-register <span style="text-decoration: underline" class="">lrgs</span></div><div style="margin: 0px;" class=""><span style="color: #000000" class="">    </span>// and fat projections. It is also <span style="text-decoration: underline" class="">ok</span> to ignore <span style="text-decoration: underline" class="">defs</span> coming from <span style="text-decoration: underline" class="">singledefs</span>. After an implicit</div><div style="margin: 0px;" class=""><span style="color: #000000" class="">    </span>// overwrite by one of those our register is guaranteed to be used by another <span style="text-decoration: underline" class="">lrg</span> and we won't</div><div style="margin: 0px;" class=""><span style="color: #000000" class="">    </span>// attempt to merge it.</div><div class=""><br class=""></div></div></div><div class=""><br class=""></div><div class="">I also tightened the code following the comment to do updates only for multidefs lrgs (postaloc.cpp):</div><div class=""><br class=""></div><div class=""><div style="margin: 0px; font-size: 11px; font-family: Monaco;" class="">    lrg = <span style="color: #0326cc" class="">_lrg_map</span>.live_range_id(n);</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;" class="">-    <span style="color: rgb(147, 26, 104);" class="">if</span> (lrg > 0) {</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;" class="">+    <span style="color: #931a68" class="">if</span> (lrg > 0 && lrgs(lrg).is_multidef()) {</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;" class="">      <span style="color: #006141" class="">OptoReg</span>::<span style="color: #006141" class="">Name</span> reg = lrgs(lrg).reg();</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;" class="">      <a href="http://reg2defuse.at" class="">reg2defuse.at</a>(reg).clear();</div><div style="margin: 0px; font-size: 11px; font-family: Monaco;" class="">    }</div><div class=""><div class=""><div class=""><br class=""></div><div class="">Webrev updated in place.</div><div class=""><br class=""></div><div class="">Sorry about the last minute change.</div><div class="">igor</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Jan 18, 2015, at 12:25 PM, Igor Veresov <<a href="mailto:igor.veresov@oracle.com" class="">igor.veresov@oracle.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">After register allocation we may end up with nodes in the same block using different inputs that are in fact a part of a multidef lrg. Since that would confuse the scheduler, the post-allocation copy removal attempts to select a one of the inputs and replace all the uses that refer to the same value within the block. That works most of the time except when we try to replace an input coming from a phi that has the only user. In that case the phi goes dead along with the spill copy that merges the values, which produces incorrect code. Unfortunately there is no way to make a proper selection of a reaching def - the easiest counter example is having to select from two phis.<br class=""><br class="">The solution to the problem is to introduce a node that acts like a phi but is without control (or rather something like MergeMem) that would merge the defs (that are really the same value and are a part of a multidef lrg). The following change adds a new node (MachMerge) and a pass after the post-allocation copy removal to insert them when needed. Even though it’s a separate pass it’s a very fast linear traversal.<br class=""><br class="">Webrev: <a href="http://cr.openjdk.java.net/~iveresov/8068881/webrev.01/" class="">http://cr.openjdk.java.net/~iveresov/8068881/webrev.01/</a>  <br class=""><br class="">Tested with the failing method in weblogic, jprt, CTW <br class=""><br class="">Thanks,<br class="">igor</div></blockquote></div><br class=""></div></div></div></div></body></html>