Changed set of BlocksToInstrument to set of InsertedBlocks that do not have to
authorAndreas Neustifter <astifter-llvm@gmx.at>
Wed, 2 Sep 2009 13:59:05 +0000 (13:59 +0000)
committerAndreas Neustifter <astifter-llvm@gmx.at>
Wed, 2 Sep 2009 13:59:05 +0000 (13:59 +0000)
be instrumented.

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

lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp

index ea3a291956e2b67e89f05492aa7726e45315807c..0ba93338bc85a4929964a4fb3ad9d946ad1a212e 100644 (file)
@@ -72,11 +72,6 @@ bool OptimalEdgeProfiler::runOnModule(Module &M) {
     return false;  // No main, no instrumentation!
   }
 
-  // BlocksToInstrument stores all blocks that are in the function prior to
-  // instrumenting, since the spliting of critical edges adds new blocks (which
-  // have not to be instrumented), we have to remember them for later.
-  std::set<BasicBlock*> BlocksToInstrument;
-
   // NumEdges counts all the edges that may be instrumented. Later on its
   // decided which edges to actually instrument, to achieve optimal profiling.
   // For the entry block a virtual edge (0,entry) is reserved, for each block
@@ -93,7 +88,6 @@ bool OptimalEdgeProfiler::runOnModule(Module &M) {
       // Keep track of which blocks need to be instrumented.  We don't want to
       // instrument blocks that are added as the result of breaking critical
       // edges!
-      BlocksToInstrument.insert(BB);
       if (BB->getTerminator()->getNumSuccessors() == 0) {
         // Reserve space for (BB,0) edge.
         ++NumEdges;
@@ -151,9 +145,13 @@ bool OptimalEdgeProfiler::runOnModule(Module &M) {
       Initializer[i++] = (minusonec);
     }
 
+    // InsertedBlocks contains all blocks that were inserted for splitting an
+    // edge, this blocks do not have to be instrumented.
+    std::set<BasicBlock*> InsertedBlocks;
     for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) {
-      // Do not count blocks that where introduced by spliting critical edges.
-      if (!BlocksToInstrument.count(BB)) continue;
+      // Check if block was not inserted and thus does not have to be
+      // instrumented.
+      if (InsertedBlocks.count(BB)) continue;
 
       // Okay, we have to add a counter of each outgoing edge not in MST. If
       // the outgoing edge is not critical don't split it, just insert the
@@ -176,8 +174,10 @@ bool OptimalEdgeProfiler::runOnModule(Module &M) {
         if (std::binary_search(MST.begin(), MST.end(), edge)) {
 
           // If the edge is critical, split it.
-          SplitCriticalEdge(TI,s,this);
+          bool wasInserted = SplitCriticalEdge(TI, s, this);
           Succ = TI->getSuccessor(s);
+          if(wasInserted)
+            InsertedBlocks.insert(Succ);
 
           // Okay, we are guaranteed that the edge is no longer critical.  If
           // we only have a single successor, insert the counter in this block,