Index: lib/IR/LegacyPassManager.cpp =================================================================== --- lib/IR/LegacyPassManager.cpp +++ lib/IR/LegacyPassManager.cpp @@ -607,10 +607,10 @@ // available at this point. const PassInfo *PI = PassRegistry::getPassRegistry()->getPassInfo(P->getPassID()); - if (PI && PI->isAnalysis() && findAnalysisPass(P->getPassID())) { - delete P; + // don't delete the pass here. Instead delete it elsewhere + if (PI && PI->isAnalysis() && findAnalysisPass(P->getPassID())) return; - } + AnalysisUsage *AnUsage = findAnalysisUsage(P); @@ -1657,7 +1657,8 @@ assert((P->getPotentialPassManagerType() < RequiredPass->getPotentialPassManagerType()) && "Unable to handle Pass that requires lower level Analysis pass"); - + if (RequiredPass == NULL) + return; FunctionPassManagerImpl *FPP = OnTheFlyManagers[P]; if (!FPP) { FPP = new FunctionPassManagerImpl(); @@ -1666,7 +1667,15 @@ OnTheFlyManagers[P] = FPP; } - FPP->add(RequiredPass); + const PassInfo * RequiredPassPI = + PassRegistry::getPassRegistry()->getPassInfo(RequiredPass->getPassID()); + + if (RequiredPassPI && RequiredPassPI->isAnalysis() + && ((PMTopLevelManager*)FPP)->findAnalysisPass(P->getPassID())) { + delete RequiredPass; + RequiredPass = NULL; + } else + FPP->add(RequiredPass); // Register P as the last user of RequiredPass. if (RequiredPass) {