| //===- llvm/IR/OptBisect/Bisect.cpp - LLVM Bisect support -----------------===// | 
 | // | 
 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
 | // See https://llvm.org/LICENSE.txt for license information. | 
 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | /// \file | 
 | /// This file implements support for a bisecting optimizations based on a | 
 | /// command line option. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "llvm/IR/OptBisect.h" | 
 | #include "llvm/ADT/StringRef.h" | 
 | #include "llvm/Pass.h" | 
 | #include "llvm/Support/CommandLine.h" | 
 | #include "llvm/Support/raw_ostream.h" | 
 | #include <cassert> | 
 | #include <limits> | 
 | #include <string> | 
 |  | 
 | using namespace llvm; | 
 |  | 
 | static cl::opt<int> OptBisectLimit("opt-bisect-limit", cl::Hidden, | 
 |                                    cl::init(std::numeric_limits<int>::max()), | 
 |                                    cl::Optional, | 
 |                                    cl::desc("Maximum optimization to perform")); | 
 |  | 
 | OptBisect::OptBisect() : OptPassGate() { | 
 |   BisectEnabled = OptBisectLimit != std::numeric_limits<int>::max(); | 
 | } | 
 |  | 
 | static void printPassMessage(const StringRef &Name, int PassNum, | 
 |                              StringRef TargetDesc, bool Running) { | 
 |   StringRef Status = Running ? "" : "NOT "; | 
 |   errs() << "BISECT: " << Status << "running pass " | 
 |          << "(" << PassNum << ") " << Name << " on " << TargetDesc << "\n"; | 
 | } | 
 |  | 
 | bool OptBisect::shouldRunPass(const Pass *P, StringRef IRDescription) { | 
 |   assert(BisectEnabled); | 
 |  | 
 |   return checkPass(P->getPassName(), IRDescription); | 
 | } | 
 |  | 
 | bool OptBisect::checkPass(const StringRef PassName, | 
 |                           const StringRef TargetDesc) { | 
 |   assert(BisectEnabled); | 
 |  | 
 |   int CurBisectNum = ++LastBisectNum; | 
 |   bool ShouldRun = (OptBisectLimit == -1 || CurBisectNum <= OptBisectLimit); | 
 |   printPassMessage(PassName, CurBisectNum, TargetDesc, ShouldRun); | 
 |   return ShouldRun; | 
 | } |