Index: llvm/trunk/include/llvm/CodeGen/MachineScheduler.h =================================================================== --- llvm/trunk/include/llvm/CodeGen/MachineScheduler.h +++ llvm/trunk/include/llvm/CodeGen/MachineScheduler.h @@ -997,6 +997,22 @@ void pickNodeFromQueue(SchedCandidate &Cand); }; +std::unique_ptr +createLoadClusterDAGMutation(const TargetInstrInfo *TII, + const TargetRegisterInfo *TRI); + +std::unique_ptr +createStoreClusterDAGMutation(const TargetInstrInfo *TII, + const TargetRegisterInfo *TRI); + +std::unique_ptr +createMacroFusionDAGMutation(const TargetInstrInfo *TII, + const TargetRegisterInfo *TRI); + +std::unique_ptr +createCopyConstrainDAGMutation(const TargetInstrInfo *TII, + const TargetRegisterInfo *TRI); + } // namespace llvm #endif Index: llvm/trunk/lib/CodeGen/MachineScheduler.cpp =================================================================== --- llvm/trunk/lib/CodeGen/MachineScheduler.cpp +++ llvm/trunk/lib/CodeGen/MachineScheduler.cpp @@ -1392,6 +1392,22 @@ }; } // anonymous +namespace llvm { + +std::unique_ptr +createLoadClusterDAGMutation(const TargetInstrInfo *TII, + const TargetRegisterInfo *TRI) { + return make_unique(TII, TRI); +} + +std::unique_ptr +createStoreClusterDAGMutation(const TargetInstrInfo *TII, + const TargetRegisterInfo *TRI) { + return make_unique(TII, TRI); +} + +} // namespace llvm + void BaseMemOpClusterMutation::clusterNeighboringMemOps( ArrayRef MemOps, ScheduleDAGMI *DAG) { SmallVector MemOpRecords; @@ -1493,6 +1509,16 @@ }; } // anonymous +namespace llvm { + +std::unique_ptr +createMacroFusionDAGMutation(const TargetInstrInfo *TII, + const TargetRegisterInfo *TRI) { + return make_unique(*TII, *TRI); +} + +} // namespace llvm + /// Returns true if \p MI reads a register written by \p Other. static bool HasDataDep(const TargetRegisterInfo &TRI, const MachineInstr &MI, const MachineInstr &Other) { @@ -1569,6 +1595,16 @@ }; } // anonymous +namespace llvm { + +std::unique_ptr +createCopyConstrainDAGMutation(const TargetInstrInfo *TII, + const TargetRegisterInfo *TRI) { + return make_unique(TII, TRI); +} + +} // namespace llvm + /// constrainLocalCopy handles two possibilities: /// 1) Local src: /// I0: = dst @@ -3109,15 +3145,15 @@ // FIXME: extend the mutation API to allow earlier mutations to instantiate // data and pass it to later mutations. Have a single mutation that gathers // the interesting nodes in one pass. - DAG->addMutation(make_unique(DAG->TII, DAG->TRI)); + DAG->addMutation(createCopyConstrainDAGMutation(DAG->TII, DAG->TRI)); if (EnableMemOpCluster) { if (DAG->TII->enableClusterLoads()) - DAG->addMutation(make_unique(DAG->TII, DAG->TRI)); + DAG->addMutation(createLoadClusterDAGMutation(DAG->TII, DAG->TRI)); if (DAG->TII->enableClusterStores()) - DAG->addMutation(make_unique(DAG->TII, DAG->TRI)); + DAG->addMutation(createStoreClusterDAGMutation(DAG->TII, DAG->TRI)); } if (EnableMacroFusion) - DAG->addMutation(make_unique(*DAG->TII, *DAG->TRI)); + DAG->addMutation(createMacroFusionDAGMutation(DAG->TII, DAG->TRI)); return DAG; }