From: Brian Gaeke Date: Fri, 23 Jul 2004 19:35:50 +0000 (+0000) Subject: Fix problem with inserting FunctionPasses that depend on ImmutablePasses X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7ff4006f82e0ff65d1ab43c8a50a38da2860cfac;p=oota-llvm.git Fix problem with inserting FunctionPasses that depend on ImmutablePasses (e.g., LICM) into FunctionPassManagers. The problem is that we were using a C-style cast to cast required analysis passes to PassClass*, but if it's a FunctionPassManager, and the required analysis pass is an ImmutablePass, the types aren't really compatible, so the C-style cast causes a crash. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15140 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/VMCore/PassManagerT.h b/lib/VMCore/PassManagerT.h index 463888a56db..6c60a2d022d 100644 --- a/lib/VMCore/PassManagerT.h +++ b/lib/VMCore/PassManagerT.h @@ -454,8 +454,12 @@ public: // Loop over all of the analyses used by this pass, for (std::vector::const_iterator I = Required.begin(), E = Required.end(); I != E; ++I) { - if (getAnalysisOrNullDown(*I) == 0) - add((PassClass*)(*I)->createPass()); + if (getAnalysisOrNullDown(*I) == 0) { + Pass *AP = (*I)->createPass(); + if (ImmutablePass *IP = dynamic_cast (AP)) { add(IP); } + else if (PassClass *RP = dynamic_cast (AP)) { add(RP); } + else { assert (0 && "Wrong kind of pass for this PassManager"); } + } } // Tell the pass to add itself to this PassManager... the way it does so @@ -477,8 +481,12 @@ public: // Loop over all of the analyses used by this pass, for (std::vector::const_iterator I = Required.begin(), E = Required.end(); I != E; ++I) { - if (getAnalysisOrNullDown(*I) == 0) - add((PassClass*)(*I)->createPass()); + if (getAnalysisOrNullDown(*I) == 0) { + Pass *AP = (*I)->createPass(); + if (ImmutablePass *IP = dynamic_cast (AP)) add(IP); + else if (PassClass *RP = dynamic_cast (AP)) add(RP); + else assert (0 && "Wrong kind of pass for this PassManager"); + } } // Add the ImmutablePass to this PassManager.