<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=utf-8">
<meta name="Generator" content="Microsoft Word 15 (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;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman",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.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:12.0pt;
        font-family:"Times New Roman",serif;}
span.EmailStyle17
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@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">> I don't think I can help this discussion, but I would like to understand the context of it.<o:p></o:p></p>
<p class="MsoNormal">> Do we have any requirements?<o:p></o:p></p>
<p class="MsoNormal">> What are the use cases that "opt-bisect" is intended to help with?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Basically, it’s meant to help isolate the pass that introduced problems that occur in optimized code. I mainly use it to debug failures that occur when a program is run, but it’s a pretty general facility and can be used in many ways.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">It’s documented here: https://llvm.org/docs/OptBisect.html<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> Q1) Take LLVM IR instruction X.<o:p></o:p></p>
<p class="MsoNormal">> Which pass removed it (optimized it out) ?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Opt-bisect, combined with the bisect script in utils, can help with this. You’d need to provide some script that knows how to detect the IR change you’re interested in. I’ve used opt-bisect for this. I think you can do this with bugpoint
 too, but you wouldn’t enjoy it.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> Q2) Take LLVM IR instruction X.<o:p></o:p></p>
<p class="MsoNormal">> Run pass Y once. Leaves instruction X in there.<o:p></o:p></p>
<p class="MsoNormal">> Run pass Y a second time should not then remove instruction X.<o:p></o:p></p>
<p class="MsoNormal">> My thinking that if pass Y was doing its job correctly, it should have removed instruction X on the first pass Y. i.e. pass Y should not be lazy.<o:p></o:p></p>
<p class="MsoNormal">> One problem with the "lazy" approach, is "How many times should pass Y be run?"<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I don’t think opt-bisect helps with this.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">> Q3) Do any LLVM IR passes do delayed instruction elimination?<o:p></o:p></p>
<p class="MsoNormal">> I.e.<o:p></o:p></p>
<p class="MsoNormal">> Pass 1 marks some instructions for removal.<o:p></o:p></p>
<p class="MsoNormal">> Pass 2 marks some more instructions for removal.<o:p></o:p></p>
<p class="MsoNormal">> Pass 3 actually removes the instructions. (the expensive bit where caches, indexes etc. need rebuilding)<o:p></o:p></p>
<p class="MsoNormal">> I only mention this Q3, because I think it could affect the way opt-bisect should work. (see Q1 above) Should the answer be Pass 1 or Pass 3 ?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I don’t believe this kind of dependency between passes is supposed to happen.  There are some gray areas, I guess, like one pass can add metadata that another pass interprets in such a way that it decides to delete instructions. In any
 event, the IR should be complete and legal after each pass, so if someone decides to implement passes this way I think they’re on their own determined what to make of the opt-bisect results.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">-Andy<o:p></o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></p>
<p class="MsoNormal"><a name="_MailEndCompose"><span style="font-size:11.0pt;font-family:"Calibri",sans-serif;color:#1F497D"><o:p> </o:p></span></a></p>
<p class="MsoNormal"><b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif">From:</span></b><span style="font-size:11.0pt;font-family:"Calibri",sans-serif"> James Courtier-Dutton [mailto:james.dutton@gmail.com]
<br>
<b>Sent:</b> Friday, September 28, 2018 3:07 PM<br>
<b>To:</b> fedor.sergeev@azul.com<br>
<b>Cc:</b> llvm-dev <llvm-dev@lists.llvm.org>; zhizhouy@google.com; dag@cray.com; David Blaikie <dblaikie@gmail.com>; Kaylor, Andrew <andrew.kaylor@intel.com>; chandlerc@gmail.com<br>
<b>Subject:</b> Re: [llvm-dev] OptBisect implementation for new pass manager<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<div>
<p class="MsoNormal">On Wed, 26 Sep 2018 at 17:54, Fedor Sergeev via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<p class="MsoNormal" style="margin-bottom:12.0pt">Greetings!<br>
<br>
As the generic Pass Instrumentation framework for new pass manager is <br>
finally *in*,<br>
I'm glad to start the discussion on implementation of -opt-bisect <br>
through that framework.<br>
<br>
<o:p></o:p></p>
</blockquote>
<div>
<p class="MsoNormal">I don't think I can help this discussion, but I would like to understand the context of it.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Do we have any requirements?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">What are the use cases that "opt-bisect" is intended to help with?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Some use cases that I would like to understand are:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Q1) Take LLVM IR instruction X.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Which pass removed it (optimized it out) ?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Q2) Take LLVM IR instruction X.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Run pass Y once. Leaves instruction X in there.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Run pass Y a second time should not then remove instruction X.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">My thinking that if pass Y was doing its job correctly, it should have removed instruction X on the first pass Y. i.e. pass Y should not be lazy.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">One problem with the "lazy" approach, is "How many times should pass Y be run?"<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Q3) Do any LLVM IR passes do delayed instruction elimination?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">I.e.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Pass 1 marks some instructions for removal.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Pass 2 marks some more instructions for removal.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Pass 3 actually removes the instructions. (the expensive bit where caches, indexes etc. need rebuilding)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">I only mention this Q3, because I think it could affect the way opt-bisect should work. (see Q1 above) Should the answer be Pass 1 or Pass 3 ?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Is opt-bisect something that can help with these use cases?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Kind Regards<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">James<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</body>
</html>