<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 14 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
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.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-US;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
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-GB link=blue vlink=purple><div class=WordSection1><p class=MsoNormal>Hello,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>About a month ago, I submitted a set of patches for review on llvm-commit. The most controversial of the patches, <a href="http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20150622/d104ea71/attachment-0009.obj">http://lists.cs.uiuc.edu/pipermail/llvm-commits/attachments/20150622/d104ea71/attachment-0009.obj</a> deals with the fact that before ARMv8, the rGPR RegClass in Thumb encodings didn’t include SP; but from ARMv8 onwards, it does include it.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>RegClass membership is currently implemented as entirely static, driven by read-only TableGen’d tables and switch blocks encoding the various classes, subclasses, and their relationships. The approach I had taken in my patch was to include ARMGenInstrInfo.inc for a second time, after re-defining rGPRRegClassID to use a different RegClass in the same instructions. Then, Thumb2InstrInfo constructor overrides the MCInstrInfo that it inherited from ARMBaseInstrInfo with the “patched” one. (This “patching”, still, happens at compile-time.)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>As John rightly noted, this approach looks rather hacky and confusing:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoPlainText style='margin-left:36.0pt'>This isn't "rGPR includes SP" it's "rGPR is #defined to GPRnopc", which makes things really confusing if you're just looking at the .td files to figure out what's what you see instructions that use rGPR, and you see a definition of the rGPR register class, but those instructions may<o:p></o:p></p><p class=MsoPlainText style='margin-left:36.0pt'>actually be redefined to use GPRnopc due to something happening elsewhere that you haven't noticed.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>James added, “Given these instructions are no longer unpredictable the rest of the compiler should know about them too, not just the MC layer, so this is even more of a hack,” – and he suggested instead converting every instruction that takes an rGPR operand into a multiclass of two instructions, one predicated on HasV8Ops, and the other on its inverse. This isn’t practical, however: ARMInstrThumb2.td specifies several hundred individual encodings, InstAliases and match patterns that use rGPR, and all these would need to be manually duplicated.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Right now, we’re trying to come up with a more sensible approach, and perhaps one that could be useful for other targets as well.<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Any suggestions? And are there any other cases where the definition of a register class depends on target attributes?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>