<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 12 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
p.MsoAcetate, li.MsoAcetate, div.MsoAcetate
        {mso-style-priority:99;
        mso-style-link:"Balloon Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:8.0pt;
        font-family:"Tahoma","sans-serif";}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="color:#1F497D">I think I have answered my own question again,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">I will use a CustomInserter to create my own MachineInstruction for my LEA instruction,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">that way I can call BuildMI myself, and add whatever operands are needed,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">with whatever TiedTo information is needed.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">I have looked into the register allocator’s “TwoOperandInstructionPass.cpp”,
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">and it does not look up any information in the “XyzGenInstrInfo.inc” OperandInfo tables,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">rather CodeGen (or in my case my CustomInserter) puts the necessary info into the<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">MachineOperand, and RA gets it from there.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">so the fact that the generated OperandInfo table has the wrong operand type<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">(Memory, when Register is needed) won’t matter.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">-Peter Lawrence.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Lawerence, Peter
<br>
<b>Sent:</b> Tuesday, November 24, 2015 11:27 AM<br>
<b>To:</b> 'llvm-dev@lists.llvm.org'<br>
<b>Subject:</b> RE: Qs about TwoOperandAliasConstraint and TIED_TO<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="color:#1F497D">I think I have answered my own questions below, but now have additional questions,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">I am now using :      let Constraints = “$src = $dst”;       following examples from X86,
<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">rather than TwoOperandAliasConstraint  that I had been following from Mips,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">and I am now seeing TIED_TO in my  GenInstrInfo.inc  for the appropriate OperandInfo’s,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">but I am still seeing assembly code emitted that violates this constraint,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">what else am I missing ?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">thanks, Peter Lawrence.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">the only thing I see that is out-of-the-ordinary in my GenInstrInfo.inc is<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">the OPERAND_MEMORY rather than OPERAND_REGISTER for my base-register operand<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">and OPERAND_MEMORY rather than OPERAND_IMMEDIATE for my offset operand,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">but am still not sure how that happens or what to do to fix it ?<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">static const MCOperandInfo OperandInfo25[] = {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">     { Xmc::AddrRegsRegClassID, 0, MCOI::OPERAND_REGISTER, 0 },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">     { Xmc::AddrRegsRegClassID, 0, MCOI::OPERAND_MEMORY, ((0 << 16) | (1 << MCOI::TIED_TO)) },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">     { -1, 0, MCOI::OPERAND_MEMORY, 0 }, };<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">I seem to be between a rock and a hard place:<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">let OperandType = "OPERAND_MEMORY" in {                           <----- I suspect my MEMORY_OPERAND comes from this<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">def memri     : Operand<iPTR> {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">  let MIOperandInfo = (ops addrreg:$base, i16imm:$offset); }<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">def LEA : FMT_I6 <0x4c00, (outs addrreg:$dst), (ins memri:$addr), <----- I suspect the fix would be to split the memri<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">                                                                   ----- into separate reg and imm “ins” operands,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">                "lea $dst, ${addr:arith}",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">               [(set iPTR:$dst, addrri:$addr)]> {                 <----- but then I would not be able to write this pattern<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">                                                                   ----- and ISel would fail ?????<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">  let Constraints = "$addr.base = $dst";<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">  let isCodeGenOnly = 1;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New";color:#1F497D">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">-- Sleepless in Silicon Valley...<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Lawerence, Peter
<br>
<b>Sent:</b> Monday, November 23, 2015 3:37 PM<br>
<b>To:</b> 'llvm-dev@lists.llvm.org'<br>
<b>Subject:</b> Qs about TwoOperandAliasConstraint and TIED_TO<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">in  llvm-3.6.2.src<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">1.   when I put this around one of my instruction definitions in my target “InstrInfo.td” file,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">let TwoOperandAliasConstraint = "$dst = $rs1" in {<o:p></o:p></p>
<p class="MsoNormal">}<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I do not see any TIED_TO in the generated GenInstrInfo.inc file for the OperandInfo used by the instruction,<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">the question is what am I doing wrong ?<o:p></o:p></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> you are doing nothing wrong, the same thing happens for Mips,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> all its’ ArithLogicR and ArithLogicI instructions have    let TwoOperandAliasConstraint = “$rd = $rs”;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> but if you look at MipsGenInstrInfo.inc<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> AND, OR, XOR, ADD, SUB, ADDu, SUBu, etc..., use OperandInfo14 does not contain any TIED_TO<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> ANDi, ORi, XORi, ADDi, SUBi, ADDui, SUBui, etc..., use OperandInfo29 does not contain any TIED_TO<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> there is probably a bug somewhere in utils/TableGen/<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> this is probably working for Mips in the case of ArithLogicR, since those instructions really are 3-operand<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> but it is mysterious how RA gets it right for the ArithLogicI case, since those instructions really are 2-operand<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> IMHO, from a Software Engineering point of view TwoOperandAliasConstraint should either be fixed or deleted,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> currently it is misleading, and in a target-description that should be usable as a reference design<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> (as Mips can be viewed as the quintessential RISC instruction set),  at least I tried to use it as such.<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">2.    I’ve noticed that TwoOperandAliasConstraint does not appear anywhere in   source/lib/Target/X86/*<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">yet  TIED_TO occurs in 162 of the  OperandInfo’s in   build/lib/Target/X86/X86GenInstrInfo.inc<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">the question is how does TIED_TO happen if not by  TwoOperandAliasConstraint  ?<o:p></o:p></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> searching X86InstrInfo.td and X86GenInstrInfo.inc it is seems that<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">--->     let Constraints = “$src = $dst”;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">---> gets recognized by TableGen and converted into a TIED_TO constraint<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">thanks, Peter Lawrence.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>