[LLVMdev] Patch: PassManager should call add() instead of addLowerLevelRequiredPass()
Devang Patel
dpatel at apple.com
Tue Mar 10 10:08:03 PDT 2009
Hi Kevin,
On Mar 9, 2009, at 3:49 PM, Kevin Fan wrote:
> Hello,
>
> LLVM asserts in the following scenario. Say there are three passes:
> A, B, C. C requires A and B; B requires A; and B does not preserve A.
> A valid pass ordering would be A B A C. However, opt gives the
> following assertion:
>
> $ opt -load libPassTest.so foo.bc -f -o /dev/null -c -debug-
> pass=Structure
> opt: /u/loc/kevin/llvm/llvm/lib/VMCore/PassManager.cpp:1424: virtual
> void llvm::MPPassManager::addLowerLevelRequiredPass(llvm::Pass*,
> llvm::Pass*): Assertion `(P->getPotentialPassManagerType() <
> RequiredPass->getPotentialPassManagerType()) && "Unable to handle Pass
> that requires lower level Analysis pass"' failed.
>
> even though all passes are ModulePasses and do not require lower
> level passes.
>
> The attached patch modifies PMDataManager::add() to check if the
> required pass is actually a lower level pass before calling
> addLowerLevelRequiredPass(); if not, it calls add() instead. Not sure
> if this is the best fix, but it works for me.
>
> I also attached a test case with the three passes A, B, C described
> above.
>
> Kevin
> <passmanager.diff><PassTest1.cpp>
This patch is not appropriate. At this point, the pass manager expects
that all required passes at the same level (module pass, requiring
module pass) are handled.
The pass manager uses simplistic approach and does not handle cases
where required passes cancels each other. And that's what happens in
your example. Pass B cancels, already schedule Pass A.
You've two alternatives:
1) Require pass B before requiring pass A. In other words,
replace
virtual void getAnalysisUsage(AnalysisUsage &use) const {
use.addRequired<A>();
use.addRequired<B>();
}
with
virtual void getAnalysisUsage(AnalysisUsage &use) const {
use.addRequired<B>();
use.addRequired<A>();
}
2) do
$ opt -load libPassTest.so foo.bc -f -o /dev/null -b -c -debug-
pass=Structure
-
Devang
More information about the llvm-dev
mailing list