<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;}
@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.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
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";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri","sans-serif";
        mso-fareast-language:EN-GB;}
span.BalloonTextChar
        {mso-style-name:"Balloon Text Char";
        mso-style-priority:99;
        mso-style-link:"Balloon Text";
        font-family:"Tahoma","sans-serif";}
span.EmailStyle21
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle22
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:windowtext;}
span.EmailStyle23
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 129.75pt 1.0in 129.7pt;}
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 lang="EN-GB">> > Well, 'optnone' is already not identical to –O0, and given the nature of things, probably can't be<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">> It's not important to the topic but I'm curious about this since, in instruction selection at least, they both set SelectionDAGISel::OptLevel to CodeGenOpt::None and MCCodeGenInfo::OptLevel by one means or another.
 Could you point me at a difference between the two? I assume it's outside of instruction selection.<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">Without actually doing the research…  There are interactions between DAG construction, DAG Combine in particular, possibly CodeGenPrepare, and ISel, which I don't really understand. We tried to turn off all of
 DAG Combine, IIRC, but that totally didn't work, so instead we turn off individual bits and pieces.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">We made a distinct effort to find all the IR and MachineFunction passes that don't run at O0 and turn them off individually (Chandler was particularly insistent that the pass manager should not be aware of 'optnone')
 and it's always possible that we missed some; those cases should be properly considered bugs.  And of course new passes get added from time to time, and typically people don't think about 'optnone' when they're doing that… again those are properly speaking
 bugs.<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">Regarding the "circuit-breaker" analogy, 'optnone' itself is a kind of user-visible circuit breaker, and making it not break the entire circuit could be considered a little strange.  But as I said, it does seem
 like a useful debugging tactic for 'optnone' itself.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">--paulr<o:p></o:p></span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span style="color:#1F497D"><o:p> </o:p></span></a></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<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""> Daniel Sanders [mailto:Daniel.Sanders@imgtec.com]
<br>
<b>Sent:</b> Thursday, November 19, 2015 3:45 AM<br>
<b>To:</b> Robinson, Paul; llvm-dev@lists.llvm.org<br>
<b>Subject:</b> RE: Mips unconditionally uses fast-isel?<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span lang="EN-GB">> Well, 'optnone' is already not identical to –O0, and given the nature of things, probably can't be<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">It's not important to the topic but I'm curious about this since, in instruction selection at least, they both set SelectionDAGISel::OptLevel to CodeGenOpt::None and MCCodeGenInfo::OptLevel by one means or another. Could
 you point me at a difference between the two? I assume it's outside of instruction selection.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">> P.S. One nit, the "O0 + optnone" case should not have an asterisk, the FastISel flag is not manipulated if the opt level is already zero. Does not affect the strength of your argument, of course.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">Bugs aside, you're right. I made this table using the Mips target so it was switching from O2 to O0.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">I'll try to fix that everything-is-O2 bug today/tomorrow. It will probably be tomorrow due to other commitments.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">> This is a different motivation than Daniel expressed, which is a more principled idea coming from the "optnone should exactly match –O0" misconception<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB">It doesn't change anything but just for the record: While I do think that this should be true as far as possible, my opinion on -fast-isel=false is more rooted in the idea that emergency overrides shouldn't be overridable
 by normal use. As an analogy, circuit breakers shouldn't be overridable by a light switch.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<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""> Robinson, Paul [<a href="mailto:Paul_Robinson@playstation.sony.com">mailto:Paul_Robinson@playstation.sony.com</a>]
<br>
<b>Sent:</b> 18 November 2015 16:04<br>
<b>To:</b> Daniel Sanders; <a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> RE: Mips unconditionally uses fast-isel?<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><span lang="EN-GB"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Well, 'optnone' is already not identical to –O0, and given the nature of things, probably can't be; but I am persuaded that it's reasonable for it to honor the –fast-isel option as a debugging tactic.  I'll take
 an AI to make this happen.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">Thanks,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">--paulr<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D">P.S. One nit, the "O0 + optnone" case should not have an asterisk, the FastISel flag is not manipulated if the opt level is already zero. Does not affect the strength of your argument, of course.<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color:#1F497D"><o:p> </o:p></span></p>
<div style="border:none;border-left:solid blue 1.5pt;padding:0in 0in 0in 4.0pt">
<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""> Daniel Sanders [<a href="mailto:Daniel.Sanders@imgtec.com">mailto:Daniel.Sanders@imgtec.com</a>]
<br>
<b>Sent:</b> Wednesday, November 18, 2015 2:19 AM<br>
<b>To:</b> Robinson, Paul; <a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a><br>
<b>Subject:</b> RE: Mips unconditionally uses fast-isel?<o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoPlainText"><span lang="EN-GB">> </span>-----Original Message-----<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> </span>From: Robinson, Paul [<a href="mailto:Paul_Robinson@playstation.sony.com">mailto:Paul_Robinson@playstation.sony.com</a>]<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> </span>Sent: 17 November 2015 22:58<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> </span>To: Daniel Sanders; <a href="mailto:llvm-dev@lists.llvm.org">
llvm-dev@lists.llvm.org</a><span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> </span>Subject: RE: Mips unconditionally uses fast-isel?<span lang="EN-GB"><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> > > The other thing that might work, is having TargetMachine remember how<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> > > the fast-isel option got set, and make OptLevelChanger do the right<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> > > thing. But that seems like a hack to work around Mips not obeying the<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> > > specified optimization level, honestly.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> ><o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> > I think we should do that as well. I don't think it's right that optnone<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> > enables Fast ISel even when it's been explicitly disabled. It should do<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> > the same checks as addPassesToGenerateCode() does.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> Hm?  What you're asking for is that "-O2" and "-O2 -fast-isel=none" are<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> identical, unless you have an 'optnone' function. Do you really have a<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> use-case for controlling the codegen path for an 'optnone' function?<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> The whole point of 'optnone' is to avoid optimizations.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> --paulr<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB">> <o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">No, that's already true. -O2 doesn't try to enable Fast ISel (unless the optnone attribute is given) so –fast-isel=false has no effect.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">I'm saying that optnone means 'use –O0 for this function' and that optnone should<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">respect non-default values of the -fast-isel flag like –O0 does. This is the behaviour I'd expect:<o:p></o:p></span></p>
<table class="MsoNormalTable" border="0" cellspacing="0" cellpadding="0" style="border-collapse:collapse">
<tbody>
<tr>
<td width="201" valign="top" style="width:120.5pt;border:solid windowtext 1.0pt;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black"><o:p> </o:p></span></p>
</td>
<td width="164" valign="top" style="width:98.55pt;border:solid windowtext 1.0pt;border-left:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-fast-isel=false<o:p></o:p></span></p>
</td>
<td width="153" valign="top" style="width:91.8pt;border:solid windowtext 1.0pt;border-left:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-fast-isel=default<o:p></o:p></span></p>
</td>
<td width="151" valign="top" style="width:90.85pt;border:solid windowtext 1.0pt;border-left:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-fast-isel=true<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="201" valign="top" style="width:120.5pt;border:solid windowtext 1.0pt;border-top:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-O0<o:p></o:p></span></p>
</td>
<td width="164" valign="top" style="width:98.55pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG<o:p></o:p></span></p>
</td>
<td width="153" valign="top" style="width:91.8pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
<td width="151" valign="top" style="width:90.85pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="201" valign="top" style="width:120.5pt;border:solid windowtext 1.0pt;border-top:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-O0 + optnone attribute<o:p></o:p></span></p>
</td>
<td width="164" valign="top" style="width:98.55pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG*<o:p></o:p></span></p>
</td>
<td width="153" valign="top" style="width:91.8pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
<td width="151" valign="top" style="width:90.85pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="201" valign="top" style="width:120.5pt;border:solid windowtext 1.0pt;border-top:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-O1 + optnone attribute<o:p></o:p></span></p>
</td>
<td width="164" valign="top" style="width:98.55pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG*<o:p></o:p></span></p>
</td>
<td width="153" valign="top" style="width:91.8pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
<td width="151" valign="top" style="width:90.85pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="201" valign="top" style="width:120.5pt;border:solid windowtext 1.0pt;border-top:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-O2 + optnone attribute<o:p></o:p></span></p>
</td>
<td width="164" valign="top" style="width:98.55pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG*<o:p></o:p></span></p>
</td>
<td width="153" valign="top" style="width:91.8pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
<td width="151" valign="top" style="width:90.85pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="201" valign="top" style="width:120.5pt;border:solid windowtext 1.0pt;border-top:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-O3 + optnone attribute<o:p></o:p></span></p>
</td>
<td width="164" valign="top" style="width:98.55pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG*<o:p></o:p></span></p>
</td>
<td width="153" valign="top" style="width:91.8pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
<td width="151" valign="top" style="width:90.85pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="201" valign="top" style="width:120.5pt;border:solid windowtext 1.0pt;border-top:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-O1<o:p></o:p></span></p>
</td>
<td width="164" valign="top" style="width:98.55pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG<o:p></o:p></span></p>
</td>
<td width="153" valign="top" style="width:91.8pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG<o:p></o:p></span></p>
</td>
<td width="151" valign="top" style="width:90.85pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="201" valign="top" style="width:120.5pt;border:solid windowtext 1.0pt;border-top:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-O2<o:p></o:p></span></p>
</td>
<td width="164" valign="top" style="width:98.55pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG<o:p></o:p></span></p>
</td>
<td width="153" valign="top" style="width:91.8pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG<o:p></o:p></span></p>
</td>
<td width="151" valign="top" style="width:90.85pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
</tr>
<tr>
<td width="201" valign="top" style="width:120.5pt;border:solid windowtext 1.0pt;border-top:none;background:#D9D9D9;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">-O3<o:p></o:p></span></p>
</td>
<td width="164" valign="top" style="width:98.55pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG<o:p></o:p></span></p>
</td>
<td width="153" valign="top" style="width:91.8pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">SelectionDAG<o:p></o:p></span></p>
</td>
<td width="151" valign="top" style="width:90.85pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt">
<p class="MsoPlainText"><span style="color:black">FastISel<o:p></o:p></span></p>
</td>
</tr>
</tbody>
</table>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">The cells marked with '*' differ from the current behaviour.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">In terms of code, I think this part of OptLevelChanger::OptLevelChanger():<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black">   if (NewOptLevel == CodeGenOpt::None) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black">      DEBUG(dbgs() << "\nEnable FastISel for Function "<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black">            << IS.MF->getFunction()->getName() << "\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black">      IS.TM.setFastISel(true);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black">    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">Should be:<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black">    if (NewOptLevel == CodeGenOpt::None) {<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black">      DEBUG(dbgs() << "\nEnable FastISel for Function "<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black">            << IS.MF->getFunction()->getName() << "\n");<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black">      IS.TM.setFastISel(EnableFastISelOption != cl::BOU_FALSE);<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="font-family:"Courier New";color:black">    }<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">Where EnableFastISelOption has the same value as the global in LLVMTargetMachine.cpp<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black"><o:p> </o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">The main reason I'm asking for this is that I think it's weird to for optnone to use a different code generator<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">than  –O0. These hidden overrides exist to help us debug code generation problems and, faced with a code<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">generation bug, –fast-isel=false is useful for quickly determining whether it's in FastISel or somewhere else.<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">The current behaviour allows optnone to overrule the hidden option to force-disable FastISel which will give<o:p></o:p></span></p>
<p class="MsoPlainText"><span lang="EN-GB" style="color:black">misleading guidance for bugs that lie in functions with optnone.<o:p></o:p></span></p>
</div>
</div>
</div>
</div>
</body>
</html>