[LLVMdev] (Possibly buggy?) doFinalization method behavior of FunctionPass

John Criswell jtcriswel at gmail.com
Wed May 6 09:01:48 PDT 2015


On 5/6/15 11:15 AM, Kuperstein, Michael M wrote:
>
> 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.
>
> 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.
>

Correct.  You're guaranteed that doFinalization() is run after your pass 
has been executed over all the functions.  There's no guarantees about 
what other passes are going to do either before or after 
doFinalization() is called.

Therefore, it's fine for doFinalization() to modify the Module.  You 
just have to be aware that other passes may change the Module later. 
That's why I asked whether there are any other passes executed after 
Cristianno's pass: they can (theoretically) add the function 
declarations back into the Module.

Regards,

John Criswell

> People more familiar with the pass managers – please correct me if I’m 
> wrong.
>
> Michael
>
> *From:*John Criswell [mailto:jtcriswel at gmail.com]
> *Sent:* Wednesday, May 06, 2015 17:29
> *To:* Kuperstein, Michael M; Cristianno Martins; Lista LLVM-dev
> *Subject:* Re: [LLVMdev] (Possibly buggy?) doFinalization method 
> behavior of FunctionPass
>
> On 5/6/15 10:19 AM, Kuperstein, Michael M wrote:
>
>     Hello Cristiano,
>
>     I don’t think doFinalization() is really meant to be used this way.
>
>
> 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)?
>
> If that is not the case, then there is either a bug in the code or a 
> bug in the documentation.
>
> 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.
>
> Regards,
>
> John Criswell
>
>
> Its purpose is to allow clean-up of internal data-structures used by 
> the pass itself, not to make additional changes to the module.
>
> 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.
>
> Michael
>
> *From:* llvmdev-bounces at cs.uiuc.edu 
> <mailto:llvmdev-bounces at cs.uiuc.edu> 
> [mailto:llvmdev-bounces at cs.uiuc.edu] *On Behalf Of *Cristianno Martins
> *Sent:* Wednesday, May 06, 2015 03:20
> *To:* Lista LLVM-dev
> *Subject:* [LLVMdev] (Possibly buggy?) doFinalization method behavior 
> of FunctionPass
>
> Hello there,
>
> I'm writing some LLVM passes, and just ran into an interesting 
> situation: now, I don't know if I misunderstood the way doFinalization 
> is supposed to work, but I hope someone could help =)
>
> One of the transformations I wrote needed to replace some instructions 
> within the code, so I needed to clean up the code after the process 
> was completed. The pass basically swapped some function calls (from 
> the standard C library) with my own implementation of those functions. 
> Changing the code in this way, though, creates some dead code (like 
> those dead prototypes that are not being used anymore).
>
> I, then, implemented the "clean up" strategy overriding 
> doFinalization. Unfortunately, any modifications done to the module in 
> this method appears to be ignored by LLVM. I even dumped the module 
> directly from within the method, and could see that the modifications 
> were applied to that reference of the module, but the .bc file opt 
> wrote into does not retain these changes.
>
> Now, bear with me here: I know that other passes like DCE could be 
> used to clean the bytecode, but some of the code I implemented in 
> doFinalization actually needed to run only once, and necessarily after 
> the pass has finished: this is where I check to see if there is some 
> extra situation I need to address, optimize some of the replaced 
> instructions, and verify if any of the functions that I want to remove 
> had their addresses taken by any instruction.
>
> Also, doFinalization has a bool return type, but it doesn't appear to 
> have any different behavior if I return either value =/ (I assumed the 
> general idea would be "return true if the module was modified in any 
> way", like runOnFunction, but I couldn't find anything to support that 
> anywhere).
>
> Thus, am I wrong about how to use doFinalization? If so, is there any 
> way to guarantee running some code only once and only when a pass 
> already finished its job?
>
> Thanks in advance,
>
> Oh, and before I forget, this is the version of the opt I'm running:
>
> LLVM (http://llvm.org/):
>
>   LLVM version 3.7.0svn
>
>   DEBUG build with assertions.
>
>   Built May  4 2015 (00:18:21).
>
>   Default target: x86_64-apple-darwin14.3.0
>
>   Host CPU: sandybridge
>
>
> --
> Cristianno Martins
> PhD Student of Computer Science
> University of Campinas
> cmartins at ic.unicamp.br <mailto:cmartins at ic.unicamp.br>
>
> ---------------------------------------------------------------------
> Intel Israel (74) Limited
>
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu  <mailto:LLVMdev at cs.uiuc.edu>          http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
>
> -- 
> John Criswell
> Assistant Professor
> Department of Computer Science, University of Rochester
> http://www.cs.rochester.edu/u/criswell
>
> ---------------------------------------------------------------------
> Intel Israel (74) Limited
>
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
>


-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
http://www.cs.rochester.edu/u/criswell

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150506/07829056/attachment.html>


More information about the llvm-dev mailing list