[llvm] [MISched] Add statistics to quantify scheduling (PR #138090)

Cullen Rhodes via llvm-commits llvm-commits at lists.llvm.org
Fri May 2 01:18:28 PDT 2025


https://github.com/c-rhodes updated https://github.com/llvm/llvm-project/pull/138090

>From 115327ae17ce338a897b650b8c52b1811cdec298 Mon Sep 17 00:00:00 2001
From: Cullen Rhodes <cullen.rhodes at arm.com>
Date: Tue, 29 Apr 2025 16:06:27 +0000
Subject: [PATCH 1/2] [MISched] Add statistics to quantify scheduling

When diagnosing scheduler issues it can be useful to know how scheduling
changes the order of instructions, particularly for large functions when
it's not trivial to figure out from the debug output by looking at the
scheduling unit (SU) IDs.

This adds pre-RA and post-RA statistics to track 1) the number of
instructions that remain in source order after scheduling and 2) the
total number of instructions scheduled, to compare 1) against.
---
 llvm/include/llvm/CodeGen/MachineScheduler.h |  3 ++
 llvm/lib/CodeGen/MachineScheduler.cpp        | 33 ++++++++++++++++++++
 2 files changed, 36 insertions(+)

diff --git a/llvm/include/llvm/CodeGen/MachineScheduler.h b/llvm/include/llvm/CodeGen/MachineScheduler.h
index bc00d0b4ff852..1660fe6864a92 100644
--- a/llvm/include/llvm/CodeGen/MachineScheduler.h
+++ b/llvm/include/llvm/CodeGen/MachineScheduler.h
@@ -1196,6 +1196,9 @@ class GenericSchedulerBase : public MachineSchedStrategy {
   const MachineSchedContext *Context;
   const TargetSchedModel *SchedModel = nullptr;
   const TargetRegisterInfo *TRI = nullptr;
+  unsigned TopIdx = 0;
+  unsigned BotIdx = 0;
+  unsigned NumRegionInstrs = 0;
 
   MachineSchedPolicy RegionPolicy;
 
diff --git a/llvm/lib/CodeGen/MachineScheduler.cpp b/llvm/lib/CodeGen/MachineScheduler.cpp
index 97f27277aface..e418d72aa96ab 100644
--- a/llvm/lib/CodeGen/MachineScheduler.cpp
+++ b/llvm/lib/CodeGen/MachineScheduler.cpp
@@ -74,6 +74,14 @@ using namespace llvm;
 
 #define DEBUG_TYPE "machine-scheduler"
 
+STATISTIC(NumInstrsInSourceOrderPreRA,
+          "Number of instructions in source order after pre-RA scheduling");
+STATISTIC(NumInstrsInSourceOrderPostRA,
+          "Number of instructions in source order after post-RA scheduling");
+STATISTIC(NumInstrsScheduledPreRA,
+          "Number of instructions scheduled by pre-RA scheduler");
+STATISTIC(NumInstrsScheduledPostRA,
+          "Number of instructions scheduled by post-RA scheduler");
 STATISTIC(NumClustered, "Number of load/store pairs clustered");
 
 namespace llvm {
@@ -3503,6 +3511,9 @@ void GenericScheduler::initPolicy(MachineBasicBlock::iterator Begin,
     RegionPolicy.OnlyBottomUp = false;
     RegionPolicy.OnlyTopDown = false;
   }
+
+  this->BotIdx = NumRegionInstrs - 1;
+  this->NumRegionInstrs = NumRegionInstrs;
 }
 
 void GenericScheduler::dumpPolicy() const {
@@ -3979,6 +3990,17 @@ SUnit *GenericScheduler::pickNode(bool &IsTopNode) {
 
   LLVM_DEBUG(dbgs() << "Scheduling SU(" << SU->NodeNum << ") "
                     << *SU->getInstr());
+
+  if (IsTopNode) {
+    if (SU->NodeNum == TopIdx++)
+      ++NumInstrsInSourceOrderPreRA;
+  } else {
+    if (SU->NodeNum == BotIdx--)
+      ++NumInstrsInSourceOrderPreRA;
+  }
+
+  NumInstrsScheduledPreRA += 1;
+
   return SU;
 }
 
@@ -4321,6 +4343,17 @@ SUnit *PostGenericScheduler::pickNode(bool &IsTopNode) {
 
   LLVM_DEBUG(dbgs() << "Scheduling SU(" << SU->NodeNum << ") "
                     << *SU->getInstr());
+
+  if (IsTopNode) {
+    if (SU->NodeNum == TopIdx++)
+      ++NumInstrsInSourceOrderPostRA;
+  } else {
+    if (SU->NodeNum == BotIdx--)
+      ++NumInstrsInSourceOrderPostRA;
+  }
+
+  NumInstrsScheduledPostRA += 1;
+
   return SU;
 }
 

>From 0c8415809d8b659fd2a4ec36539d00cd23b102ce Mon Sep 17 00:00:00 2001
From: Cullen Rhodes <cullen.rhodes at arm.com>
Date: Fri, 2 May 2025 08:16:00 +0000
Subject: [PATCH 2/2] address comments

---
 llvm/lib/CodeGen/MachineScheduler.cpp | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/llvm/lib/CodeGen/MachineScheduler.cpp b/llvm/lib/CodeGen/MachineScheduler.cpp
index e418d72aa96ab..811d949fab1fa 100644
--- a/llvm/lib/CodeGen/MachineScheduler.cpp
+++ b/llvm/lib/CodeGen/MachineScheduler.cpp
@@ -3512,7 +3512,7 @@ void GenericScheduler::initPolicy(MachineBasicBlock::iterator Begin,
     RegionPolicy.OnlyTopDown = false;
   }
 
-  this->BotIdx = NumRegionInstrs - 1;
+  BotIdx = NumRegionInstrs - 1;
   this->NumRegionInstrs = NumRegionInstrs;
 }
 
@@ -3995,6 +3995,7 @@ SUnit *GenericScheduler::pickNode(bool &IsTopNode) {
     if (SU->NodeNum == TopIdx++)
       ++NumInstrsInSourceOrderPreRA;
   } else {
+    assert(BotIdx < NumRegionInstrs && "out of bounds");
     if (SU->NodeNum == BotIdx--)
       ++NumInstrsInSourceOrderPreRA;
   }
@@ -4348,6 +4349,7 @@ SUnit *PostGenericScheduler::pickNode(bool &IsTopNode) {
     if (SU->NodeNum == TopIdx++)
       ++NumInstrsInSourceOrderPostRA;
   } else {
+    assert(BotIdx < NumRegionInstrs && "out of bounds");
     if (SU->NodeNum == BotIdx--)
       ++NumInstrsInSourceOrderPostRA;
   }



More information about the llvm-commits mailing list