<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;">Hi Jonas,<div><br></div><div><div apple-content-edited="true">

</div>
<br><div><div>On Jun 11, 2014, at 11:50 AM, Lang Hames <<a href="mailto:lhames@gmail.com">lhames@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr">Hi Jonas,<div><br></div><div>> <span style="font-family:Calibri,sans-serif;font-size:15px">These operands are not supposed to be around… they are added a bit later in the method.</span></div><div><span style="font-family:Calibri,sans-serif;font-size:15px"><br>
</span></div><div><span style="font-family:Calibri,sans-serif;font-size:15px">I'm not quite sure what you mean here?</span></div><div><span style="font-family:Calibri,sans-serif;font-size:15px"><br></span></div><div><font face="Calibri, sans-serif"><span style="font-size:15px">I think that assertion is there to catch the case where a rematerialized instruction is implicitly clobbering the flags register, which is fairly common. I don't think the coalescer knows how to deal with implicit operands in general.</span></font></div>
<div><span style="font-size:15px;font-family:Calibri,sans-serif"><br></span></div><div><span style="font-size:15px;font-family:Calibri,sans-serif">Are you able to tell us anything about the nature of the instruction (and implicit use) that you're trying to rematerialize?</span></div>
<div><font face="Calibri, sans-serif"><span style="font-size:15px"><br></span></font></div><div><font face="Calibri, sans-serif"><span style="font-size:15px">Cheers,</span></font></div><div><font face="Calibri, sans-serif"><span style="font-size:15px">Lang.</span></font></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 11, 2014 at 6:42 AM, Jonas Paulsson <span dir="ltr"><<a href="mailto:jonas.paulsson@ericsson.com" target="_blank">jonas.paulsson@ericsson.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto;">





<div lang="EN-US" link="blue" vlink="purple">
<div><p class="MsoNormal">Hi,<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">I am a bit confused in the method RegisterCoalescer::reMaterializeTrivialDef().</p></div></div></blockquote></div></div></blockquote><blockquote type="cite"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto;"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">It seems that  <u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">TII->reMaterialize(*MBB, MII, DstReg, SrcIdx, DefMI, *TRI);<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">simply clones the instruction. <u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">In my case, some implicit use operands exist, so they are also added to the NewMI.<u></u></p></div></div></blockquote></div></div></blockquote><div><br></div>This method only handles trivial def. I.e., instructions that do not have any actual uses.</div><div><br></div><div>If you have implicit use operands, then the rematerialization may be wrong.</div><div>E.g..</div><div><br></div><div>v1 = remat_inst <implicit-use R3></div><div>R3 = </div><div><— If you rematerialize here you will use of different value of R3 and that may change the value of v1.</div><div><br></div><div>If the value of the implicit uses do not change the value of the def, I guess you shouldn’t specify them in the first place.</div><div>An alternative in that case is to use a pseudo instruction that you will lower with the implicit use later (though I do not see why you would need it if they do not change the result).</div><div><br></div><div>The bottom line is if you have registers uses (implicit or not), then you cannot trivially rematerialize this instruction.</div><div><br></div><div>Cheers,</div><div>-Quentin</div><div><blockquote type="cite"><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto;"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">This however, triggers the assert:<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal"><span style="font-family:"Courier New"">  // NewMI may have dead implicit defs (E.g. EFLAGS for MOV<bits>r0 on X86).<u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:"Courier New"">  // We need to remember these so we can add intervals once we insert<u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:"Courier New"">  // NewMI into SlotIndexes.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:"Courier New"">  SmallVector<unsigned, 4> NewMIImplDefs;<u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:"Courier New"">  for (unsigned i = NewMI->getDesc().getNumOperands(),<u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:"Courier New"">         </span><span lang="SV" style="font-family:"Courier New"">e = NewMI->getNumOperands(); i != e; ++i) {<u></u><u></u></span></p><p class="MsoNormal"><span lang="SV" style="font-family:"Courier New"">    </span>
<span style="font-family:"Courier New"">MachineOperand &MO = NewMI->getOperand(i);<u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:"Courier New"">    if (MO.isReg()) {<u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:"Courier New"">      <span style="background:yellow">
assert(MO.isDef() && MO.isImplicit() && MO.isDead() &&<u></u><u></u></span></span></p><p class="MsoNormal"><span style="font-family:"Courier New";background:yellow">             TargetRegisterInfo::isPhysicalRegister(MO.getReg()));</span><span style="font-family:"Courier New""><u></u><u></u></span></p><p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p><p class="MsoNormal">These operands are not supposed to be around… they are added a bit later in the method.<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">I don’t see any other targets handling these types of operands in their rematerialize() definitions. Should I override this and make sure that these implicit use ops are omitted?<u></u><u></u></p><p class="MsoNormal">Or am I missing something?<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Thanks in advance,<span class="HOEnZb"><font color="#888888"><u></u><u></u></font></span></p><span class="HOEnZb"><font color="#888888"><p class="MsoNormal"><u></u> <u></u></p><p class="MsoNormal">Jonas Paulsson<u></u><u></u></p><p class="MsoNormal"><u></u> <u></u></p>
</font></span></div>
</div>

</blockquote></div><br></div>
_______________________________________________<br>LLVM Developers mailing list<br><a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br></blockquote></div><br></div></body></html>