//===- MachinePipeliner.h - Machine Software Pipeliner Pass -------------===// // // 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 // //===----------------------------------------------------------------------===// // // An implementation of the Swing Modulo Scheduling (SMS) software pipeliner. // // Software pipelining (SWP) is an instruction scheduling technique for loops // that overlap loop iterations and exploits ILP via a compiler transformation. // // Swing Modulo Scheduling is an implementation of software pipelining // that generates schedules that are near optimal in terms of initiation // interval, register requirements, and stage count. See the papers: // // "Swing Modulo Scheduling: A Lifetime-Sensitive Approach", by J. Llosa, // A. Gonzalez, E. Ayguade, and M. Valero. In PACT '96 Proceedings of the 1996 // Conference on Parallel Architectures and Compilation Techiniques. // // "Lifetime-Sensitive Modulo Scheduling in a Production Environment", by J. // Llosa, E. Ayguade, A. Gonzalez, M. Valero, and J. Eckhardt. In IEEE // Transactions on Computers, Vol. 50, No. 3, 2001. // // "An Implementation of Swing Modulo Scheduling With Extensions for // Superblocks", by T. Lattner, Master's Thesis, University of Illinois at // Urbana-Champaign, 2005. // // // The SMS algorithm consists of three main steps after computing the minimal // initiation interval (MII). // 1) Analyze the dependence graph and compute information about each // instruction in the graph. // 2) Order the nodes (instructions) by priority based upon the heuristics // described in the algorithm. // 3) Attempt to schedule the nodes in the specified order using the MII. // //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_MACHINEPIPELINER_H #define LLVM_CODEGEN_MACHINEPIPELINER_H #include "llvm/ADT/SetVector.h" #include "llvm/CodeGen/DFAPacketizer.h" #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h" #include "llvm/CodeGen/MachineScheduler.h" #include "llvm/CodeGen/RegisterClassInfo.h" #include "llvm/CodeGen/ScheduleDAGInstrs.h" #include "llvm/CodeGen/ScheduleDAGMutation.h" #include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/CodeGen/WindowScheduler.h" #include "llvm/InitializePasses.h" #include <deque> namespace llvm { class AAResults; class NodeSet; class SMSchedule; extern cl::opt<bool> SwpEnableCopyToPhi; extern cl::opt<int> SwpForceIssueWidth; /// The main class in the implementation of the target independent /// software pipeliner pass. class MachinePipeliner : public MachineFunctionPass { … }; /// This class builds the dependence graph for the instructions in a loop, /// and attempts to schedule the instructions using the SMS algorithm. class SwingSchedulerDAG : public ScheduleDAGInstrs { … }; /// A NodeSet contains a set of SUnit DAG nodes with additional information /// that assigns a priority to the set. class NodeSet { … }; // 16 was selected based on the number of ProcResource kinds for all // existing Subtargets, so that SmallVector don't need to resize too often. static const int DefaultProcResSize = …; class ResourceManager { … }; /// This class represents the scheduled code. The main data structure is a /// map from scheduled cycle to instructions. During scheduling, the /// data structure explicitly represents all stages/iterations. When /// the algorithm finshes, the schedule is collapsed into a single stage, /// which represents instructions from different loop iterations. /// /// The SMS algorithm allows negative values for cycles, so the first cycle /// in the schedule is the smallest cycle value. class SMSchedule { … }; } // end namespace llvm #endif // LLVM_CODEGEN_MACHINEPIPELINER_H