[llvm] 9f33943 - [GreedyRA ORE] Add stats for copy of virtual registers.

Serguei Katkov via llvm-commits llvm-commits at lists.llvm.org
Sun Apr 18 23:16:35 PDT 2021


Author: Serguei Katkov
Date: 2021-04-19T12:43:44+07:00
New Revision: 9f33943ee0155ba05d509e7a3b6999f51d0bff6d

URL: https://github.com/llvm/llvm-project/commit/9f33943ee0155ba05d509e7a3b6999f51d0bff6d
DIFF: https://github.com/llvm/llvm-project/commit/9f33943ee0155ba05d509e7a3b6999f51d0bff6d.diff

LOG: [GreedyRA ORE] Add stats for copy of virtual registers.

Greedy RA adds copies of virtual registers when splitting live interval.
This stat might be useful.

Reviewers: reames, MatzeB, anemet, thegameg
Reviewed By: reames
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D100017

Added: 
    

Modified: 
    llvm/lib/CodeGen/RegAllocGreedy.cpp
    llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll
    llvm/test/CodeGen/X86/statepoint-ra.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/RegAllocGreedy.cpp b/llvm/lib/CodeGen/RegAllocGreedy.cpp
index cede0e3ea556a..d377ca66a2d25 100644
--- a/llvm/lib/CodeGen/RegAllocGreedy.cpp
+++ b/llvm/lib/CodeGen/RegAllocGreedy.cpp
@@ -554,10 +554,11 @@ class RAGreedy : public MachineFunctionPass,
     unsigned ZeroCostFoldedReloads = 0;
     unsigned Spills = 0;
     unsigned FoldedSpills = 0;
+    unsigned Copies = 0;
 
     bool isEmpty() {
       return !(Reloads || FoldedReloads || Spills || FoldedSpills ||
-               ZeroCostFoldedReloads);
+               ZeroCostFoldedReloads || Copies);
     }
 
     void add(RAGreedyStats other) {
@@ -566,19 +567,20 @@ class RAGreedy : public MachineFunctionPass,
       ZeroCostFoldedReloads += other.ZeroCostFoldedReloads;
       Spills += other.Spills;
       FoldedSpills += other.FoldedSpills;
+      Copies += other.Copies;
     }
 
     void report(MachineOptimizationRemarkMissed &R);
   };
 
-  /// Compute the number of spills and reloads for a basic block.
-  RAGreedyStats computeNumberOfSplillsReloads(MachineBasicBlock &MBB);
+  /// Compute statistic for a basic block.
+  RAGreedyStats computeStats(MachineBasicBlock &MBB);
 
-  /// Compute and report the number of spills through a remark.
-  RAGreedyStats reportNumberOfSplillsReloads(MachineLoop *L);
+  /// Compute and report statistic through a remark.
+  RAGreedyStats reportStats(MachineLoop *L);
 
-  /// Report the number of spills and reloads for each loop.
-  void reportNumberOfSplillsReloads();
+  /// Report the statistic for each loop.
+  void reportStats();
 };
 
 } // end anonymous namespace
@@ -3145,10 +3147,11 @@ void RAGreedy::RAGreedyStats::report(MachineOptimizationRemarkMissed &R) {
   if (ZeroCostFoldedReloads)
     R << NV("NumZeroCostFoldedReloads", ZeroCostFoldedReloads)
       << " zero cost folded reloads ";
+  if (Copies)
+    R << NV("NumVRCopies", Copies) << " virtual registers copies ";
 }
 
-RAGreedy::RAGreedyStats
-RAGreedy::computeNumberOfSplillsReloads(MachineBasicBlock &MBB) {
+RAGreedy::RAGreedyStats RAGreedy::computeStats(MachineBasicBlock &MBB) {
   RAGreedyStats Stats;
   const MachineFrameInfo &MFI = MF->getFrameInfo();
   int FI;
@@ -3163,8 +3166,16 @@ RAGreedy::computeNumberOfSplillsReloads(MachineBasicBlock &MBB) {
            MI.getOpcode() == TargetOpcode::STATEPOINT;
   };
   for (MachineInstr &MI : MBB) {
-    SmallVector<const MachineMemOperand *, 2> Accesses;
+    if (MI.isCopy()) {
+      MachineOperand &Dest = MI.getOperand(0);
+      MachineOperand &Src = MI.getOperand(1);
+      if (Dest.isReg() && Src.isReg() && Dest.getReg().isVirtual() &&
+          Src.getReg().isVirtual())
+        ++Stats.Copies;
+      continue;
+    }
 
+    SmallVector<const MachineMemOperand *, 2> Accesses;
     if (TII->isLoadFromStackSlot(MI, FI) && MFI.isSpillSlotObjectIndex(FI)) {
       ++Stats.Reloads;
       continue;
@@ -3209,23 +3220,23 @@ RAGreedy::computeNumberOfSplillsReloads(MachineBasicBlock &MBB) {
   return Stats;
 }
 
-RAGreedy::RAGreedyStats RAGreedy::reportNumberOfSplillsReloads(MachineLoop *L) {
+RAGreedy::RAGreedyStats RAGreedy::reportStats(MachineLoop *L) {
   RAGreedyStats Stats;
 
   // Sum up the spill and reloads in subloops.
   for (MachineLoop *SubLoop : *L)
-    Stats.add(reportNumberOfSplillsReloads(SubLoop));
+    Stats.add(reportStats(SubLoop));
 
   for (MachineBasicBlock *MBB : L->getBlocks())
     // Handle blocks that were not included in subloops.
     if (Loops->getLoopFor(MBB) == L)
-      Stats.add(computeNumberOfSplillsReloads(*MBB));
+      Stats.add(computeStats(*MBB));
 
   if (!Stats.isEmpty()) {
     using namespace ore;
 
     ORE->emit([&]() {
-      MachineOptimizationRemarkMissed R(DEBUG_TYPE, "LoopSpillReload",
+      MachineOptimizationRemarkMissed R(DEBUG_TYPE, "LoopSpillReloadCopies",
                                         L->getStartLoc(), L->getHeader());
       Stats.report(R);
       R << "generated in loop";
@@ -3235,16 +3246,16 @@ RAGreedy::RAGreedyStats RAGreedy::reportNumberOfSplillsReloads(MachineLoop *L) {
   return Stats;
 }
 
-void RAGreedy::reportNumberOfSplillsReloads() {
+void RAGreedy::reportStats() {
   if (!ORE->allowExtraAnalysis(DEBUG_TYPE))
     return;
   RAGreedyStats Stats;
   for (MachineLoop *L : *Loops)
-    Stats.add(reportNumberOfSplillsReloads(L));
+    Stats.add(reportStats(L));
   // Process non-loop blocks.
   for (MachineBasicBlock &MBB : *MF)
     if (!Loops->getLoopFor(&MBB))
-      Stats.add(computeNumberOfSplillsReloads(MBB));
+      Stats.add(computeStats(MBB));
   if (!Stats.isEmpty()) {
     using namespace ore;
 
@@ -3252,7 +3263,7 @@ void RAGreedy::reportNumberOfSplillsReloads() {
       DebugLoc Loc;
       if (auto *SP = MF->getFunction().getSubprogram())
         Loc = DILocation::get(SP->getContext(), SP->getLine(), 1, SP);
-      MachineOptimizationRemarkMissed R(DEBUG_TYPE, "SpillReload", Loc,
+      MachineOptimizationRemarkMissed R(DEBUG_TYPE, "SpillReloadCopies", Loc,
                                         &MF->front());
       Stats.report(R);
       R << "generated in function";
@@ -3322,7 +3333,7 @@ bool RAGreedy::runOnMachineFunction(MachineFunction &mf) {
   if (VerifyEnabled)
     MF->verify(this, "Before post optimization");
   postOptimization();
-  reportNumberOfSplillsReloads();
+  reportStats();
 
   releaseMemory();
   return true;

diff  --git a/llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll b/llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll
index e7c8408a76292..f17932facd57f 100644
--- a/llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-spill-remarks.ll
@@ -39,7 +39,7 @@
 
 ; YAML: --- !Missed
 ; YAML: Pass:            regalloc
-; YAML: Name:            LoopSpillReload
+; YAML: Name:            LoopSpillReloadCopies
 ; YAML: DebugLoc:        { File: '/tmp/kk.c', Line: 3, Column: 20 }
 ; YAML: Function:        fpr128
 ; YAML: Hotness:         300
@@ -52,7 +52,7 @@
 ; YAML: ...
 ; YAML: --- !Missed
 ; YAML: Pass:            regalloc
-; YAML: Name:            LoopSpillReload
+; YAML: Name:            LoopSpillReloadCopies
 ; YAML: DebugLoc:        { File: '/tmp/kk.c', Line: 2, Column: 20 }
 ; YAML: Function:        fpr128
 ; YAML: Hotness:         30000
@@ -65,7 +65,7 @@
 ; YAML: ...
 ; YAML: --- !Missed
 ; YAML: Pass:            regalloc
-; YAML: Name:            LoopSpillReload
+; YAML: Name:            LoopSpillReloadCopies
 ; YAML: DebugLoc:        { File: '/tmp/kk.c', Line: 1, Column: 20 }
 ; YAML: Function:        fpr128
 ; YAML: Hotness:         300
@@ -78,7 +78,7 @@
 ; YAML: ...
 ; YAML: --- !Missed
 ; YAML: Pass:            regalloc
-; YAML: Name:            SpillReload
+; YAML: Name:            SpillReloadCopies
 ; YAML: DebugLoc:        { File: '/tmp/kk.c', Line: 1, Column: 1 }
 ; YAML: Function:        fpr128
 ; YAML: Hotness:         3
@@ -93,7 +93,7 @@
 ; THRESHOLD_YAML-NOT: Hotness:         300{{$}}
 ; THRESHOLD_YAML: --- !Missed
 ; THRESHOLD_YAML: Pass:            regalloc
-; THRESHOLD_YAML: Name:            LoopSpillReload
+; THRESHOLD_YAML: Name:            LoopSpillReloadCopies
 ; THRESHOLD_YAML: DebugLoc:        { File: '/tmp/kk.c', Line: 2, Column: 20 }
 ; THRESHOLD_YAML: Function:        fpr128
 ; THRESHOLD_YAML: Hotness:         30000

diff  --git a/llvm/test/CodeGen/X86/statepoint-ra.ll b/llvm/test/CodeGen/X86/statepoint-ra.ll
index d044c02a07d18..ea460dabb6dc5 100644
--- a/llvm/test/CodeGen/X86/statepoint-ra.ll
+++ b/llvm/test/CodeGen/X86/statepoint-ra.ll
@@ -7,7 +7,7 @@ target triple = "x86_64-unknown-linux-gnu"
 
 ;YAML: --- !Missed
 ;YAML: Pass:            regalloc
-;YAML: Name:            SpillReload
+;YAML: Name:            SpillReloadCopies
 ;YAML: Function:        barney
 ;YAML: Args:
 ;YAML:   - NumSpills:       '10'
@@ -16,6 +16,8 @@ target triple = "x86_64-unknown-linux-gnu"
 ;YAML:   - String:          ' reloads '
 ;YAML:   - NumZeroCostFoldedReloads: '20'
 ;YAML:   - String:          ' zero cost folded reloads '
+;YAML:   - NumVRCopies:     '2'
+;YAML:   - String:          ' virtual registers copies '
 ;YAML:   - String:          generated in function
 
 define void @barney(i8 addrspace(1)* %arg, double %arg1, double %arg2, double %arg3, double %arg4, double %arg5, double %arg6, double %arg7, double %arg8, double %arg9, double %arg10, double %arg11, double %arg12) gc "statepoint-example" personality i32* ()* @widget {


        


More information about the llvm-commits mailing list