17#ifndef LLVM_IR_PASSMANAGERINTERNAL_H
18#define LLVM_IR_PASSMANAGERINTERNAL_H
31template <
typename IRUnitT,
typename... ExtraArgTs>
class AnalysisManager;
41template <
typename IRUnitT,
typename AnalysisManagerT,
typename... ExtraArgTs>
46 AnalysisManagerT &, ExtraArgTs...);
47 using PrintPipelineTy =
56 using unique_ptr = std::unique_ptr<PassConcept, Deleter>;
64 PrintPipelineTy PrintPipeline;
68 PrintPipelineTy PrintPipeline)
69 : Name(Name), IsRequired(IsRequired), Destroy(Destroy), Run(Run),
70 PrintPipeline(PrintPipeline) {}
74 void operator delete(
void *
P) { ::operator
delete(
P); }
83 ExtraArgTs... ExtraArgs) {
84 return Run(*
this,
IR, AM, std::forward<ExtraArgTs>(ExtraArgs)...);
89 PrintPipeline(*
this, OS, MapClassName2PassName);
108template <
typename IRUnitT,
typename PassT,
typename AnalysisManagerT,
109 typename... ExtraArgTs>
111 :
public PassConcept<IRUnitT, AnalysisManagerT, ExtraArgTs...> {
113 using PassConceptT =
PassConcept<IRUnitT, AnalysisManagerT, ExtraArgTs...>;
117 static PassT &getPass(PassConceptT &Self) {
118 return static_cast<PassModel &
>(Self).Pass;
121 static void destroyImpl(PassConceptT &Self) {
122 delete static_cast<PassModel *
>(&Self);
126 AnalysisManagerT &AM,
127 ExtraArgTs... ExtraArgs) {
128 return getPass(Self).run(
IR, AM, ExtraArgs...);
132 printPipelineImpl(PassConceptT &Self,
raw_ostream &OS,
134 getPass(Self).printPipeline(OS, MapClassName2PassName);
137 explicit PassModel(PassT &&Pass)
138 : PassConceptT(PassT::name(), PassT::isRequired(), destroyImpl, runImpl,
140 Pass(std::move(Pass)) {}
152template <
typename IRUnitT,
typename Inval
idatorT>
164 using unique_ptr = std::unique_ptr<AnalysisResultConcept, Deleter>;
196 using EnabledType =
char;
197 struct DisabledType {
204 template <
typename T>
struct Nonce {
using Type = EnabledType; };
205 template <
typename T>
206 static typename Nonce<decltype(std::declval<T>().invalidate(
207 std::declval<IRUnitT &>(), std::declval<PreservedAnalyses>()))>
::Type
214 template <
typename T,
typename U>
static DisabledType NonceFunction(
T U::*);
215 struct CheckerBase {
int invalidate; };
216 template <
typename T>
struct Checker : CheckerBase, std::remove_cv_t<T> {};
217 template <
typename T>
218 static decltype(NonceFunction(&Checker<T>::invalidate)) check(
rank<1>);
222 template <
typename T>
223 static EnabledType check(
rank<0>);
226 enum {
Value =
sizeof(check<ResultT>(
rank<2>())) ==
sizeof(EnabledType) };
230template <
typename IRUnitT,
typename PassT,
typename ResultT,
231 typename InvalidatorT>
242 template <
typename... ExtraArgTs>
245 ExtraArgTs &&...ExtraArgs)
252 return Result.invalidate(
IR, PA, Inv);
254 auto PAC = PA.template getChecker<PassT>();
255 return !PAC.preserved() &&
256 !PAC.template preservedSet<AllAnalysesOn<IRUnitT>>();
265template <
typename IRUnitT,
typename InvalidatorT,
typename... ExtraArgTs>
275 using unique_ptr = std::unique_ptr<AnalysisPassConcept, Deleter>;
289 : Name(Name), Destroy(Destroy), Run(Run) {}
300 return Run(*
this,
IR, AM, std::forward<ExtraArgTs>(ExtraArgs)...);
312template <
typename IRUnitT,
typename PassT,
typename InvalidatorT,
313 typename... ExtraArgTs>
314class AnalysisPassModel final
316 using AnalysisPassConceptT =
323 static void destroyImpl(AnalysisPassConceptT &Self) {
324 delete static_cast<AnalysisPassModel *
>(&Self);
328 runImpl(AnalysisPassConceptT &Self, IRUnitT &
IR,
330 ExtraArgTs &&...ExtraArgs) {
331 PassT &Pass =
static_cast<AnalysisPassModel &
>(Self).Pass;
333 new ResultModelT(Pass,
IR, AM, std::forward<ExtraArgTs>(ExtraArgs)...));
336 explicit AnalysisPassModel(PassT &&Pass)
337 : AnalysisPassConceptT(PassT::name(), destroyImpl, runImpl),
338 Pass(std::move(Pass)) {}
343 new AnalysisPassModel(std::move(Pass)));
Legalize the Machine IR a function s Machine IR
print mir2vec MIR2Vec Vocabulary Printer Pass
This templated class represents "all analyses that operate over <aparticular IR unit>" (e....
A container for analyses that lazily runs them and caches their results.
Pass interface - Implemented by all 'passes'.
A set of analyses that are preserved following a run of a transformation pass.
Represent a constant reference to a string, i.e.
The instances of the Type class are immutable: once they are created, they are never changed.
AnalysisPassConcept(const AnalysisPassConcept &)=delete
typename AnalysisResultConcept< IRUnitT, Invalidator >::unique_ptr ResultPtrT
AnalysisPassConcept & operator=(const AnalysisPassConcept &)=delete
AnalysisPassConcept(StringRef Name, DestroyTy Destroy, RunTy Run)
ResultPtrT run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs &&...ExtraArgs)
Method to run this analysis over a unit of IR.
StringRef name() const
Get the name of the pass.
AnalysisManager< IRUnitT, ExtraArgTs... > AnalysisManagerT
std::unique_ptr< AnalysisPassConcept, Deleter > unique_ptr
static AnalysisPassConceptT::unique_ptr create(PassT &&Pass)
PassConcept(const PassConcept &)=delete
PassConcept & operator=(const PassConcept &)=delete
PassConcept(StringRef Name, bool IsRequired, DestroyTy Destroy, RunTy Run, PrintPipelineTy PrintPipeline)
std::unique_ptr< PassConcept, Deleter > unique_ptr
bool isRequired() const
Indicate whether a pass can optionally be exempted from skipping by PassInstrumentation.
void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
StringRef name() const
Get name of a pass.
PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs)
Run the pass.
static PassConceptT::unique_ptr create(PassT &&Pass)
SFINAE metafunction for computing whether ResultT provides an invalidate member function.
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
Pass manager infrastructure for declaring and invalidating analyses.
@ C
The default llvm calling convention, compatible with C.
A self-contained host- and target-independent arbitrary-precision floating-point software implementat...
This is an optimization pass for GlobalISel generic memory operations.
Implement std::hash so that hash_code can be used in STL containers.
void operator()(AnalysisPassConcept *P)
void operator()(AnalysisResultConcept *C)
AnalysisResultConcept(DestroyTy Destroy)
std::unique_ptr< AnalysisResultConcept, Deleter > unique_ptr
bool invalidate(IRUnitT &IR, const PreservedAnalyses &PA, InvalidatorT &Inv)
Method to try and mark a result as invalid.
Wrapper to model the analysis result concept.
typename PassT::Result Result
AnalysisResultModel(PassT &Pass, IRUnitT &IR, AnalysisManager< IRUnitT, ExtraArgTs... > &AM, ExtraArgTs &&...ExtraArgs)
static void destroyImpl(AnalysisResultConceptT &Self)
AnalysisResultConcept< IRUnitT, InvalidatorT > AnalysisResultConceptT
void operator()(PassConcept *P)
Utility type to build an inheritance chain that makes it easy to rank overload candidates.