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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37#ifndef LLVM_IR_PASSMANAGER_H

38#define LLVM_IR_PASSMANAGER_H

39

48#include

49#include

50#include

51#include

52#include

53#include <type_traits>

54#include

55#include

56

57namespace llvm {

58

61

62

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

64

65

66

67

68

70

72 static_assert(std::is_base_of<PassInfoMixin, DerivedT>::value,

73 "Must pass the derived type as the template argument!");

75 Name.consume_front("llvm::");

76 return Name;

77 }

78

81 StringRef ClassName = DerivedT::name();

82 auto PassName = MapClassName2PassName(ClassName);

84 }

85};

86

87

88

89

90

91template

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

109 static_assert(std::is_base_of<AnalysisInfoMixin, DerivedT>::value,

110 "Must pass the derived type as the template argument!");

111 return &DerivedT::Key;

112 }

113};

114

116

117

118

119template <typename PassT, typename IRUnitT, typename AnalysisManagerT,

120 typename... ArgTs, size_t... Ns>

121typename PassT::Result

123 std::tuple<ArgTs...> Args,

124 std::index_sequence<Ns...>) {

125 (void)Args;

126 return AM.template getResult(IR, std::get(Args)...);

127}

128

129

130

131

132

133

134template <typename PassT, typename IRUnitT, typename... AnalysisArgTs,

135 typename... MainArgTs>

136typename PassT::Result

138 std::tuple<MainArgTs...> Args) {

140 PassT, IRUnitT>)(AM, IR, Args,

141 std::index_sequence_for<AnalysisArgTs...>{});

142}

143

144}

145

146

147

148

149

150

151

152

153

154

155

156

157

158template <typename IRUnitT,

159 typename AnalysisManagerT = AnalysisManager,

160 typename... ExtraArgTs>

162 PassManager<IRUnitT, AnalysisManagerT, ExtraArgTs...>> {

163public:

164

166

167

168

169

170

172

177

180 for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) {

181 auto *P = Passes[Idx].get();

182 P->printPipeline(OS, MapClassName2PassName);

183 if (Idx + 1 < Size)

184 OS << ',';

185 }

186 }

187

188

189

191 ExtraArgTs... ExtraArgs);

192

193 template

196 using PassModelT =

197 detail::PassModel<IRUnitT, PassT, AnalysisManagerT, ExtraArgTs...>;

198

199

200 Passes.push_back(std::unique_ptr(

201 new PassModelT(std::forward(Pass))));

202 }

203

204

205

206

207

208

209 template

212 for (auto &P : Pass.Passes)

213 Passes.push_back(std::move(P));

214 }

215

216

218

220

221protected:

224

225 std::vector<std::unique_ptr> Passes;

226};

227

228template

230

231template <>

234

236

237

239

240template <>

243

245

246

248

249

250

251

252

253

254template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {

255public:

257

258private:

259

261 using PassConceptT =

263

264

265

266

267

268

269

270 using AnalysisResultListT =

271 std::list<std::pair<AnalysisKey *, std::unique_ptr>>;

272

273

275

276

277

278

279 using AnalysisResultMapT =

281 typename AnalysisResultListT::iterator>;

282

283public:

284

285

286

287

288

289

290

291

292

293 class Invalidator {

294 public:

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310 template

312 using ResultModelT =

314 Invalidator>;

315

316 return invalidateImpl(PassT::ID(), IR, PA);

317 }

318

319

320

321

322

323

324

326 return invalidateImpl<>(ID, IR, PA);

327 }

328

329 private:

331

332 template

335

336

337 auto IMapI = IsResultInvalidated.find(ID);

338 if (IMapI != IsResultInvalidated.end())

339 return IMapI->second;

340

341

342 auto RI = Results.find({ID, &IR});

344 "Trying to invalidate a dependent result that isn't in the "

345 "manager's cache is always an error, likely due to a stale result "

346 "handle!");

347

348 auto &Result = static_cast<ResultT &>(*RI->second->second);

349

350

351

352

353

354 bool Inserted;

355 std::tie(IMapI, Inserted) =

356 IsResultInvalidated.insert({ID, Result.invalidate(IR, PA, *this)});

357 (void)Inserted;

358 assert(Inserted && "Should not have already inserted this ID, likely "

359 "indicates a dependency cycle!");

360 return IMapI->second;

361 }

362

363 Invalidator(SmallDenseMap<AnalysisKey *, bool, 8> &IsResultInvalidated,

364 const AnalysisResultMapT &Results)

365 : IsResultInvalidated(IsResultInvalidated), Results(Results) {}

366

367 SmallDenseMap<AnalysisKey *, bool, 8> &IsResultInvalidated;

368 const AnalysisResultMapT &Results;

369 };

370

371

375

376

378 assert(AnalysisResults.empty() == AnalysisResultLists.empty() &&

379 "The storage and index of analysis results disagree on how many "

380 "there are!");

381 return AnalysisResults.empty();

382 }

383

384

385

386

387

388

390

391

392

393

394

395

396

398 AnalysisResults.clear();

399 AnalysisResultLists.clear();

400 }

401

402

404 return AnalysisPasses.count(PassT::ID());

405 }

406

407

408

409

410 template

411 typename PassT::Result &getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs) {

412 assert(AnalysisPasses.count(PassT::ID()) &&

413 "This analysis pass was not registered prior to being queried");

414 ResultConceptT &ResultConcept =

415 getResultImpl(PassT::ID(), IR, ExtraArgs...);

416

417 using ResultModelT =

419 Invalidator>;

420

421 return static_cast<ResultModelT &>(ResultConcept).Result;

422 }

423

424

425

426

427

428

429 template

431 assert(AnalysisPasses.count(PassT::ID()) &&

432 "This analysis pass was not registered prior to being queried");

433

434 ResultConceptT *ResultConcept = getCachedResultImpl(PassT::ID(), IR);

435 if (!ResultConcept)

436 return nullptr;

437

438 using ResultModelT =

440 Invalidator>;

441

442 return &static_cast<ResultModelT *>(ResultConcept)->Result;

443 }

444

445

446 template

450 Invalidator Inv(IsResultInvalidated, AnalysisResults);

451 assert(!Result->invalidate(IR, PA, Inv) &&

452 "Cached result cannot be invalidated");

453 }

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471 template

474 using PassModelT =

476

477 auto &PassPtr = AnalysisPasses[PassT::ID()];

478 if (PassPtr)

479

480 return false;

481

482

483 PassPtr.reset(new PassModelT(PassBuilder()));

484 return true;

485 }

486

487

488

489

490

492

493

494

495

496

497

499 AnalysisResultListT &ResultsList = AnalysisResultLists[&IR];

501

502 auto I =

504 assert(I != ResultsList.end() && "Analysis must be available");

505 ResultsList.erase(I);

506 AnalysisResults.erase({ID, &IR});

507 }

508

509private:

510

512 typename AnalysisPassMapT::iterator PI = AnalysisPasses.find(ID);

513 assert(PI != AnalysisPasses.end() &&

514 "Analysis passes must be registered prior to being queried!");

515 return *PI->second;

516 }

517

518

519 const PassConceptT &lookUpPass(AnalysisKey *ID) const {

520 typename AnalysisPassMapT::const_iterator PI = AnalysisPasses.find(ID);

521 assert(PI != AnalysisPasses.end() &&

522 "Analysis passes must be registered prior to being queried!");

523 return *PI->second;

524 }

525

526

527 ResultConceptT &getResultImpl(AnalysisKey *ID, IRUnitT &IR,

528 ExtraArgTs... ExtraArgs);

529

530

531 ResultConceptT *getCachedResultImpl(AnalysisKey *ID, IRUnitT &IR) const {

532 typename AnalysisResultMapT::const_iterator RI =

533 AnalysisResults.find({ID, &IR});

534 return RI == AnalysisResults.end() ? nullptr : &*RI->second->second;

535 }

536

537

538 using AnalysisPassMapT =

539 DenseMap<AnalysisKey *, std::unique_ptr>;

540

541

542 AnalysisPassMapT AnalysisPasses;

543

544

545

546

547

548 AnalysisResultListMapT AnalysisResultLists;

549

550

551

552 AnalysisResultMapT AnalysisResults;

553};

554

556

557

559

561

562

564

565

566

567

568

569

570

571

572

573

574

575

576

577

578

579

580

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

584 InnerAnalysisManagerProxy<AnalysisManagerT, IRUnitT>> {

585public:

587 public:

588 explicit Result(AnalysisManagerT &InnerAM) : InnerAM(&InnerAM) {}

589

591

592

593

594 Arg.InnerAM = nullptr;

595 }

596

598

599 if (!InnerAM)

600 return;

601

602

603

604 InnerAM->clear();

605 }

606

608 InnerAM = RHS.InnerAM;

609

610

611

612 RHS.InnerAM = nullptr;

613 return *this;

614 }

615

616

617 AnalysisManagerT &getManager() { return *InnerAM; }

618

619

620

621

622

623

624

625

626

627

628

632

633 private:

634 AnalysisManagerT *InnerAM;

635 };

636

638 : InnerAM(&InnerAM) {}

639

640

641

642

643

644

646 ExtraArgTs...) {

647 return Result(*InnerAM);

648 }

649

650private:

653

655

656 AnalysisManagerT *InnerAM;

657};

658

659

660

661

662

663

664

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

668

669

672

673

674

675template <>

676LLVM_ABI bool FunctionAnalysisManagerModuleProxy::Result::invalidate(

678 ModuleAnalysisManager::Invalidator &Inv);

679

680

681

684

685

686

687

688

689

690

691

692

693

694

695

696

697

698

699

700

701

702

703

704

705

706

707

708

709

710

711

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

715 OuterAnalysisManagerProxy<AnalysisManagerT, IRUnitT, ExtraArgTs...>> {

716public:

717

719 public:

720 explicit Result(const AnalysisManagerT &OuterAM) : OuterAM(&OuterAM) {}

721

722

723

724 template <typename PassT, typename IRUnitTParam>

726 typename PassT::Result *Res =

728 if (Res)

729 OuterAM->template verifyNotInvalidated(IR, Res);

730 return Res;

731 }

732

733

734 template <typename PassT, typename IRUnitTParam>

736 typename PassT::Result *Res =

738 return Res != nullptr;

739 }

740

741

745

746

748 for (auto &KeyValuePair : OuterAnalysisInvalidationMap) {

749 AnalysisKey *OuterID = KeyValuePair.first;

750 auto &InnerIDs = KeyValuePair.second;

752 return Inv.invalidate(InnerID, IRUnit, PA);

753 });

754 if (InnerIDs.empty())

756 }

757

758 for (auto *OuterID : DeadKeys)

759 OuterAnalysisInvalidationMap.erase(OuterID);

760

761

762 return false;

763 }

764

765

766

767 template <typename OuterAnalysisT, typename InvalidatedAnalysisT>

769 AnalysisKey *OuterID = OuterAnalysisT::ID();

770 AnalysisKey *InvalidatedID = InvalidatedAnalysisT::ID();

771

772 auto &InvalidatedIDList = OuterAnalysisInvalidationMap[OuterID];

773

774

775

776

778 InvalidatedIDList.push_back(InvalidatedID);

779 }

780

781

782

785 return OuterAnalysisInvalidationMap;

786 }

787

788 private:

789 const AnalysisManagerT *OuterAM;

790

791

792

794 OuterAnalysisInvalidationMap;

795 };

796

798 : OuterAM(&OuterAM) {}

799

800

801

802

804 ExtraArgTs...) {

805 return Result(*OuterAM);

806 }

807

808private:

811

813

814 const AnalysisManagerT *OuterAM;

815};

816

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

818AnalysisKey

820

823

826

827

828

829

830

831

832

833

834

835

836

837

838

839

840

841

842

843

844

845

846

847

848

849

852public:

854

856 bool EagerlyInvalidate)

857 : Pass(std::move(Pass)), EagerlyInvalidate(EagerlyInvalidate) {}

858

859

864

866

867private:

868 std::unique_ptr Pass;

869 bool EagerlyInvalidate;

870};

871

872

873

874template

875ModuleToFunctionPassAdaptor

877 bool EagerlyInvalidate = false) {

878 using PassModelT =

880

881

883 std::unique_ptrModuleToFunctionPassAdaptor::PassConceptT(

884 new PassModelT(std::forward(Pass))),

885 EagerlyInvalidate);

886}

887

888

889

890

891

892

893

894

895

896

897template <typename AnalysisT, typename IRUnitT,

898 typename AnalysisManagerT = AnalysisManager,

899 typename... ExtraArgTs>

901 : PassInfoMixin<RequireAnalysisPass<AnalysisT, IRUnitT, AnalysisManagerT,

902 ExtraArgTs...>> {

903

904

905

906

907

908

910 ExtraArgTs &&... Args) {

911 (void)AM.template getResult(Arg,

912 std::forward(Args)...);

913

915 }

918 auto ClassName = AnalysisT::name();

919 auto PassName = MapClassName2PassName(ClassName);

920 OS << "require<" << PassName << '>';

921 }

923};

924

925

926

927template

929 : PassInfoMixin<InvalidateAnalysisPass> {

930

931

932

933

934

935

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

944 auto ClassName = AnalysisT::name();

945 auto PassName = MapClassName2PassName(ClassName);

946 OS << "invalidate<" << PassName << '>';

947 }

948};

949

950

951

952

953

955

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

960};

961

962}

963

964#endif

assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")

Function Alias Analysis Results

static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")

#define LLVM_TEMPLATE_ABI

#define LLVM_ATTRIBUTE_MINSIZE

#define LLVM_ATTRIBUTE_VISIBILITY_DEFAULT

This file defines the DenseMap class.

Legalize the Machine IR a function s Machine IR

This header provides internal APIs and implementation details used by the pass management interfaces ...

static const char PassName[]

API to communicate dependencies between analyses during invalidation.

Definition PassManager.h:293

bool invalidate(AnalysisKey *ID, IRUnitT &IR, const PreservedAnalyses &PA)

A type-erased variant of the above invalidate method with the same core API other than passing an ana...

Definition PassManager.h:325

bool invalidate(IRUnitT &IR, const PreservedAnalyses &PA)

Trigger the invalidation of some other analysis pass if not already handled and return whether it was...

Definition PassManager.h:311

friend class AnalysisManager

Definition PassManager.h:330

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

Definition PassManager.h:254

bool isPassRegistered() const

Returns true if the specified analysis pass is registered.

Definition PassManager.h:403

AnalysisManager()

Construct an empty analysis manager.

void clear()

Clear all analysis results cached by this AnalysisManager.

Definition PassManager.h:397

AnalysisManager(AnalysisManager &&)

void verifyNotInvalidated(IRUnitT &IR, typename PassT::Result *Result) const

Verify that the given Result cannot be invalidated, assert otherwise.

Definition PassManager.h:447

AnalysisManager & operator=(AnalysisManager &&)

void clear(IRUnitT &IR, llvm::StringRef Name)

Clear any cached analysis results for a single unit of IR.

void invalidate(IRUnitT &IR, const PreservedAnalyses &PA)

Invalidate cached analyses for an IR unit.

void clearAnalysis(IRUnitT &IR)

Directly clear a cached analysis for an IR unit.

Definition PassManager.h:498

PassT::Result * getCachedResult(IRUnitT &IR) const

Get the cached result of an analysis pass for a given IR unit.

Definition PassManager.h:430

bool registerPass(PassBuilderT &&PassBuilder)

Register an analysis pass with the manager.

Definition PassManager.h:472

bool empty() const

Returns true if the analysis manager has an empty results cache.

Definition PassManager.h:377

PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)

Get the result of an analysis pass for a given IR unit.

Definition PassManager.h:411

Result(Result &&Arg)

Definition PassManager.h:590

bool invalidate(IRUnitT &IR, const PreservedAnalyses &PA, typename AnalysisManager< IRUnitT, ExtraArgTs... >::Invalidator &Inv)

Handler for invalidation of the outer IR unit, IRUnitT.

Result(AnalysisManagerT &InnerAM)

Definition PassManager.h:588

Result & operator=(Result &&RHS)

Definition PassManager.h:607

~Result()

Definition PassManager.h:597

AnalysisManagerT & getManager()

Accessor for the analysis manager.

Definition PassManager.h:617

An analysis over an "outer" IR unit that provides access to an analysis manager over an "inner" IR un...

Definition PassManager.h:584

Result run(IRUnitT &IR, AnalysisManager< IRUnitT, ExtraArgTs... > &AM, ExtraArgTs...)

Run the analysis pass and create our proxy result object.

Definition PassManager.h:645

InnerAnalysisManagerProxy(AnalysisManagerT &InnerAM)

Definition PassManager.h:637

Trivial adaptor that maps from a module to its functions.

Definition PassManager.h:851

detail::PassConcept< Function, FunctionAnalysisManager > PassConceptT

Definition PassManager.h:853

ModuleToFunctionPassAdaptor(std::unique_ptr< PassConceptT > Pass, bool EagerlyInvalidate)

Definition PassManager.h:855

static bool isRequired()

Definition PassManager.h:865

A Module instance is used to store all the information related to an LLVM module.

Result(const AnalysisManagerT &OuterAM)

Definition PassManager.h:720

PassT::Result * getCachedResult(IRUnitTParam &IR) const

Get a cached analysis.

Definition PassManager.h:725

bool invalidate(IRUnitT &IRUnit, const PreservedAnalyses &PA, typename AnalysisManager< IRUnitT, ExtraArgTs... >::Invalidator &Inv)

When invalidation occurs, remove any registered invalidation events.

Definition PassManager.h:742

bool cachedResultExists(IRUnitTParam &IR) const

Method provided for unit testing, not intended for general use.

Definition PassManager.h:735

const SmallDenseMap< AnalysisKey *, TinyPtrVector< AnalysisKey * >, 2 > & getOuterInvalidations() const

Access the map from outer analyses to deferred invalidation requiring analyses.

Definition PassManager.h:784

void registerOuterAnalysisInvalidation()

Register a deferred invalidation event for when the outer analysis manager processes its invalidation...

Definition PassManager.h:768

An analysis over an "inner" IR unit that provides access to an analysis manager over a "outer" IR uni...

Definition PassManager.h:715

Result run(IRUnitT &, AnalysisManager< IRUnitT, ExtraArgTs... > &, ExtraArgTs...)

Run the analysis pass and create our proxy result object.

Definition PassManager.h:803

OuterAnalysisManagerProxy(const AnalysisManagerT &OuterAM)

Definition PassManager.h:797

This class provides access to building LLVM's passes.

Manages a sequence of passes over a particular unit of IR.

Definition PassManager.h:162

PassManager(PassManager &&Arg)

Definition PassManager.h:171

PassManager & operator=(PassManager &&RHS)

Definition PassManager.h:173

LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)

Definition PassManager.h:195

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

Definition PassManager.h:178

std::vector< std::unique_ptr< PassConceptT > > Passes

Definition PassManager.h:225

PassManager()=default

Construct a pass manager.

detail::PassConcept< LazyCallGraph::SCC, CGSCCAnalysisManager, ExtraArgTs... > PassConceptT

Definition PassManager.h:222

LLVM_ATTRIBUTE_MINSIZE std::enable_if_t< std::is_same_v< PassT, PassManager > > addPass(PassT &&Pass)

When adding a pass manager pass that has the same type as this pass manager, simply move the passes o...

Definition PassManager.h:211

static bool isRequired()

Definition PassManager.h:219

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

Run all of the passes in this manager over the given unit of IR.

bool isEmpty() const

Returns if the pass manager contains any passes.

Definition PassManager.h:217

Pass interface - Implemented by all 'passes'.

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

static PreservedAnalyses none()

Convenience factory function for the empty preserved set.

static PreservedAnalyses all()

Construct a special preserved set that preserves all passes.

PreservedAnalyses & abandon()

Mark an analysis as abandoned.

iterator erase(const_iterator CI)

void push_back(const T &Elt)

This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.

StringRef - Represent a constant reference to a string, i.e.

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.

unsigned ID

LLVM IR allows to use arbitrary numbers as calling convention identifiers.

PassT::Result getAnalysisResultUnpackTuple(AnalysisManagerT &AM, IRUnitT &IR, std::tuple< ArgTs... > Args, std::index_sequence< Ns... >)

Actual unpacker of extra arguments in getAnalysisResult, passes only those tuple arguments that are m...

Definition PassManager.h:122

PassT::Result getAnalysisResult(AnalysisManager< IRUnitT, AnalysisArgTs... > &AM, IRUnitT &IR, std::tuple< MainArgTs... > Args)

Helper for partial unpacking of extra arguments in getAnalysisResult.

Definition PassManager.h:137

This is an optimization pass for GlobalISel generic memory operations.

ModuleToFunctionPassAdaptor createModuleToFunctionPassAdaptor(FunctionPassT &&Pass, bool EagerlyInvalidate=false)

A function to deduce a function pass type and wrap it in the templated adaptor.

Definition PassManager.h:876

OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy

Provide the ModuleAnalysisManager to Function proxy.

Definition PassManager.h:824

LLVM_GET_TYPE_NAME_CONSTEXPR StringRef getTypeName()

We provide a function which tries to compute the (demangled) name of a type statically.

LLVM_ABI void printIRUnitNameForStackTrace< Function >(raw_ostream &OS, const Function &IR)

void printIRUnitNameForStackTrace(raw_ostream &OS, const IRUnitT &IR)

InnerAnalysisManagerProxy< FunctionAnalysisManager, Module > FunctionAnalysisManagerModuleProxy

Provide the FunctionAnalysisManager to Module proxy.

Definition PassManager.h:670

LLVM_ABI void printIRUnitNameForStackTrace< Module >(raw_ostream &OS, const Module &IR)

PassManager< Module > ModulePassManager

Convenience typedef for a pass manager over modules.

Definition PassManager.h:238

LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key

Definition PassManager.h:667

PassManager< Function > FunctionPassManager

Convenience typedef for a pass manager over functions.

Definition PassManager.h:247

OutputIt move(R &&Range, OutputIt Out)

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

auto find_if(R &&Range, UnaryPredicate P)

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

void erase_if(Container &C, UnaryPredicate P)

Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...

bool is_contained(R &&Range, const E &Element)

Returns true if Element is found in Range.

AnalysisManager< Function > FunctionAnalysisManager

Convenience typedef for the Function analysis manager.

Definition PassManager.h:563

AnalysisManager< Module > ModuleAnalysisManager

Convenience typedef for the Module analysis manager.

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

A CRTP mix-in that provides informational APIs needed for analysis passes.

Definition PassManager.h:92

static AnalysisKey * ID()

Returns an opaque, unique ID for this analysis type.

Definition PassManager.h:108

A special type used by analysis passes to provide an address that identifies that particular analysis...

A utility pass that does nothing, but preserves no analyses.

Definition PassManager.h:954

PreservedAnalyses run(IRUnitT &, AnalysisManagerT &, ExtraArgTs &&...)

Run this pass over some unit of IR.

Definition PassManager.h:957

A no-op pass template which simply forces a specific analysis result to be invalidated.

Definition PassManager.h:929

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

Definition PassManager.h:942

PreservedAnalyses run(IRUnitT &Arg, AnalysisManagerT &AM, ExtraArgTs &&...)

Run this pass over some unit of IR.

Definition PassManager.h:937

A CRTP mix-in to automatically provide informational APIs needed for passes.

Definition PassManager.h:69

static StringRef name()

Gets the name of the pass we are mixed into.

Definition PassManager.h:71

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

Definition PassManager.h:79

A utility pass template to force an analysis result to be available.

Definition PassManager.h:902

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

Definition PassManager.h:916

static bool isRequired()

Definition PassManager.h:922

PreservedAnalyses run(IRUnitT &Arg, AnalysisManagerT &AM, ExtraArgTs &&... Args)

Run this pass over some unit of IR.

Definition PassManager.h:909

Abstract concept of an analysis pass.

Wrapper to model the analysis pass concept.

Abstract concept of an analysis result.

Wrapper to model the analysis result concept.

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

A template wrapper used to implement the polymorphic API.