dynamic passes

Is it possible to dynamically add and remove passes once llc starts to run?

Currently I have to add some machine function passes and only once they are running, I have them return right away because they are not relevant at that time. For example, mips16 does not use the delay slot optimizer but now I would need to add the pass all the time just in case someone specified that a particular function be compiled as mips32.

It seems from the pass manager that you can add and subtract passes but I was unclear as to whether this was something you have to do before the pass manager starts to run passes.



I think you will have to add the passes anyway before asking the pass manager object to run.
In addition, you can specify some dependency, so that that non relevant pass will not have a chance to run. The PassManager should be able to figure that out given the runtime conditions.


This is what I'm doing right now and the only issues that came up in internal review is that we have to create the pass object now for things
that we are unlikely to need.

Can you do this instead:

PassManager pm = ...;
pm.add(other needed passes);
if(arch you are interested)
   pm.add(your pass);


not in this case.

the architecture is changing on a per function pass.


same issue would be for


In this case, you can specialize a few pass manager objects, each for a specific sub target type.

PassManager pm0 = .. ; // for mips32;
PassManager pm1 = .. ; // for mips16;

if(function needs to run on mips32)
if(function needs to run on mips16)

Of course, you have to figure out the suitable sets of functions for each sub target.

Hope it helps.


I already have this working but I don't know until right before the pass runs if it's relevant.

The passes are machine function passes.

So I have to ask the question in runOnMachineFunction.

It works fine except that I have to have already added the pass.

This can change from function to function.

These are major passes like instruction selection.

Anyway, I think that so far it seems that you can't dynamically add passes and without that, I think all the other solutions are roughly equivalent.