PassManager error message hard to decipher

I cannot figure out a particular PassManager error for what seem to be
legal dependencies.

Here is the situation. We have 5 passes, RegisterAllocator,
FunctionLiveVarInfo, CoalesceCopies, DominanceForest, and UnionSSAVars,
with dependencies as follows:

class RegisterAllocator : public FunctionPass {
  . . .
  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
  AU.addRequired<FunctionLiveVarInfo>();
  AU.addRequired<CoalesceCopies>();
  }
  . . .
};

class FunctionLiveVarInfo : public FunctionPass {
  . . .
  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
  AU.setPreservesAll();
  }
  . . .
};

class CoalesceCopies : public FunctionPass {
  . . .
  virtual void getAnalysisUsage(AnalysisUsage &AU) {
  AU.setPreservesAll();
  AU.addRequired<FunctionLiveVarInfo>();
  AU.addRequired<UnionSSAVars>();
  AU.addRequired<DominanceForest>();
  }
  . . .
};

class UnionSSAVars : public FunctionPass {
  . . .
  virtual void getAnalysisUsage(AnalysisUsage &AU) {
        AU.setPreservesAll();
  AU.addRequired<FunctionLiveVarInfo>();
  }
  . . .
};

class DominanceForest : public FunctionPass {
  . . .
  virtual void getAnalysisUsage(AnalysisUsage &AU) {
        AU.setPreservesAll();
  AU.addRequired<DominatorTree>();
  AU.addRequired<UnionSSAVars>();
  }
  . . .
};

When llc is run (invoking RegisterAllocator), it gives this error message:

Assertion failed: 0 && "Pass available but not found! " "Perhaps this is a
module pass requiring a function pass?", file PassManagerT.h, line 395
Abort

None of the passes here is or requires a module pass. What does the error
message mean, then?

Aqeel Mahesri

Here is the situation. We have 5 passes, RegisterAllocator,
FunctionLiveVarInfo, CoalesceCopies, DominanceForest, and UnionSSAVars,
with dependencies as follows:

Wow, that is a crazy set of interdependences, I'm impressed :slight_smile:

class RegisterAllocator : public FunctionPass {
  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
class FunctionLiveVarInfo : public FunctionPass {
  virtual void getAnalysisUsage(AnalysisUsage &AU) const {

These are ok...

class CoalesceCopies : public FunctionPass {
  virtual void getAnalysisUsage(AnalysisUsage &AU) {
class UnionSSAVars : public FunctionPass {
  virtual void getAnalysisUsage(AnalysisUsage &AU) {
class DominanceForest : public FunctionPass {
  virtual void getAnalysisUsage(AnalysisUsage &AU) {

These are not: notice the methods aren't const. Let me know whether or
not this fixes the problem, you probably have the most complex web of
interdependences yet :slight_smile:

-Chris