//===- Transform/Utils/CodeExtractor.h - Code extraction util ---*- C++ -*-===// // // 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 // //===----------------------------------------------------------------------===// // // A utility to support extracting code from one function into its own // stand-alone function. // //===----------------------------------------------------------------------===// #ifndef LLVM_TRANSFORMS_UTILS_CODEEXTRACTOR_H #define LLVM_TRANSFORMS_UTILS_CODEEXTRACTOR_H #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SetVector.h" #include <limits> namespace llvm { template <typename PtrType> class SmallPtrSetImpl; class AllocaInst; class BasicBlock; class BlockFrequency; class BlockFrequencyInfo; class BranchProbabilityInfo; class AssumptionCache; class CallInst; class DominatorTree; class Function; class Instruction; class Module; class Type; class Value; /// A cache for the CodeExtractor analysis. The operation \ref /// CodeExtractor::extractCodeRegion is guaranteed not to invalidate this /// object. This object should conservatively be considered invalid if any /// other mutating operations on the IR occur. /// /// Constructing this object is O(n) in the size of the function. class CodeExtractorAnalysisCache { … }; /// Utility class for extracting code into a new function. /// /// This utility provides a simple interface for extracting some sequence of /// code into its own function, replacing it with a call to that function. It /// also provides various methods to query about the nature and result of /// such a transformation. /// /// The rough algorithm used is: /// 1) Find both the inputs and outputs for the extracted region. /// 2) Pass the inputs as arguments, remapping them within the extracted /// function to arguments. /// 3) Add allocas for any scalar outputs, adding all of the outputs' allocas /// as arguments, and inserting stores to the arguments for any scalars. class CodeExtractor { … }; } // end namespace llvm #endif // LLVM_TRANSFORMS_UTILS_CODEEXTRACTOR_H