Keep track of the head and tail of the trace through each block.
authorJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 27 Jul 2012 23:58:36 +0000 (23:58 +0000)
committerJakob Stoklund Olesen <stoklund@2pi.dk>
Fri, 27 Jul 2012 23:58:36 +0000 (23:58 +0000)
This makes it possible to quickly detect blocks that are outside the
trace.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160904 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/MachineTraceMetrics.cpp
lib/CodeGen/MachineTraceMetrics.h

index 557d47314e9aeecdd4fdd3e10f8eb24885f823d2..8ae6f370300b51f36af6300e33566bc9ea885ee1 100644 (file)
@@ -142,6 +142,7 @@ computeDepthResources(const MachineBasicBlock *MBB) {
   // Compute resources from trace above. The top block is simple.
   if (!TBI->Pred) {
     TBI->InstrDepth = 0;
+    TBI->Head = MBB->getNumber();
     return;
   }
 
@@ -151,6 +152,7 @@ computeDepthResources(const MachineBasicBlock *MBB) {
   assert(PredTBI->hasValidDepth() && "Trace above has not been computed yet");
   const FixedBlockInfo *PredFBI = CT.getResources(TBI->Pred);
   TBI->InstrDepth = PredTBI->InstrDepth + PredFBI->InstrCount;
+  TBI->Head = PredTBI->Head;
 }
 
 // Update resource-related information in the TraceBlockInfo for MBB.
@@ -163,14 +165,17 @@ computeHeightResources(const MachineBasicBlock *MBB) {
   TBI->InstrHeight = CT.getResources(MBB)->InstrCount;
 
   // The trace tail is done.
-  if (!TBI->Succ)
+  if (!TBI->Succ) {
+    TBI->Tail = MBB->getNumber();
     return;
+  }
 
   // Compute from the block below. A post-order traversal ensures the
   // predecessor is always computed first.
   TraceBlockInfo *SuccTBI = &BlockInfo[TBI->Succ->getNumber()];
   assert(SuccTBI->hasValidHeight() && "Trace below has not been computed yet");
   TBI->InstrHeight += SuccTBI->InstrHeight;
+  TBI->Tail = SuccTBI->Tail;
 }
 
 // Check if depth resources for MBB are valid and return the TBI.
@@ -454,12 +459,15 @@ MachineTraceMetrics::Ensemble::getTrace(const MachineBasicBlock *MBB) {
 }
 
 void MachineTraceMetrics::Trace::print(raw_ostream &OS) const {
-  OS << TE.getName() << " trace:";
+  unsigned MBBNum = &TBI - &TE.BlockInfo[0];
+
+  OS << TE.getName() << " trace BB#" << TBI.Head << " --> BB#" << MBBNum
+     << " --> BB#" << TBI.Tail << ':';
   if (TBI.hasValidHeight() && TBI.hasValidDepth())
     OS << ' ' << getInstrCount() << " instrs.";
 
   const MachineTraceMetrics::TraceBlockInfo *Block = &TBI;
-  OS << "\n *";
+  OS << "\nBB#" << MBBNum;
   while (Block->hasValidDepth() && Block->Pred) {
     unsigned Num = Block->Pred->getNumber();
     OS << " <- BB#" << Num;
@@ -467,7 +475,7 @@ void MachineTraceMetrics::Trace::print(raw_ostream &OS) const {
   }
 
   Block = &TBI;
-  OS << "\n *";
+  OS << "\n    ";
   while (Block->hasValidHeight() && Block->Succ) {
     unsigned Num = Block->Succ->getNumber();
     OS << " -> BB#" << Num;
index 086d7eaebff52c50bd2780ae0f8dcdec2eff0160..26136fa9ee94d5f76281f8f247a21eb26ff76d77 100644 (file)
@@ -110,6 +110,12 @@ public:
     /// Trace successor, or NULL for the last block in the trace.
     const MachineBasicBlock *Succ;
 
+    /// The block number of the head of the trace. (When hasValidDepth()).
+    unsigned Head;
+
+    /// The block number of the tail of the trace. (When hasValidHeight()).
+    unsigned Tail;
+
     /// Accumulated number of instructions in the trace above this block.
     /// Does not include instructions in this block.
     unsigned InstrDepth;