<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="">Hi Wei and Mikael,<div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Apr 26, 2016, at 11:16 AM, Wei Mi <<a href="mailto:wmi@google.com" class="">wmi@google.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">On Tue, Apr 26, 2016 at 11:01 AM, Wei Mi <</span><a href="mailto:wmi@google.com" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">wmi@google.com</a><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">> wrote:</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class="">+Quentin and llvm-commits.<br class=""><br class="">On Tue, Apr 26, 2016 at 1:05 AM, Mikael Holmén<br class=""><<a href="mailto:mikael.holmen@ericsson.com" class="">mikael.holmen@ericsson.com</a>> wrote:<br class=""><blockquote type="cite" class="">Hi Wei,<br class=""><br class="">On 04/26/2016 02:24 AM, Wei Mi wrote:<br class=""><blockquote type="cite" class=""><br class="">Hi Mikael, after some discussions with Quentin<br class=""><br class="">(<a href="http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20160425/350786.html" class="">http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20160425/350786.html</a>),<br class="">I think it is necessary for me to look at your testcases more closely,<br class="">because in theory the errors shouldn't happen. I must be missing<br class="">something.<br class=""><br class="">Is it possible to send out preprocessed files and the command lines to<br class="">reproduce the problems you saw?<br class=""></blockquote><br class=""><br class="">Well, this happens only when compiling for our out-of-tree target, so<br class="">unfortunately we can't do that. We need to have our hardware's set of<br class="">registers and intructions etc for the register allocator to behave exactly<br class="">the way it does for us. Maybe it's possible to reproduce this on some other<br class="">target, but from experience it's quite hard to do that with register<br class="">allocator problems. :/<br class=""><br class="">So I've compiled a bugpoint-reduced version of the code again now, with and<br class="">without your latest patch "Keep dead inst copy from being deleted only when<br class="">the inst is rematerializable", with debug printouts on.<br class=""><br class="">I added one printout in LiveRangeEdit::checkRematerializable<br class=""><br class="">+  DEBUG(dbgs() << "LiveRangeEdit::checkRematerializable: Checking<br class="">isTriviallyReMaterializable on: " << *DefMI);<br class="">  if (!TII.isTriviallyReMaterializable(DefMI, aa)) {<br class="">+     DEBUG(dbgs() << "false\n");<br class="">    return false;<br class="">  }<br class="">+   DEBUG(dbgs() << "true\n");<br class=""><br class="">and one in LiveRangeEdit::eliminateDeadDef just before your change<br class=""><br class="">+    DEBUG(dbgs() << "LiveRangeEdit::eliminateDeadDef: Checking<br class="">isTriviallyReMaterializable on: " << *MI);<br class="">+    if (TII.isTriviallyReMaterializable(MI, AA))<br class="">+      DEBUG(dbgs() << "true\n");<br class="">+    else<br class="">+      DEBUG(dbgs() << "false\n");<br class="">+<br class="">   if (isOrigDef && DeadRemats && TII.isTriviallyReMaterializable(MI, AA))<br class="">{<br class="">      LiveInterval &NewLI = createEmptyIntervalFrom(Dest);<br class="">      VNInfo *VNI = NewLI.getNextValue(Idx, LIS.getVNInfoAllocator());<br class=""><br class="">I attached the logs from the two runs.<br class=""><br class="">Note that with your patch the code compiles succesfully now, so it doesn't<br class="">seem to be totally rubbish :)<br class=""><br class="">Of course the logs now have some stuff from our backend, some instructions<br class="">and registers you don't know, but maybe you can figure out what's going on<br class="">anyway. If I can add some more printouts that you want to be able to<br class="">understand better what's happening, please don't hesitate to tell me and<br class="">I'll add and rerun.<br class=""><br class="">Thanks for looking into this,<br class="">Mikael<br class=""><br class=""></blockquote><br class="">Hi Mikael,<br class=""><br class="">Thank you very much for providing a crash log. It is very helpful. I<br class="">look at foo.crash.log and find a speciality in foo.red.ll:<br class="">The def to vreg29 at 528r is in an infinite loop. Although the def<br class="">actually has no use, it is not marked as dead and these segments:<br class="">[336B,448B:0)[528r,608B:1)[608B,720B:2) exists only because the dead<br class="">def at 528r.<br class=""><br class="">Before greedy regalloc starts:<br class="">%vreg29 [48r,336B:3)[336B,448B:0)[528r,608B:1)[608B,720B:2)[720B,976B:3)<br class="">0@336B-phi 1@528r 2@608B-phi 3@48r<br class=""><br class="">next step:<br class="">%vreg29 is splitted into %vreg31 and %vreg32.<br class=""><br class="">next step:<br class="">752B:2 libcall_CRT_ll_div_r %vreg19, %vreg19, %vreg32, %vreg1,<br class="">%a0_32<imp-def>, %a1_32<imp-def>, %CCReg<imp-def,dead>, ...;<br class="">aN32_0_7:%vreg19,%vreg32,%vreg1<br class="">is rematerialized, and %vreg32 at 312r becomes dead.<br class=""><br class="">next step:<br class="">When it deletes 312r %vreg32<def,dead> = COPY %vreg31;<br class="">aN32_0_7:%vreg32,%vreg31, it shrink the live range of vreg31.<br class="">---------- trace extracted from foo.crash.log -----------<br class="">Shrink: %vreg31 [48r,312r:0)[336B,448B:1)[528r,608B:2)[608B,720B:3)<br class="">0@48r 1@336B-phi 2@528r 3@608B-phi<br class="">live-in at 176B<br class="">Dead PHI at 336B may separate interval<br class="">All defs dead: 528r %vreg31<def,dead> = mv_ar16_ar16_lo16In32 %vreg13,<br class="">pred:0, pred:%noreg, pred:0, %ac0<imp-use>, %ac1<imp-use>;<br class="">aN32_0_7:%vreg31 aNh_0_7:%vreg13<br class="">Dead PHI at 608B may separate interval<br class="">Shrunk: %vreg31 [48r,128B:0)[176B,192r:0)[528r,528d:2)  0@48r 1@x 2@528r 3@x<br class=""> Split 2 components: %vreg31 [48r,128B:0)[176B,192r:0)[528r,528d:1)<br class="">0@48r 1@528r<br class="">Deleting dead def 528r %vreg34<def,dead> = mv_ar16_ar16_lo16In32<br class="">%vreg13, pred:0, pred:%noreg, pred:0, %ac0<imp-use>, %ac1<imp-use>;<br class="">aN32_0_7:%vreg34<br class="">---------------------------------------------------------------------<br class="">Note that %vreg34 is generated from %vreg31. When 312r is deleted, it<br class="">shrinks the live range and finds 528r is dead at the same time. !!!<br class="">But the def of 528r has no relationship with the use of %vreg31 at<br class="">312r !!!<br class=""><br class="">528r %vreg34<def,dead> = mv_ar16_ar16_lo16In32 %vreg13  is not<br class="">triviallyRematerializable, but because it is an OriginalDef, it can<br class="">satisfy the condition to go into DeadRemat. This is how we get a case<br class="">that an instruction in DeadRemat is not triviallyRematerializable.<br class=""><br class="">Thanks,<br class="">Wei.<br class=""></blockquote><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Hi Quentin,</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">From the analysis of crash report given by Mikael, the error happens</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">in a very rare case -- dead live interval and dead VNI are created</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">before regalloc, and then stay there until live range shrinking is</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">called because of remat for other unrelated uses. In such case,</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">non-triviallyRematerializable instructions can slip into DeadRemat</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">set.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">I think adding triviallyRematerializable check can guard the safety</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">for this rare case for sure, but I don't know if we have a better way</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">to remove the weird case earlier -- dead live intervals and dead VNI</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">should be removed before regalloc.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote><div><br class=""></div><div>I agree, those must be removed before regalloc.</div><div>Mikaeal, when are they introduced and why do they stick until regalloc?</div><div><br class=""></div><div>Thanks,</div><div>-Quentin</div><br class=""><blockquote type="cite" class=""><div class=""><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Thanks,</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Wei.</span></div></blockquote></div><br class=""></div></body></html>