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 shouldRunPass(const Pass * P,const Module & U)36 virtual bool shouldRunPass(const Pass *P, const Module &U) { return true; } shouldRunPass(const Pass * P,const Function & U)37 virtual bool shouldRunPass(const Pass *P, const Function &U) {return true; } shouldRunPass(const Pass * P,const BasicBlock & U)38 virtual bool shouldRunPass(const Pass *P, const BasicBlock &U) { return true; } shouldRunPass(const Pass * P,const Region & U)39 virtual bool shouldRunPass(const Pass *P, const Region &U) { return true; } shouldRunPass(const Pass * P,const Loop & U)40 virtual bool shouldRunPass(const Pass *P, const Loop &U) { return true; } shouldRunPass(const Pass * P,const CallGraphSCC & U)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 90