[LLVMdev] Controlling the order of a FunctionPass

John Criswell criswell at uiuc.edu
Fri Jul 23 07:36:19 PDT 2010

Trevor Harmon wrote:
> On Jul 22, 2010, at 2:05 PM, John Criswell wrote:
>> If you write your pass as a ModulePass, then you can iterate over the
>> functions in any order that you want.
> I had considered that, but my FunctionPass depends on other passes  
> processing the functions first:

Two things to consider:

1) The PassManager isn't currently designed to schedule prerequisite 
*transform* passes (like UnifyFunctionExitNodes).  If your pass requires 
that another transform pass be executed first, then the PassManager must 
be explicitly told (via the PassManager.add() method) to run that pass 
first.  If you're running your pass via the opt tool, then it means that 
the user must manually specify the prerequisite passes in the correct 
order (e.g., opt -load <your pass filename> -mergereturn -<your pass 
name>).  If you're building a separate program that schedules the 
passes, then it needs to run the prerequisite passes first.

See the sc tool in the SAFECode source code for an example.

2) For prerequisite *analysis* passes (like LoopInfo), your ModulePass 
can declare them as prerequisites and get access to them using the 
getAnalysis<PassName>(Function *) method.  This is documented in the 
"Writing an LLVM Pass" manual 

-- John T.

> void MyPass::getAnalysisUsage(AnalysisUsage &AU) const {
>      AU.addRequired<UnifyFunctionExitNodes>();
>      AU.addRequired<LoopInfo>();
>      AU.addPreserved<LoopInfo>();
> }
> bool MyPass::runOnFunction(Function &function) {
>      LoopInfo &loopInfo = getAnalysis<LoopInfo>();
>      ...
> }
> I don't know how to convert the above code into its equivalent form  
> for a ModulePass.
> Trevor

More information about the llvm-dev mailing list