LLVM  13.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"
19 
20 namespace llvm {
21 
22 class Pass;
23 
24 /// Extensions to this class implement mechanisms to disable passes and
25 /// individual optimizations at compile time.
26 class OptPassGate {
27 public:
28  virtual ~OptPassGate() = default;
29 
30  /// IRDescription is a textual description of the IR unit the pass is running
31  /// over.
32  virtual bool shouldRunPass(const Pass *P, StringRef IRDescription) {
33  return true;
34  }
35 
36  /// isEnabled() should return true before calling shouldRunPass().
37  virtual bool isEnabled() const { return false; }
38 };
39 
40 /// This class implements a mechanism to disable passes and individual
41 /// optimizations at compile time based on a command line option
42 /// (-opt-bisect-limit) in order to perform a bisecting search for
43 /// optimization-related problems.
44 class OptBisect : public OptPassGate {
45 public:
46  /// Default constructor, initializes the OptBisect state based on the
47  /// -opt-bisect-limit command line argument.
48  ///
49  /// By default, bisection is disabled.
50  ///
51  /// Clients should not instantiate this class directly. All access should go
52  /// through LLVMContext.
53  OptBisect();
54 
55  virtual ~OptBisect() = default;
56 
57  /// Checks the bisect limit to determine if the specified pass should run.
58  ///
59  /// This forwards to checkPass().
60  bool shouldRunPass(const Pass *P, StringRef IRDescription) override;
61 
62  /// isEnabled() should return true before calling shouldRunPass().
63  bool isEnabled() const override { return BisectEnabled; }
64 
65  /// Checks the bisect limit to determine if the specified pass should run.
66  ///
67  /// If the bisect limit is set to -1, the function prints a message describing
68  /// the pass and the bisect number assigned to it and return true. Otherwise,
69  /// the function prints a message with the bisect number assigned to the
70  /// pass and indicating whether or not the pass will be run and return true if
71  /// the bisect limit has not yet been exceeded or false if it has.
72  ///
73  /// Most passes should not call this routine directly. Instead, they are
74  /// called through helper routines provided by the pass base classes. For
75  /// instance, function passes should call FunctionPass::skipFunction().
76  bool checkPass(const StringRef PassName, const StringRef TargetDesc);
77 
78 private:
79  bool BisectEnabled = false;
80  unsigned LastBisectNum = 0;
81 };
82 
83 /// Singleton instance of the OptBisect class, so multiple pass managers don't
84 /// need to coordinate their uses of OptBisect.
85 extern ManagedStatic<OptBisect> OptBisector;
86 } // end namespace llvm
87 
88 #endif // LLVM_IR_OPTBISECT_H
llvm::OptBisect::OptBisect
OptBisect()
Default constructor, initializes the OptBisect state based on the -opt-bisect-limit command line argu...
Definition: OptBisect.cpp:31
llvm
Definition: AllocatorList.h:23
Pass
print lazy value Lazy Value Info Printer Pass
Definition: LazyValueInfo.cpp:1947
StringRef.h
P
This currently compiles esp xmm0 movsd esp eax eax esp ret We should use not the dag combiner This is because dagcombine2 needs to be able to see through the X86ISD::Wrapper which DAGCombine can t really do The code for turning x load into a single vector load is target independent and should be moved to the dag combiner The code for turning x load into a vector load can only handle a direct load from a global or a direct load from the stack It should be generalized to handle any load from P
Definition: README-SSE.txt:411
ManagedStatic.h
llvm::OptPassGate::isEnabled
virtual bool isEnabled() const
isEnabled() should return true before calling shouldRunPass().
Definition: OptBisect.h:37
llvm::OptBisect
This class implements a mechanism to disable passes and individual optimizations at compile time base...
Definition: OptBisect.h:44
llvm::OptPassGate
Extensions to this class implement mechanisms to disable passes and individual optimizations at compi...
Definition: OptBisect.h:26
llvm::OptBisect::shouldRunPass
bool shouldRunPass(const Pass *P, StringRef IRDescription) override
Checks the bisect limit to determine if the specified pass should run.
Definition: OptBisect.cpp:42
llvm::OptBisect::checkPass
bool checkPass(const StringRef PassName, const StringRef TargetDesc)
Checks the bisect limit to determine if the specified pass should run.
Definition: OptBisect.cpp:48
llvm::OptPassGate::~OptPassGate
virtual ~OptPassGate()=default
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:57
llvm::OptBisector
ManagedStatic< OptBisect > OptBisector
Singleton instance of the OptBisect class, so multiple pass managers don't need to coordinate their u...
Definition: OptBisect.cpp:58
llvm::OptBisect::~OptBisect
virtual ~OptBisect()=default
llvm::Pass
Pass interface - Implemented by all 'passes'.
Definition: Pass.h:91
llvm::OptBisect::isEnabled
bool isEnabled() const override
isEnabled() should return true before calling shouldRunPass().
Definition: OptBisect.h:63
llvm::OptPassGate::shouldRunPass
virtual bool shouldRunPass(const Pass *P, StringRef IRDescription)
IRDescription is a textual description of the IR unit the pass is running over.
Definition: OptBisect.h:32
PassName
static const char PassName[]
Definition: X86LowerAMXIntrinsics.cpp:666