//===-- GCNSchedStrategy.h - GCN Scheduler Strategy -*- 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 // //===----------------------------------------------------------------------===// #ifndef LLVM_LIB_TARGET_AMDGPU_GCNSCHEDSTRATEGY_H #define LLVM_LIB_TARGET_AMDGPU_GCNSCHEDSTRATEGY_H #include "GCNRegPressure.h" #include "llvm/ADT/MapVector.h" #include "llvm/CodeGen/MachineScheduler.h" namespace llvm { class SIMachineFunctionInfo; class SIRegisterInfo; class GCNSubtarget; class GCNSchedStage; enum class GCNSchedStageID : unsigned { … }; #ifndef NDEBUG raw_ostream &operator<<(raw_ostream &OS, const GCNSchedStageID &StageID); #endif /// This is a minimal scheduler strategy. The main difference between this /// and the GenericScheduler is that GCNSchedStrategy uses different /// heuristics to determine excess/critical pressure sets. class GCNSchedStrategy : public GenericScheduler { … }; /// The goal of this scheduling strategy is to maximize kernel occupancy (i.e. /// maximum number of waves per simd). class GCNMaxOccupancySchedStrategy final : public GCNSchedStrategy { … }; /// The goal of this scheduling strategy is to maximize ILP for a single wave /// (i.e. latency hiding). class GCNMaxILPSchedStrategy final : public GCNSchedStrategy { … }; class ScheduleMetrics { … }; inline raw_ostream &operator<<(raw_ostream &OS, const ScheduleMetrics &Sm) { … } class GCNScheduleDAGMILive final : public ScheduleDAGMILive { … }; // GCNSchedStrategy applies multiple scheduling stages to a function. class GCNSchedStage { … }; class OccInitialScheduleStage : public GCNSchedStage { … }; class UnclusteredHighRPStage : public GCNSchedStage { … }; // Retry function scheduling if we found resulting occupancy and it is // lower than used for other scheduling passes. This will give more freedom // to schedule low register pressure blocks. class ClusteredLowOccStage : public GCNSchedStage { … }; class PreRARematStage : public GCNSchedStage { … }; class ILPInitialScheduleStage : public GCNSchedStage { … }; class GCNPostScheduleDAGMILive final : public ScheduleDAGMI { … }; } // End namespace llvm #endif // LLVM_LIB_TARGET_AMDGPU_GCNSCHEDSTRATEGY_H