]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/include/llvm/IR/OptBisect.h
Merge clang 7.0.1 and several follow-up changes
[FreeBSD/FreeBSD.git] / contrib / llvm / include / llvm / IR / OptBisect.h
1 //===- llvm/IR/OptBisect.h - LLVM Bisect support ----------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// This file declares the interface for bisecting optimizations.
12 ///
13 //===----------------------------------------------------------------------===//
14
15 #ifndef LLVM_IR_OPTBISECT_H
16 #define LLVM_IR_OPTBISECT_H
17
18 #include "llvm/ADT/StringRef.h"
19
20 namespace llvm {
21
22 class Pass;
23 class Module;
24 class Function;
25 class BasicBlock;
26 class Region;
27 class Loop;
28 class CallGraphSCC;
29
30 /// Extensions to this class implement mechanisms to disable passes and
31 /// individual optimizations at compile time.
32 class OptPassGate {
33 public:
34   virtual ~OptPassGate() = default;
35
36   virtual bool shouldRunPass(const Pass *P, const Module &U) { return true; }
37   virtual bool shouldRunPass(const Pass *P, const Function &U)  {return true; }
38   virtual bool shouldRunPass(const Pass *P, const BasicBlock &U)  { return true; }
39   virtual bool shouldRunPass(const Pass *P, const Region &U)  { return true; }
40   virtual bool shouldRunPass(const Pass *P, const Loop &U)  { return true; }
41   virtual bool shouldRunPass(const Pass *P, const CallGraphSCC &U)  { return true; }
42 };
43
44 /// This class implements a mechanism to disable passes and individual
45 /// optimizations at compile time based on a command line option
46 /// (-opt-bisect-limit) in order to perform a bisecting search for
47 /// optimization-related problems.
48 class OptBisect : public OptPassGate {
49 public:
50   /// Default constructor, initializes the OptBisect state based on the
51   /// -opt-bisect-limit command line argument.
52   ///
53   /// By default, bisection is disabled.
54   ///
55   /// Clients should not instantiate this class directly.  All access should go
56   /// through LLVMContext.
57   OptBisect();
58
59   virtual ~OptBisect() = default;
60
61   /// Checks the bisect limit to determine if the specified pass should run.
62   ///
63   /// These functions immediately return true if bisection is disabled. If the
64   /// bisect limit is set to -1, the functions print a message describing
65   /// the pass and the bisect number assigned to it and return true.  Otherwise,
66   /// the functions print a message with the bisect number assigned to the
67   /// pass and indicating whether or not the pass will be run and return true if
68   /// the bisect limit has not yet been exceeded or false if it has.
69   ///
70   /// Most passes should not call these routines directly. Instead, they are
71   /// called through helper routines provided by the pass base classes.  For
72   /// instance, function passes should call FunctionPass::skipFunction().
73   bool shouldRunPass(const Pass *P, const Module &U) override;
74   bool shouldRunPass(const Pass *P, const Function &U) override;
75   bool shouldRunPass(const Pass *P, const BasicBlock &U) override;
76   bool shouldRunPass(const Pass *P, const Region &U) override;
77   bool shouldRunPass(const Pass *P, const Loop &U) override;
78   bool shouldRunPass(const Pass *P, const CallGraphSCC &U) override;
79
80 private:
81   bool checkPass(const StringRef PassName, const StringRef TargetDesc);
82
83   bool BisectEnabled = false;
84   unsigned LastBisectNum = 0;
85 };
86
87 } // end namespace llvm
88
89 #endif // LLVM_IR_OPTBISECT_H