[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