[llvm] [MachineSink] Add capability for aggressive loop sinking (PR #117247)
Matt Arsenault via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 6 08:46:41 PST 2024
================
@@ -771,32 +787,61 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
if (SinkInstsIntoCycle) {
SmallVector<MachineCycle *, 8> Cycles(CI->toplevel_cycles());
- for (auto *Cycle : Cycles) {
- MachineBasicBlock *Preheader = Cycle->getCyclePreheader();
- if (!Preheader) {
- LLVM_DEBUG(dbgs() << "CycleSink: Can't find preheader\n");
- continue;
- }
- SmallVector<MachineInstr *, 8> Candidates;
- FindCycleSinkCandidates(Cycle, Preheader, Candidates);
-
- // Walk the candidates in reverse order so that we start with the use
- // of a def-use chain, if there is any.
- // TODO: Sort the candidates using a cost-model.
- unsigned i = 0;
- for (MachineInstr *I : llvm::reverse(Candidates)) {
- if (i++ == SinkIntoCycleLimit) {
- LLVM_DEBUG(dbgs() << "CycleSink: Limit reached of instructions to "
- "be analysed.");
- break;
+ SchedModel.init(STI);
+ enum CycleSinkStage { COPY, LOW_LATENCY, AGGRESSIVE, END };
+
+ CycleSinkStage Stage = CycleSinkStage::COPY;
+ bool HasHighPressure;
+ do {
+ HasHighPressure = false;
+ DenseMap<std::pair<MachineInstr *, MachineBasicBlock *>, MachineInstr *>
+ SunkInstrs;
----------------
arsenm wrote:
Pull definition out of loop and clear the map each cycle?
https://github.com/llvm/llvm-project/pull/117247
More information about the llvm-commits
mailing list