SchedulerRegistry.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. //===-- llvm/CodeGen/SchedulerRegistry.h ------------------------*- C++ -*-===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file contains the implementation for instruction scheduler function
  11. // pass registry (RegisterScheduler).
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #ifndef LLVM_CODEGEN_SCHEDULERREGISTRY_H
  15. #define LLVM_CODEGEN_SCHEDULERREGISTRY_H
  16. #include "llvm/CodeGen/MachinePassRegistry.h"
  17. #include "llvm/Target/TargetMachine.h"
  18. namespace llvm {
  19. //===----------------------------------------------------------------------===//
  20. ///
  21. /// RegisterScheduler class - Track the registration of instruction schedulers.
  22. ///
  23. // //
  24. ///////////////////////////////////////////////////////////////////////////////
  25. class SelectionDAGISel;
  26. class ScheduleDAGSDNodes;
  27. class SelectionDAG;
  28. class MachineBasicBlock;
  29. class RegisterScheduler : public MachinePassRegistryNode {
  30. public:
  31. typedef ScheduleDAGSDNodes *(*FunctionPassCtor)(SelectionDAGISel*,
  32. CodeGenOpt::Level);
  33. static MachinePassRegistry Registry;
  34. RegisterScheduler(const char *N, const char *D, FunctionPassCtor C)
  35. : MachinePassRegistryNode(N, D, (MachinePassCtor)C)
  36. { Registry.Add(this); }
  37. ~RegisterScheduler() { Registry.Remove(this); }
  38. // Accessors.
  39. //
  40. RegisterScheduler *getNext() const {
  41. return (RegisterScheduler *)MachinePassRegistryNode::getNext();
  42. }
  43. static RegisterScheduler *getList() {
  44. return (RegisterScheduler *)Registry.getList();
  45. }
  46. static FunctionPassCtor getDefault() {
  47. return (FunctionPassCtor)Registry.getDefault();
  48. }
  49. static void setDefault(FunctionPassCtor C) {
  50. Registry.setDefault((MachinePassCtor)C);
  51. }
  52. static void setListener(MachinePassRegistryListener *L) {
  53. Registry.setListener(L);
  54. }
  55. };
  56. /// createBURRListDAGScheduler - This creates a bottom up register usage
  57. /// reduction list scheduler.
  58. ScheduleDAGSDNodes *createBURRListDAGScheduler(SelectionDAGISel *IS,
  59. CodeGenOpt::Level OptLevel);
  60. /// createBURRListDAGScheduler - This creates a bottom up list scheduler that
  61. /// schedules nodes in source code order when possible.
  62. ScheduleDAGSDNodes *createSourceListDAGScheduler(SelectionDAGISel *IS,
  63. CodeGenOpt::Level OptLevel);
  64. /// createHybridListDAGScheduler - This creates a bottom up register pressure
  65. /// aware list scheduler that make use of latency information to avoid stalls
  66. /// for long latency instructions in low register pressure mode. In high
  67. /// register pressure mode it schedules to reduce register pressure.
  68. ScheduleDAGSDNodes *createHybridListDAGScheduler(SelectionDAGISel *IS,
  69. CodeGenOpt::Level);
  70. /// createILPListDAGScheduler - This creates a bottom up register pressure
  71. /// aware list scheduler that tries to increase instruction level parallelism
  72. /// in low register pressure mode. In high register pressure mode it schedules
  73. /// to reduce register pressure.
  74. ScheduleDAGSDNodes *createILPListDAGScheduler(SelectionDAGISel *IS,
  75. CodeGenOpt::Level);
  76. /// createFastDAGScheduler - This creates a "fast" scheduler.
  77. ///
  78. ScheduleDAGSDNodes *createFastDAGScheduler(SelectionDAGISel *IS,
  79. CodeGenOpt::Level OptLevel);
  80. /// createVLIWDAGScheduler - Scheduler for VLIW targets. This creates top down
  81. /// DFA driven list scheduler with clustering heuristic to control
  82. /// register pressure.
  83. ScheduleDAGSDNodes *createVLIWDAGScheduler(SelectionDAGISel *IS,
  84. CodeGenOpt::Level OptLevel);
  85. /// createDefaultScheduler - This creates an instruction scheduler appropriate
  86. /// for the target.
  87. ScheduleDAGSDNodes *createDefaultScheduler(SelectionDAGISel *IS,
  88. CodeGenOpt::Level OptLevel);
  89. /// createDAGLinearizer - This creates a "no-scheduling" scheduler which
  90. /// linearize the DAG using topological order.
  91. ScheduleDAGSDNodes *createDAGLinearizer(SelectionDAGISel *IS,
  92. CodeGenOpt::Level OptLevel);
  93. } // end namespace llvm
  94. #endif