LLVM 18.0.0git
OptBisect.h
Go to the documentation of this file.
1//===- llvm/IR/OptBisect.h - LLVM Bisect support ----------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8///
9/// \file
10/// This file declares the interface for bisecting optimizations.
11///
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_IR_OPTBISECT_H
15#define LLVM_IR_OPTBISECT_H
16
17#include "llvm/ADT/StringRef.h"
18#include <limits>
19
20namespace llvm {
21
22/// Extensions to this class implement mechanisms to disable passes and
23/// individual optimizations at compile time.
25public:
26 virtual ~OptPassGate() = default;
27
28 /// IRDescription is a textual description of the IR unit the pass is running
29 /// over.
30 virtual bool shouldRunPass(const StringRef PassName,
31 StringRef IRDescription) {
32 return true;
33 }
34
35 /// isEnabled() should return true before calling shouldRunPass().
36 virtual bool isEnabled() const { return false; }
37};
38
39/// This class implements a mechanism to disable passes and individual
40/// optimizations at compile time based on a command line option
41/// (-opt-bisect-limit) in order to perform a bisecting search for
42/// optimization-related problems.
43class OptBisect : public OptPassGate {
44public:
45 /// Default constructor. Initializes the state to "disabled". The bisection
46 /// will be enabled by the cl::opt call-back when the command line option
47 /// is processed.
48 /// Clients should not instantiate this class directly. All access should go
49 /// through LLVMContext.
50 OptBisect() = default;
51
52 virtual ~OptBisect() = default;
53
54 /// Checks the bisect limit to determine if the specified pass should run.
55 ///
56 /// This forwards to checkPass().
58 StringRef IRDescription) override;
59
60 /// isEnabled() should return true before calling shouldRunPass().
61 bool isEnabled() const override { return BisectLimit != Disabled; }
62
63 /// Set the new optimization limit and reset the counter. Passing
64 /// OptBisect::Disabled disables the limiting.
65 void setLimit(int Limit) {
66 BisectLimit = Limit;
67 LastBisectNum = 0;
68 }
69
70 /// Checks the bisect limit to determine if the specified pass should run.
71 ///
72 /// If the bisect limit is set to -1, the function prints a message describing
73 /// the pass and the bisect number assigned to it and return true. Otherwise,
74 /// the function prints a message with the bisect number assigned to the
75 /// pass and indicating whether or not the pass will be run and return true if
76 /// the bisect limit has not yet been exceeded or false if it has.
77 ///
78 /// Most passes should not call this routine directly. Instead, they are
79 /// called through helper routines provided by the pass base classes. For
80 /// instance, function passes should call FunctionPass::skipFunction().
81 bool checkPass(const StringRef PassName, const StringRef TargetDesc);
82
83 static const int Disabled = std::numeric_limits<int>::max();
84
85private:
86 int BisectLimit = Disabled;
87 int LastBisectNum = 0;
88};
89
90/// Singleton instance of the OptBisect class, so multiple pass managers don't
91/// need to coordinate their uses of OptBisect.
93
94} // end namespace llvm
95
96#endif // LLVM_IR_OPTBISECT_H
static const char PassName[]
This class implements a mechanism to disable passes and individual optimizations at compile time base...
Definition: OptBisect.h:43
bool shouldRunPass(const StringRef PassName, StringRef IRDescription) override
Checks the bisect limit to determine if the specified pass should run.
Definition: OptBisect.cpp:42
static const int Disabled
Definition: OptBisect.h:83
void setLimit(int Limit)
Set the new optimization limit and reset the counter.
Definition: OptBisect.h:65
bool checkPass(const StringRef PassName, const StringRef TargetDesc)
Checks the bisect limit to determine if the specified pass should run.
bool isEnabled() const override
isEnabled() should return true before calling shouldRunPass().
Definition: OptBisect.h:61
virtual ~OptBisect()=default
OptBisect()=default
Default constructor.
Extensions to this class implement mechanisms to disable passes and individual optimizations at compi...
Definition: OptBisect.h:24
virtual bool isEnabled() const
isEnabled() should return true before calling shouldRunPass().
Definition: OptBisect.h:36
virtual bool shouldRunPass(const StringRef PassName, StringRef IRDescription)
IRDescription is a textual description of the IR unit the pass is running over.
Definition: OptBisect.h:30
virtual ~OptPassGate()=default
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
OptPassGate & getGlobalPassGate()
Singleton instance of the OptBisect class, so multiple pass managers don't need to coordinate their u...
Definition: OptBisect.cpp:54