blob: cfc724c1678259ed13455fab71dce885dca8e1a2 [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===- 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
20namespace llvm {
21
22class Pass;
23class Module;
24class Function;
25class BasicBlock;
26class Region;
27class Loop;
28class CallGraphSCC;
29
30/// Extensions to this class implement mechanisms to disable passes and
31/// individual optimizations at compile time.
32class OptPassGate {
33public:
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.
48class OptBisect : public OptPassGate {
49public:
50 /// \brief 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
80private:
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