xref: /freebsd/contrib/llvm-project/llvm/include/llvm/IR/OptBisect.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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 
20 namespace llvm {
21 
22 /// Extensions to this class implement mechanisms to disable passes and
23 /// individual optimizations at compile time.
24 class OptPassGate {
25 public:
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.
43 class OptBisect : public OptPassGate {
44 public:
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   /// The method prints the name of the pass, its assigned bisect number, and
57   /// whether or not the pass will be executed. It returns true if the pass
58   /// should run, i.e. if the bisect limit is set to -1 or has not yet been
59   /// exceeded.
60   ///
61   /// Most passes should not call this routine directly. Instead, it is called
62   /// through helper routines provided by the base classes of the pass. For
63   /// instance, function passes should call FunctionPass::skipFunction().
64   bool shouldRunPass(const StringRef PassName,
65                      StringRef IRDescription) override;
66 
67   /// isEnabled() should return true before calling shouldRunPass().
68   bool isEnabled() const override { return BisectLimit != Disabled; }
69 
70   /// Set the new optimization limit and reset the counter. Passing
71   /// OptBisect::Disabled disables the limiting.
72   void setLimit(int Limit) {
73     BisectLimit = Limit;
74     LastBisectNum = 0;
75   }
76 
77   static const int Disabled = std::numeric_limits<int>::max();
78 
79 private:
80   int BisectLimit = Disabled;
81   int LastBisectNum = 0;
82 };
83 
84 /// Singleton instance of the OptBisect class, so multiple pass managers don't
85 /// need to coordinate their uses of OptBisect.
86 OptPassGate &getGlobalPassGate();
87 
88 } // end namespace llvm
89 
90 #endif // LLVM_IR_OPTBISECT_H
91