[LLVMdev] PassManager Woes
dag at cray.com
dag at cray.com
Fri Apr 18 13:17:37 PDT 2014
Ok, I've been struggling with this for two days and hopefully someone
can help me out.
I have a set of passes, analysis passes A, B, C, D and transformation
passes E and F.
Pass C depends on pass A and pass D depends on pass B. Pass E depends
on C and D and does not preserve any analysis pass. Pass F depeds on
pass A and pass C. Pass F runs after pass E.
Graphically the dependency graph looks something like this:
A B
^ ^
/ | |
| C D
| ^ ^
| |\ |
| | \ |
\ | \ |
F E
The arrows represent direct use of analysis pass data. So even though C
is built upon information from A, F directly accesses information from
both C and A.
I have tried all kinds of combinations of addRequired and
addRequiredTransitive but no matter what, pass C gets rerun before pass
F as expected but pass A does not. This leads to a situation where pass
F uses up to date information from pass C and out of date information
from pass A, leading to an analysis inconsistency and a compiler abort.
Note that even though pass C runs again, because pass A is out of date
the information it computes is wrong. So while it's up to date in the
sense that the pass ran again, it computed wrong information.
Currently I have done this:
C addRequiredTransitive<A>();
D addRequiredTransitive<B>();
E addRequired<C>();
E addRequired<D>();
F addRequired<C>();
F addRequired<A>();
I've tried having E and F addRequired<A>() or addRequiredTransitive<A>()
and lots of other things but nothing fixes the problem.
I guess I don't correctly understand addRequired()
vs. addRequiredTransitive(). Can someone explain how to use these
dependency specifiers to correctly describe the above dependencies?
Thanks!
-David
More information about the llvm-dev
mailing list