[LLVMdev] The "scope" of passes
John Criswell
criswell at uiuc.edu
Mon Apr 19 07:27:15 PDT 2010
ether zhhb wrote:
> hi John,
>
> sorry for reply so late.
>
> On Tue, Apr 13, 2010 at 10:38 PM, John Criswell <criswell at uiuc.edu
> <mailto:criswell at uiuc.edu>> wrote:
>
> Devang Patel wrote:
>
> On Mon, Apr 12, 2010 at 6:41 PM, ether zhhb
> <etherzhhb at gmail.com <mailto:etherzhhb at gmail.com>> wrote:
>
>
>
> that's because FunctionPass implement the
> "addLowerLevelRequiredPass"
> function, but others not.
>
> so, is there any special reason that only
> "addLowerLevelRequiredPass" is
> allow?
>
>
>
>
> There is no reason to not allow it. It is not done because
> there was
> not any use. If you need this then pl. prepare a patch!
>
>
>
> Alternatively, if you wrote the BasicBlock analysis pass, you
> could easily modify it to be a FunctionPass.
>
> yep, if we just concerning use BB pass in Function pass, we can just
> change it into a Function pass. (In fact, i had do something like this
> before :) )
>
> But the problem is, sometimes, the BB pass PassA use by some Function
> pass requires others BB pass for analysis result, so we had to rewrite
> all the passes required by PassA to Function pass, so that PassA can
> get the analysis :(
Yes, it's inconvenient, but you only have two options: either enhance
the PassManager to allow a FunctionPass to use a BasicBlockPass, or
modify all of your BasicBlockPass'es to be FunctionPass'es.
Personally, I would make everything a FunctionPass. When a lower level
pass is requested by a higher level pass (e.g., ModulePass requests a
FunctionPass), then the lower-level pass is re-run *even if it was
executed previously and not invalidated.* So, in your case, if a
FunctionPass requests the results of BasicBlockPass, that BasicBlockPass
will be re-run, even if it was run previously and not invalidated.
Plus, you can always write a BasicBlockPass *and* a FunctionPass that
reuse the same code. For example, you could structure your code this way:
classname::analyzeBasicBlock (BasicBlock & BB) {
...
}
BBClassName::runOnBasicBlock (BasicBlock & BB) {
analyzeBasicBlock (BB):
}
FuncClassName::runOnFunction (Function & F) {
for each basic block in F {
analyzeBasicBlock (BB)
}
}
The you either use the BasicBlockPass or FunctionPass depending upon
what your needs are.
-- John T.
>
> Currently, I think this is a better alternative because:
>
> 1) It doesn't require patching LLVM (meaning that your passes can
> work with LLVM 2.7)
>
> 2) You will get better reusability of the analysis results. When
> a higher level pass calls a lower level pass (e.g., ModulePass
> calls FunctionPass), the lower level pass is run again, even if it
> was run previously and did not have its analysis results
> invalidated. If the passes are of the same level (e.g.,
> FunctionPass requires FunctionPass), then the PassManager can
> avoid duplicate runs of the analysis pass if its results are not
> invalidated.
>
> yep, this make sense.
>
>
> -- John T.
>
> -
> Devang
>
>
>
> best regards
> --ether
>
More information about the llvm-dev
mailing list