//===- llvm/CodeGen/MachineLoopInfo.h - Natural Loop Calculator -*- 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 // //===----------------------------------------------------------------------===// // // This file defines the MachineLoopInfo class that is used to identify natural // loops and determine the loop depth of various nodes of the CFG. Note that // natural loops may actually be several loops that share the same header node. // // This analysis calculates the nesting structure of loops in a function. For // each natural loop identified, this analysis identifies natural loops // contained entirely within the loop and the basic blocks the make up the loop. // // It can calculate on the fly various bits of information, for example: // // * whether there is a preheader for the loop // * the number of back edges to the header // * whether or not a particular block branches out of the loop // * the successor blocks of the loop // * the loop depth // * the trip count // * etc... // //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_MACHINELOOPINFO_H #define LLVM_CODEGEN_MACHINELOOPINFO_H #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachinePassManager.h" #include "llvm/IR/CFG.h" #include "llvm/IR/DebugLoc.h" #include "llvm/Support/GenericLoopInfo.h" namespace llvm { class MachineDominatorTree; // Implementation in LoopInfoImpl.h class MachineLoop; extern template class LoopBase<MachineBasicBlock, MachineLoop>; class MachineLoop : public LoopBase<MachineBasicBlock, MachineLoop> { … }; // Implementation in LoopInfoImpl.h extern template class LoopInfoBase<MachineBasicBlock, MachineLoop>; class MachineLoopInfo : public LoopInfoBase<MachineBasicBlock, MachineLoop> { … }; /// Analysis pass that exposes the \c MachineLoopInfo for a machine function. class MachineLoopAnalysis : public AnalysisInfoMixin<MachineLoopAnalysis> { … }; /// Printer pass for the \c LoopAnalysis results. class MachineLoopPrinterPass : public PassInfoMixin<MachineLoopPrinterPass> { … }; class MachineLoopInfoWrapperPass : public MachineFunctionPass { … }; // Allow clients to walk the list of nested loops... template <> struct GraphTraits<const MachineLoop*> { … }; template <> struct GraphTraits<MachineLoop*> { … }; } // end namespace llvm #endif // LLVM_CODEGEN_MACHINELOOPINFO_H