private:
// Pull in the concept type and model template specialized for SCCs.
- typedef detail::PassConcept<LazyCallGraph::SCC &, CGSCCAnalysisManager>
+ typedef detail::PassConcept<LazyCallGraph::SCC, CGSCCAnalysisManager>
CGSCCPassConcept;
template <typename PassT>
struct CGSCCPassModel
- : detail::PassModel<LazyCallGraph::SCC &, CGSCCAnalysisManager, PassT> {
+ : detail::PassModel<LazyCallGraph::SCC, CGSCCAnalysisManager, PassT> {
CGSCCPassModel(PassT Pass)
- : detail::PassModel<LazyCallGraph::SCC &, CGSCCAnalysisManager, PassT>(
+ : detail::PassModel<LazyCallGraph::SCC, CGSCCAnalysisManager, PassT>(
std::move(Pass)) {}
};
/// \brief A function analysis manager to coordinate and cache analyses run over
/// a module.
class CGSCCAnalysisManager : public detail::AnalysisManagerBase<
- CGSCCAnalysisManager, LazyCallGraph::SCC &> {
+ CGSCCAnalysisManager, LazyCallGraph::SCC> {
friend class detail::AnalysisManagerBase<CGSCCAnalysisManager,
- LazyCallGraph::SCC &>;
+ LazyCallGraph::SCC>;
typedef detail::AnalysisManagerBase<CGSCCAnalysisManager,
- LazyCallGraph::SCC &> BaseT;
+ LazyCallGraph::SCC> BaseT;
typedef BaseT::ResultConceptT ResultConceptT;
typedef BaseT::PassConceptT PassConceptT;
/// half of a bijection and provides storage for the actual result concept.
typedef std::list<
std::pair<void *, std::unique_ptr<detail::AnalysisResultConcept<
- LazyCallGraph::SCC &>>>> CGSCCAnalysisResultListT;
+ LazyCallGraph::SCC>>>> CGSCCAnalysisResultListT;
/// \brief Map type from function pointer to our custom list type.
typedef DenseMap<LazyCallGraph::SCC *, CGSCCAnalysisResultListT>
private:
// Pull in the concept type and model template specialized for modules.
- typedef detail::PassConcept<Module &, ModuleAnalysisManager>
+ typedef detail::PassConcept<Module, ModuleAnalysisManager>
ModulePassConcept;
template <typename PassT>
struct ModulePassModel
- : detail::PassModel<Module &, ModuleAnalysisManager, PassT> {
+ : detail::PassModel<Module, ModuleAnalysisManager, PassT> {
ModulePassModel(PassT Pass)
- : detail::PassModel<Module &, ModuleAnalysisManager, PassT>(
+ : detail::PassModel<Module, ModuleAnalysisManager, PassT>(
std::move(Pass)) {}
};
private:
// Pull in the concept type and model template specialized for functions.
- typedef detail::PassConcept<Function &, FunctionAnalysisManager>
+ typedef detail::PassConcept<Function, FunctionAnalysisManager>
FunctionPassConcept;
template <typename PassT>
struct FunctionPassModel
- : detail::PassModel<Function &, FunctionAnalysisManager, PassT> {
+ : detail::PassModel<Function, FunctionAnalysisManager, PassT> {
FunctionPassModel(PassT Pass)
- : detail::PassModel<Function &, FunctionAnalysisManager, PassT>(
+ : detail::PassModel<Function, FunctionAnalysisManager, PassT>(
std::move(Pass)) {}
};
///
/// If there is not a valid cached result in the manager already, this will
/// re-run the analysis to produce a valid result.
- template <typename PassT> typename PassT::Result &getResult(IRUnitT IR) {
+ template <typename PassT> typename PassT::Result &getResult(IRUnitT &IR) {
assert(AnalysisPasses.count(PassT::ID()) &&
"This analysis pass was not registered prior to being queried");
///
/// \returns null if there is no cached result.
template <typename PassT>
- typename PassT::Result *getCachedResult(IRUnitT IR) const {
+ typename PassT::Result *getCachedResult(IRUnitT &IR) const {
assert(AnalysisPasses.count(PassT::ID()) &&
"This analysis pass was not registered prior to being queried");
/// \brief Invalidate a specific analysis pass for an IR module.
///
/// Note that the analysis result can disregard invalidation.
- template <typename PassT> void invalidate(IRUnitT IR) {
+ template <typename PassT> void invalidate(IRUnitT &IR) {
assert(AnalysisPasses.count(PassT::ID()) &&
"This analysis pass was not registered prior to being invalidated");
derived_this()->invalidateImpl(PassT::ID(), IR);
/// We accept the PreservedAnalyses set by value and update it with each
/// analyis pass which has been successfully invalidated and thus can be
/// preserved going forward. The updated set is returned.
- PreservedAnalyses invalidate(IRUnitT IR, PreservedAnalyses PA) {
+ PreservedAnalyses invalidate(IRUnitT &IR, PreservedAnalyses PA) {
return derived_this()->invalidateImpl(IR, std::move(PA));
}
/// \brief A module analysis pass manager with lazy running and caching of
/// results.
class ModuleAnalysisManager
- : public detail::AnalysisManagerBase<ModuleAnalysisManager, Module &> {
- friend class detail::AnalysisManagerBase<ModuleAnalysisManager, Module &>;
- typedef detail::AnalysisManagerBase<ModuleAnalysisManager, Module &> BaseT;
+ : public detail::AnalysisManagerBase<ModuleAnalysisManager, Module> {
+ friend class detail::AnalysisManagerBase<ModuleAnalysisManager, Module>;
+ typedef detail::AnalysisManagerBase<ModuleAnalysisManager, Module> BaseT;
typedef BaseT::ResultConceptT ResultConceptT;
typedef BaseT::PassConceptT PassConceptT;
/// \brief Map type from module analysis pass ID to pass result concept
/// pointer.
typedef DenseMap<void *,
- std::unique_ptr<detail::AnalysisResultConcept<Module &>>>
+ std::unique_ptr<detail::AnalysisResultConcept<Module>>>
ModuleAnalysisResultMapT;
/// \brief Cache of computed module analysis results for this module.
/// \brief A function analysis manager to coordinate and cache analyses run over
/// a module.
class FunctionAnalysisManager
- : public detail::AnalysisManagerBase<FunctionAnalysisManager, Function &> {
- friend class detail::AnalysisManagerBase<FunctionAnalysisManager, Function &>;
- typedef detail::AnalysisManagerBase<FunctionAnalysisManager, Function &>
+ : public detail::AnalysisManagerBase<FunctionAnalysisManager, Function> {
+ friend class detail::AnalysisManagerBase<FunctionAnalysisManager, Function>;
+ typedef detail::AnalysisManagerBase<FunctionAnalysisManager, Function>
BaseT;
typedef BaseT::ResultConceptT ResultConceptT;
typedef BaseT::PassConceptT PassConceptT;
/// erases. Provides both the pass ID and concept pointer such that it is
/// half of a bijection and provides storage for the actual result concept.
typedef std::list<std::pair<
- void *, std::unique_ptr<detail::AnalysisResultConcept<Function &>>>>
+ void *, std::unique_ptr<detail::AnalysisResultConcept<Function>>>>
FunctionAnalysisResultListT;
/// \brief Map type from function pointer to our custom list type.
/// provided they satisfy the basic API requirements. When this pass is
/// created, these methods can be instantiated to satisfy whatever the
/// context requires.
- template <typename T, typename AnalysisManagerT>
- PreservedAnalyses run(T &&Arg, AnalysisManagerT *AM) {
+ template <typename IRUnitT, typename AnalysisManagerT>
+ PreservedAnalyses run(IRUnitT &Arg, AnalysisManagerT *AM) {
if (AM)
- (void)AM->template getResult<AnalysisT>(std::forward<T>(Arg));
+ (void)AM->template getResult<AnalysisT>(Arg);
return PreservedAnalyses::all();
}
/// provided they satisfy the basic API requirements. When this pass is
/// created, these methods can be instantiated to satisfy whatever the
/// context requires.
- template <typename T, typename AnalysisManagerT>
- PreservedAnalyses run(T &&Arg, AnalysisManagerT *AM) {
+ template <typename IRUnitT, typename AnalysisManagerT>
+ PreservedAnalyses run(IRUnitT &Arg, AnalysisManagerT *AM) {
if (AM)
// We have to directly invalidate the analysis result as we can't
// enumerate all other analyses and use the preserved set to control it.
- (void)AM->template invalidate<AnalysisT>(std::forward<T>(Arg));
+ (void)AM->template invalidate<AnalysisT>(Arg);
return PreservedAnalyses::all();
}
/// Note that actual pass object can omit the analysis manager argument if
/// desired. Also that the analysis manager may be null if there is no
/// analysis manager in the pass pipeline.
- virtual PreservedAnalyses run(IRUnitT IR, AnalysisManagerT *AM) = 0;
+ virtual PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT *AM) = 0;
/// \brief Polymorphic method to access the name of a pass.
virtual StringRef name() = 0;
char a, b;
};
- template <typename T, ResultT (T::*)(IRUnitT, AnalysisManagerT *)>
+ template <typename T, ResultT (T::*)(IRUnitT &, AnalysisManagerT *)>
struct Checker;
template <typename T> static SmallType f(Checker<T, &T::run> *);
return *this;
}
- PreservedAnalysesT run(IRUnitT IR, AnalysisManagerT *AM) override {
+ PreservedAnalysesT run(IRUnitT &IR, AnalysisManagerT *AM) override {
return Pass.run(IR, AM);
}
StringRef name() override { return PassT::name(); }
return *this;
}
- PreservedAnalysesT run(IRUnitT IR, AnalysisManagerT *AM) override {
+ PreservedAnalysesT run(IRUnitT &IR, AnalysisManagerT *AM) override {
return Pass.run(IR);
}
StringRef name() override { return PassT::name(); }
/// took care to update or preserve the analysis result in some way.
///
/// \returns true if the result is indeed invalid (the default).
- virtual bool invalidate(IRUnitT IR, const PreservedAnalyses &PA) = 0;
+ virtual bool invalidate(IRUnitT &IR, const PreservedAnalyses &PA) = 0;
};
/// \brief SFINAE metafunction for computing whether \c ResultT provides an
char a, b;
};
- template <typename T, bool (T::*)(IRUnitT, const PreservedAnalyses &)>
+ template <typename T, bool (T::*)(IRUnitT &, const PreservedAnalyses &)>
struct Checker;
template <typename T> static SmallType f(Checker<T, &T::invalidate> *);
// FIXME: We should actually use two different concepts for analysis results
// rather than two different models, and avoid the indirect function call for
// ones that use the trivial behavior.
- bool invalidate(IRUnitT, const PreservedAnalysesT &PA) override {
+ bool invalidate(IRUnitT &, const PreservedAnalysesT &PA) override {
return !PA.preserved(PassT::ID());
}
}
/// \brief The model delegates to the \c ResultT method.
- bool invalidate(IRUnitT IR, const PreservedAnalysesT &PA) override {
+ bool invalidate(IRUnitT &IR, const PreservedAnalysesT &PA) override {
return Result.invalidate(IR, PA);
}
/// \returns A unique_ptr to the analysis result object to be queried by
/// users.
virtual std::unique_ptr<AnalysisResultConcept<IRUnitT>>
- run(IRUnitT IR, AnalysisManagerT *AM) = 0;
+ run(IRUnitT &IR, AnalysisManagerT *AM) = 0;
/// \brief Polymorphic method to access the name of a pass.
virtual StringRef name() = 0;
///
/// The return is wrapped in an \c AnalysisResultModel.
std::unique_ptr<AnalysisResultConcept<IRUnitT>>
- run(IRUnitT IR, AnalysisManagerT *AM) override {
+ run(IRUnitT &IR, AnalysisManagerT *AM) override {
return make_unique<ResultModelT>(Pass.run(IR, AM));
}
///
/// The return is wrapped in an \c AnalysisResultModel.
std::unique_ptr<AnalysisResultConcept<IRUnitT>>
- run(IRUnitT IR, AnalysisManagerT *) override {
+ run(IRUnitT &IR, AnalysisManagerT *) override {
return make_unique<ResultModelT>(Pass.run(IR));
}