SchedulerRegistry.h 4.3 KB

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