[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:40 PST 2024
================
@@ -787,48 +785,63 @@ bool MachineSinking::runOnMachineFunction(MachineFunction &MF) {
EverMadeChange = true;
}
- if (SinkInstsIntoCycle || AggressivelySinkInstsIntoCycle) {
+ if (SinkInstsIntoCycle) {
SmallVector<MachineCycle *, 8> Cycles(CI->toplevel_cycles());
+ SchedModel.init(STI);
+ enum CycleSinkStage { COPY, LOW_LATENCY, AGGRESSIVE, END };
- DenseMap<std::pair<MachineInstr *, MachineBasicBlock *>, MachineInstr *>
- SunkInstrs;
- 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)) {
- // AggressivelySinkInstsIntoCycle sinks a superset of instructions
- // relative to regular cycle sinking. Thus, this option supercedes
- // captures all sinking opportunites done
- if (AggressivelySinkInstsIntoCycle) {
- aggressivelySinkIntoCycle(Cycle, *I, SunkInstrs);
- EverMadeChange = true;
- ++NumCycleSunk;
+ CycleSinkStage Stage = CycleSinkStage::COPY;
+ bool HasHighPressure;
+ do {
+ HasHighPressure = false;
+ DenseMap<std::pair<MachineInstr *, MachineBasicBlock *>, MachineInstr *>
+ SunkInstrs;
+ 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);
+
+ unsigned i = 0;
+
+ // 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.
+ for (MachineInstr *I : llvm::reverse(Candidates)) {
+ // CycleSinkStage::COPY: Sink a limited number of copies
+ if (Stage == CycleSinkStage::COPY) {
+ if (i++ == SinkIntoCycleLimit) {
+ LLVM_DEBUG(dbgs()
+ << "CycleSink: Limit reached of instructions to "
+ "be analysed.");
----------------
arsenm wrote:
```suggestion
"be analyzed\n");
```
Missing newline
https://github.com/llvm/llvm-project/pull/117247
More information about the llvm-commits
mailing list