//===- IROutliner.h - Extract similar IR regions into functions --*- 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 // //===----------------------------------------------------------------------===// // // \file // The interface file for the IROutliner which is used by the IROutliner Pass. // // The outliner uses the IRSimilarityIdentifier to identify the similar regions // of code. It evaluates each set of IRSimilarityCandidates with an estimate of // whether it will provide code size reduction. Each region is extracted using // the code extractor. These extracted functions are consolidated into a single // function and called from the extracted call site. // // For example: // \code // %1 = add i32 %a, %b // %2 = add i32 %b, %a // %3 = add i32 %b, %a // %4 = add i32 %a, %b // \endcode // would become function // \code // define internal void outlined_ir_function(i32 %0, i32 %1) { // %1 = add i32 %0, %1 // %2 = add i32 %1, %0 // ret void // } // \endcode // with calls: // \code // call void outlined_ir_function(i32 %a, i32 %b) // call void outlined_ir_function(i32 %b, i32 %a) // \endcode // //===----------------------------------------------------------------------===// #ifndef LLVM_TRANSFORMS_IPO_IROUTLINER_H #define LLVM_TRANSFORMS_IPO_IROUTLINER_H #include "llvm/Analysis/IRSimilarityIdentifier.h" #include "llvm/IR/PassManager.h" #include "llvm/Support/InstructionCost.h" #include "llvm/Transforms/Utils/CodeExtractor.h" struct OutlinableGroup; namespace llvm { usingnamespaceCallingConv; usingnamespaceIRSimilarity; class Module; class TargetTransformInfo; class OptimizationRemarkEmitter; /// The OutlinableRegion holds all the information for a specific region, or /// sequence of instructions. This includes what values need to be hoisted to /// arguments from the extracted function, inputs and outputs to the region, and /// mapping from the extracted function arguments to overall function arguments. struct OutlinableRegion { … }; /// This class is a pass that identifies similarity in a Module, extracts /// instances of the similarity, and then consolidating the similar regions /// in an effort to reduce code size. It uses the IRSimilarityIdentifier pass /// to identify the similar regions of code, and then extracts the similar /// sections into a single function. See the above for an example as to /// how code is extracted and consolidated into a single function. class IROutliner { … }; /// Pass to outline similar regions. class IROutlinerPass : public PassInfoMixin<IROutlinerPass> { … }; } // end namespace llvm #endif // LLVM_TRANSFORMS_IPO_IROUTLINER_H