<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 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:0cm;
        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;}
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";}
.MsoPapDefault
        {mso-style-type:export-only;
        line-height:115%;}
@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-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I think it’s wrongly documented. :-)<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"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">As a side note, I believe requiring transformation passes (as opposed to requiring analysis passes) is also not-quite-supported.<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:10.0pt;font-family:"Tahoma","sans-serif"">From:</span></b><span style="font-size:10.0pt;font-family:"Tahoma","sans-serif""> Cristianno Martins [mailto:cristiannomartins@gmail.com]
<br>
<b>Sent:</b> Wednesday, May 06, 2015 19:16<br>
<b>To:</b> Kuperstein, Michael M<br>
<b>Cc:</b> John Criswell; Lista LLVM-dev<br>
<b>Subject:</b> Re: [LLVMdev] (Possibly buggy?) doFinalization method behavior of FunctionPass<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal" style="line-height:115%">Btw, I forgot to add this piece of information: I ended up dividing the work of my pass into two parts -- I created a module pass that had all the transformation instructions that didn't have anything to do with
 dominance, and I kept the dominance-dependent code inside a function pass. Then, I just had to force a dependence between them (the function pass requiring the module one), and this way I could apply my transformations.<o:p></o:p></p>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%">Anyways, I still think doFinalization is wrongly defined or, at least, implemented, as I tried to discuss on my previous email =)<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%">Thanks a lot,<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><br clear="all">
<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="line-height:115%"><br>
--<br>
Cristianno Martins<br>
PhD Student of Computer Science<br>
University of Campinas<br>
<a href="mailto:cmartins@ic.unicamp.br" target="_blank">cmartins@ic.unicamp.br</a><o:p></o:p></p>
</div>
</div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
<div>
<p class="MsoNormal" style="line-height:115%">On Wed, May 6, 2015 at 1:11 PM, Cristianno Martins <<a href="mailto:cristiannomartins@gmail.com" target="_blank">cristiannomartins@gmail.com</a>> wrote:<o:p></o:p></p>
<div>
<p class="MsoNormal" style="line-height:115%">Hello again,<o:p></o:p></p>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%">First of all, thanks for all the answers =) they really helped a lot =D<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
<blockquote style="margin-left:30.0pt;margin-right:0cm">
<div>
<p class="MsoNormal" style="line-height:115%"><i><span style="font-size:10.0pt;line-height:115%">Have you verified that some other pass is not adding the function declarations back in after your pass is executed (e.g., by using the -debug-pass=Executions argument
 to see what passes run after your pass)?</span></i><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
</blockquote>
<p class="MsoNormal" style="line-height:115%">I considered that for a moment, but I realized that wouldn't be possible for two reasons: I specifically ran my pass with opt level zero; and one of the tasks I was doing was removing unused prototypes from the
 Module -- so, why would any other doFinalization pass reintroduce those prototypes if those functions were not being invoked anywhere? (PS: since this clean-up happened inside my doFinalization, I'm assuming only other doFinalization would be able to change
 the module after this point)<o:p></o:p></p>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><i><span style="font-size:10.0pt;line-height:115%">Also, does your doFinalization() method make other changes that are persistent?</span></i><o:p></o:p></p>
</div>
<blockquote style="margin-left:30.0pt;margin-right:0cm">
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</blockquote>
<div>
<div>
<p class="MsoNormal" style="line-height:115%">The main reason why I chose to use doFinalization was to check if any of the functions I'm replacing still had any uses: since my pass replaced every function call with my respective function calls, if any uses
 could still be listed, that meant that some instruction must be taking the address of that function, and I should treat those instructions at this point. At the end, since I was already checking for uses, I ended up removing the extra prototypes at this point,
 if they were still there.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
<div>
<blockquote style="margin-left:30.0pt;margin-right:0cm">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I don’t think doFinalization() is really meant to be used this way.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">Its purpose is to allow clean-up of internal data-structures used by the pass itself, not to make additional changes to the module.</span><o:p></o:p></p>
</div>
</blockquote>
<p class="MsoNormal" style="line-height:115%"> <o:p></o:p></p>
<div>
<p class="MsoNormal" style="line-height:115%">Then, I have a question: why should doFinalization need a Module& as argument? I mean, since I shouldn't be able to modify it, and all data structures I created to work my pass are known and (mostly) directly accessible
 from within doFinalization, its argument would never be useful, right?<o:p></o:p></p>
</div>
<div>
<blockquote style="margin-left:30.0pt;margin-right:0cm">
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">One option would be to rewrite your pass as a ModulePass instead of a FunctionPass, then iterating over the functions manually, and doing the final clean-up
 once that’s done.</span><o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><i><span style="font-size:10.0pt;line-height:115%">That said, I agree with the suggestion of writing a ModulePass.  Since the PassManager does not run FunctionPasses in parallel yet, there's little benefit to using
 them.  I have often found the limitations on FunctionPasses to not be worth the hassle.</span></i><o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
</blockquote>
</div>
</div>
<div>
<div>
<p class="MsoNormal" style="line-height:115%">Well, I actually wouldn't mind using a ModulePass to begin with, but unfortunately I had to rewrite my pass as a FunctionPass because part of the job it does involve accessing the DominatorTree -- and, unfortunately,
 I couldn't find a way to access it from inside a ModulePass. Even when I try to force a dependence between my module pass and DominatorTree, I can't get it to work because (if I'm not mistaken) module passes are hard-coded to run before function passes =/<o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
</div>
<blockquote style="margin-left:30.0pt;margin-right:0cm">
<div>
<div>
<p class="MsoNormal" style="line-height:115%"><i><span style="font-size:10.0pt;line-height:115%">My understanding is that doInitialization() and doFinalization() are designed specifically for modifying the LLVM IR (otherwise, why would a mutable reference to
 the Function be provided)?</span></i><o:p></o:p></p>
</div>
</div>
</blockquote>
<blockquote style="margin-left:30.0pt;margin-right:0cm">
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal" style="line-height:115%"><i><span style="font-size:10.0pt;line-height:115%">If that is not the case, then there is either a bug in the code or a bug in the documentation.</span></i><o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
</blockquote>
<p class="MsoNormal" style="line-height:115%">Exactly like I thought =)<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">I’ve always thought that the only guarantee is that doFinalization(Module &M) runs after runOnFunction() was executed for all functions in M, and there’s no
 guarantee it runs *immediately* after. </span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">That is, a PM may run a bunch of function passes over each function, and only then call doFinazliation() for each pass. That means that, even though you get
 a mutable reference to the module, the module you’ll see is quite different from what you may expect.</span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D"> </span><span style="color:black"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;font-family:"Calibri","sans-serif";color:#1F497D">People more familiar with the pass managers – please correct me if I’m wrong.</span><span style="color:black"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><span style="font-size:11.5pt;line-height:115%;font-family:"Calibri","sans-serif";color:#1F497D"><o:p> </o:p></span></p>
</div>
<p class="MsoNormal" style="line-height:115%">I don't really mind at all if other passes run or even had their doFinalization passes running in any order in relation to mine: the point here is doFinalization is running (I know that because module.dump() is
 being called from inside that function, and I can see the module containing the modifications I do during the execution of that method), but the final bc file (written by opt) does have the exactly same code that I get if I dumped module at the beginning of
 my doFinalization (and they have differences between them btw =)).<o:p></o:p></p>
<div>
<div>
<p class="MsoNormal" style="line-height:115%"><span style="color:#500050"> </span><o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
<div>
<div>
<div>
<div>
<p class="MsoNormal" style="line-height:115%">--<br>
Cristianno Martins<br>
PhD Student of Computer Science<br>
University of Campinas<br>
<a href="mailto:cmartins@ic.unicamp.br" target="_blank">cmartins@ic.unicamp.br</a><o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
</div>
</div>
</div>
</div>
<p class="MsoNormal" style="line-height:115%"><o:p> </o:p></p>
</div>
</div>
<p>---------------------------------------------------------------------<br>
Intel Israel (74) Limited</p>

<p>This e-mail and any attachments may contain confidential material for<br>
the sole use of the intended recipient(s). Any review or distribution<br>
by others is strictly prohibited. If you are not the intended<br>
recipient, please contact the sender and delete all copies.</p></body>
</html>