LLVM: include/llvm/IR/PassManagerInternal.h Source File (original) (raw)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17#ifndef LLVM_IR_PASSMANAGERINTERNAL_H

18#define LLVM_IR_PASSMANAGERINTERNAL_H

19

24#include

25#include <type_traits>

26#include

27

28namespace llvm {

29

31template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager;

33

34

36

37

38

39template <typename IRUnitT, typename AnalysisManagerT, typename... ExtraArgTs>

41

43

44

45

46

47

48

50 ExtraArgTs... ExtraArgs) = 0;

51

52 virtual void

55

57

58

59

60

61

63};

64

65

66

67

68

69

70template <typename IRUnitT, typename PassT, typename AnalysisManagerT,

71 typename... ExtraArgTs>

74

75

78

83

88

90 ExtraArgTs... ExtraArgs) override {

91 return Pass.run(IR, AM, ExtraArgs...);

92 }

93

97 Pass.printPipeline(OS, MapClassName2PassName);

98 }

99

101

102 template

103 using has_required_t = decltype(std::declval<T &>().isRequired());

104

107 return T::isRequired();

108 return false;

109 }

110

112

114};

115

116

117

118

119

120template <typename IRUnitT, typename InvalidatorT>

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

140 InvalidatorT &Inv) = 0;

141};

142

143

144

146 using EnabledType = char;

147 struct DisabledType {

148 char a, b;

149 };

150

151

152

153

154 template struct Nonce { using Type = EnabledType; };

155 template

156 static typename Nonce<decltype(std::declval().invalidate(

157 std::declval<IRUnitT &>(), std::declval()))>::Type

159

160

161

162

163

164 template <typename T, typename U> static DisabledType NonceFunction(T U::*);

165 struct CheckerBase { int invalidate; };

166 template struct Checker : CheckerBase, std::remove_cv_t {};

167 template

168 static decltype(NonceFunction(&Checker::invalidate)) check(rank<1>);

169

170

171

172 template

173 static EnabledType check(rank<0>);

174

175public:

176 enum { Value = sizeof(check(rank<2>())) == sizeof(EnabledType) };

177};

178

179

180

181

182

183

184

185template <typename IRUnitT, typename PassT, typename ResultT,

186 typename InvalidatorT,

187 bool HasInvalidateHandler =

190

191

192

193template <typename IRUnitT, typename PassT, typename ResultT,

194 typename InvalidatorT>

198

199

203

208

213

214

215

216

217

218

220 InvalidatorT &) override {

221 auto PAC = PA.template getChecker();

222 return !PAC.preserved() &&

223 !PAC.template preservedSet<AllAnalysesOn>();

224 }

225

227};

228

229

230

231template <typename IRUnitT, typename PassT, typename ResultT,

232 typename InvalidatorT>

236

237

241

246

251

252

254 InvalidatorT &Inv) override {

255 return Result.invalidate(IR, PA, Inv);

256 }

257

259};

260

261

262

263

264

265template <typename IRUnitT, typename InvalidatorT, typename... ExtraArgTs>

268

269

270

271

272 virtual std::unique_ptr<AnalysisResultConcept<IRUnitT, InvalidatorT>>

274 ExtraArgTs... ExtraArgs) = 0;

275

276

278};

279

280

281

282

283

284

285template <typename IRUnitT, typename PassT, typename InvalidatorT,

286 typename... ExtraArgTs>

290

291

294

299

304

305

308

309

310

311

312 std::unique_ptr<AnalysisResultConcept<IRUnitT, InvalidatorT>>

314 ExtraArgTs... ExtraArgs) override {

315 return std::make_unique(

316 Pass.run(IR, AM, std::forward(ExtraArgs)...));

317 }

318

319

320

321

323

325};

326

327}

328

329}

330

331#endif

Legalize the Machine IR a function s Machine IR

This templated class represents "all analyses that operate over " (e....

A container for analyses that lazily runs them and caches their results.

A set of analyses that are preserved following a run of a transformation pass.

StringRef - 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.

SFINAE metafunction for computing whether ResultT provides an invalidate member function.

Definition PassManagerInternal.h:145

@ Value

Definition PassManagerInternal.h:176

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.

A self-contained host- and target-independent arbitrary-precision floating-point software implementat...

This is an optimization pass for GlobalISel generic memory operations.

typename detail::detector< void, Op, Args... >::value_t is_detected

Detects if a given trait holds for some set of arguments 'Args'.

OutputIt move(R &&Range, OutputIt Out)

Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.

Implement std::hash so that hash_code can be used in STL containers.

void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)

Implement std::swap in terms of BitVector swap.

Abstract concept of an analysis pass.

Definition PassManagerInternal.h:266

virtual StringRef name() const =0

Polymorphic method to access the name of a pass.

virtual std::unique_ptr< AnalysisResultConcept< IRUnitT, InvalidatorT > > run(IRUnitT &IR, AnalysisManager< IRUnitT, ExtraArgTs... > &AM, ExtraArgTs... ExtraArgs)=0

Method to run this analysis over a unit of IR.

virtual ~AnalysisPassConcept()=default

AnalysisPassModel(const AnalysisPassModel &Arg)

Definition PassManagerInternal.h:292

StringRef name() const override

The model delegates to a static PassT::name method.

Definition PassManagerInternal.h:322

AnalysisPassModel(PassT Pass)

Definition PassManagerInternal.h:289

AnalysisResultModel< IRUnitT, PassT, typename PassT::Result, InvalidatorT > ResultModelT

Definition PassManagerInternal.h:306

std::unique_ptr< AnalysisResultConcept< IRUnitT, InvalidatorT > > run(IRUnitT &IR, AnalysisManager< IRUnitT, ExtraArgTs... > &AM, ExtraArgTs... ExtraArgs) override

The model delegates to the PassT::run method.

Definition PassManagerInternal.h:313

friend void swap(AnalysisPassModel &LHS, AnalysisPassModel &RHS)

Definition PassManagerInternal.h:295

AnalysisPassModel & operator=(AnalysisPassModel RHS)

Definition PassManagerInternal.h:300

PassT Pass

Definition PassManagerInternal.h:324

AnalysisPassModel(AnalysisPassModel &&Arg)

Definition PassManagerInternal.h:293

Abstract concept of an analysis result.

Definition PassManagerInternal.h:121

virtual ~AnalysisResultConcept()=default

virtual bool invalidate(IRUnitT &IR, const PreservedAnalyses &PA, InvalidatorT &Inv)=0

Method to try and mark a result as invalid.

ResultT Result

Definition PassManagerInternal.h:226

AnalysisResultModel & operator=(AnalysisResultModel RHS)

Definition PassManagerInternal.h:209

AnalysisResultModel(const AnalysisResultModel &Arg)

Definition PassManagerInternal.h:200

AnalysisResultModel(ResultT Result)

Definition PassManagerInternal.h:197

bool invalidate(IRUnitT &, const PreservedAnalyses &PA, InvalidatorT &) override

The model bases invalidation solely on being in the preserved set.

Definition PassManagerInternal.h:219

AnalysisResultModel(AnalysisResultModel &&Arg)

Definition PassManagerInternal.h:201

friend void swap(AnalysisResultModel &LHS, AnalysisResultModel &RHS)

Definition PassManagerInternal.h:204

AnalysisResultModel(ResultT Result)

Definition PassManagerInternal.h:235

ResultT Result

Definition PassManagerInternal.h:258

AnalysisResultModel & operator=(AnalysisResultModel RHS)

Definition PassManagerInternal.h:247

AnalysisResultModel(AnalysisResultModel &&Arg)

Definition PassManagerInternal.h:239

AnalysisResultModel(const AnalysisResultModel &Arg)

Definition PassManagerInternal.h:238

bool invalidate(IRUnitT &IR, const PreservedAnalyses &PA, InvalidatorT &Inv) override

The model delegates to the ResultT method.

Definition PassManagerInternal.h:253

friend void swap(AnalysisResultModel &LHS, AnalysisResultModel &RHS)

Definition PassManagerInternal.h:242

Wrapper to model the analysis result concept.

Definition PassManagerInternal.h:189

Template for the abstract base class used to dispatch polymorphically over pass objects.

Definition PassManagerInternal.h:40

virtual StringRef name() const =0

Polymorphic method to access the name of a pass.

virtual void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)=0

virtual bool isRequired() const =0

Polymorphic method to let a pass optionally exempted from skipping by PassInstrumentation.

virtual PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs)=0

The polymorphic API which runs the pass over a given IR entity.

virtual ~PassConcept()=default

friend void swap(PassModel &LHS, PassModel &RHS)

Definition PassManagerInternal.h:79

PassModel(PassT Pass)

Definition PassManagerInternal.h:73

decltype(std::declval< T & >().isRequired()) has_required_t

Definition PassManagerInternal.h:103

void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName) override

Definition PassManagerInternal.h:94

PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs) override

The polymorphic API which runs the pass over a given IR entity.

Definition PassManagerInternal.h:89

PassModel & operator=(PassModel RHS)

Definition PassManagerInternal.h:84

static bool passIsRequiredImpl()

Definition PassManagerInternal.h:105

bool isRequired() const override

Polymorphic method to let a pass optionally exempted from skipping by PassInstrumentation.

Definition PassManagerInternal.h:111

PassModel(const PassModel &Arg)

Definition PassManagerInternal.h:76

PassModel(PassModel &&Arg)

Definition PassManagerInternal.h:77

StringRef name() const override

Polymorphic method to access the name of a pass.

Definition PassManagerInternal.h:100

PassT Pass

Definition PassManagerInternal.h:113

Utility type to build an inheritance chain that makes it easy to rank overload candidates.