Add named timer groups for the different stages of register allocation.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Sat, 11 Dec 2010 00:19:56 +0000 (00:19 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Sat, 11 Dec 2010 00:19:56 +0000 (00:19 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121604 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAllocBase.h
lib/CodeGen/RegAllocBasic.cpp
lib/CodeGen/RegAllocGreedy.cpp

index 7d133272f7ea5555ba8e1064f1842f3f0b34b600..438a7d17baefee1d7712da0a4545a004a5f38b24 100644 (file)
@@ -153,6 +153,9 @@ protected:
   void verify();
 #endif
 
+  // Use this group name for NamedRegionTimer.
+  static const char *TimerGroupName;
+
 private:
   void seedLiveVirtRegs(std::priority_queue<std::pair<float, unsigned> >&);
 
index 3c8454398f8c480b0fb3fcfedbed1eaee3d9d75a..eb1b9075b3a91175010dfc8d601521601ad98b7a 100644 (file)
@@ -42,6 +42,7 @@
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/Timer.h"
 
 #include <cstdlib>
 
@@ -56,6 +57,8 @@ static cl::opt<bool>
 VerifyRegAlloc("verify-regalloc",
                cl::desc("Verify live intervals before renaming"));
 
+const char *RegAllocBase::TimerGroupName = "Register Allocation";
+
 namespace {
 
 class PhysicalRegisterDescription : public AbstractRegisterDescription {
@@ -204,6 +207,7 @@ void RegAllocBase::LiveUnionArray::init(LiveIntervalUnion::Allocator &allocator,
 }
 
 void RegAllocBase::init(VirtRegMap &vrm, LiveIntervals &lis) {
+  NamedRegionTimer T("Initialize", TimerGroupName, TimePassesIsEnabled);
   TRI = &vrm.getTargetRegInfo();
   MRI = &vrm.getRegInfo();
   VRM = &vrm;
@@ -364,6 +368,7 @@ RegAllocBase::spillInterferences(LiveInterval &VirtReg, unsigned PhysReg,
 
 // Add newly allocated physical registers to the MBB live in sets.
 void RegAllocBase::addMBBLiveIns(MachineFunction *MF) {
+  NamedRegionTimer T("MBB Live Ins", TimerGroupName, TimePassesIsEnabled);
   typedef SmallVector<MachineBasicBlock*, 8> MBBVec;
   MBBVec liveInMBBs;
   MachineBasicBlock &entryMBB = *MF->begin();
index 01946c0db4a1c12c3c3574b3ee2520255af93def..aab284805ea44e9cbbfb3d60c5bd0c0300e44bfa 100644 (file)
@@ -35,6 +35,7 @@
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/raw_ostream.h"
+#include "llvm/Support/Timer.h"
 
 using namespace llvm;
 
@@ -58,7 +59,7 @@ public:
 
   /// Return the pass name.
   virtual const char* getPassName() const {
-    return "Basic Register Allocator";
+    return "Greedy Register Allocator";
   }
 
   /// RAGreedy analysis usage.
@@ -254,17 +255,19 @@ unsigned RAGreedy::selectOrSplit(LiveInterval &VirtReg,
   // Try to reassign interfering physical register. Priority among
   // PhysRegSpillCands does not matter yet, because the reassigned virtual
   // registers will still be assigned to physical registers.
-  for (SmallVectorImpl<unsigned>::iterator PhysRegI = ReassignCands.begin(),
-         PhysRegE = ReassignCands.end(); PhysRegI != PhysRegE; ++PhysRegI) {
-    if (reassignInterferences(VirtReg, *PhysRegI))
-      // Reassignment successfull. The caller may allocate now to this PhysReg.
-      return *PhysRegI;
+  {
+    NamedRegionTimer T("Reassign", TimerGroupName, TimePassesIsEnabled);
+    for (SmallVectorImpl<unsigned>::iterator PhysRegI = ReassignCands.begin(),
+          PhysRegE = ReassignCands.end(); PhysRegI != PhysRegE; ++PhysRegI)
+      if (reassignInterferences(VirtReg, *PhysRegI))
+        // Reassignment successfull. Allocate now to this PhysReg.
+        return *PhysRegI;
   }
-
   PhysRegSpillCands.insert(PhysRegSpillCands.end(), ReassignCands.begin(),
                            ReassignCands.end());
 
   // Try to spill another interfering reg with less spill weight.
+  NamedRegionTimer T("Spiller", TimerGroupName, TimePassesIsEnabled);
   //
   // FIXME: do this in two steps: (1) check for unspillable interferences while
   // accumulating spill weight; (2) spill the interferences with lowest
@@ -305,8 +308,11 @@ bool RAGreedy::runOnMachineFunction(MachineFunction &mf) {
   addMBBLiveIns(MF);
 
   // Run rewriter
-  std::auto_ptr<VirtRegRewriter> rewriter(createVirtRegRewriter());
-  rewriter->runOnMachineFunction(*MF, *VRM, LIS);
+  {
+    NamedRegionTimer T("Rewriter", TimerGroupName, TimePassesIsEnabled);
+    std::auto_ptr<VirtRegRewriter> rewriter(createVirtRegRewriter());
+    rewriter->runOnMachineFunction(*MF, *VRM, LIS);
+  }
 
   // The pass output is in VirtRegMap. Release all the transient data.
   releaseMemory();