From 39859438715fc8f9ff16d7cec6cf2a9cb2ac0803 Mon Sep 17 00:00:00 2001 From: Andreas Neustifter Date: Thu, 3 Sep 2009 08:52:52 +0000 Subject: [PATCH] Code Cleanup. Removed inverted flag form MaximumSpanningTree, also do not handle so much information to MaximumSpanningTree. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@80911 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Instrumentation/MaximumSpanningTree.cpp | 12 +++--------- .../Instrumentation/MaximumSpanningTree.h | 2 +- .../Instrumentation/OptimalEdgeProfiling.cpp | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 18 deletions(-) diff --git a/lib/Transforms/Instrumentation/MaximumSpanningTree.cpp b/lib/Transforms/Instrumentation/MaximumSpanningTree.cpp index ffd100e0533..19c4a83f76b 100644 --- a/lib/Transforms/Instrumentation/MaximumSpanningTree.cpp +++ b/lib/Transforms/Instrumentation/MaximumSpanningTree.cpp @@ -14,8 +14,6 @@ //===----------------------------------------------------------------------===// #define DEBUG_TYPE "maximum-spanning-tree" #include "MaximumSpanningTree.h" -#include "llvm/Pass.h" -#include "llvm/Analysis/Passes.h" #include "llvm/ADT/EquivalenceClasses.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/CFG.h" @@ -64,12 +62,9 @@ static void inline printMSTEdge(ProfileInfo::EdgeWeight E, // MaximumSpanningTree() - Takes a function and returns a spanning tree // according to the currently active profiling information, the leaf edges are // NOT in the MST. MaximumSpanningTree uses the algorithm of Kruskal. -MaximumSpanningTree::MaximumSpanningTree(Function *F, ProfileInfo *PI, - bool inverted = false) { +MaximumSpanningTree::MaximumSpanningTree(std::vector + &EdgeVector) { - // Copy edges to vector, sort them biggest first. - ProfileInfo::EdgeWeights ECs = PI->getEdgeWeights(F); - std::vector EdgeVector(ECs.begin(), ECs.end()); std::sort(EdgeVector.begin(), EdgeVector.end(), EdgeWeightCompare()); // Create spanning tree, Forest contains a special data structure @@ -92,12 +87,11 @@ MaximumSpanningTree::MaximumSpanningTree(Function *F, ProfileInfo *PI, Forest.unionSets(e.first, e.second); // So we know now that the edge is not already in a subtree (and not // (0,entry)), so we push the edge to the MST if it has some successors. - if (!inverted) { MST.push_back(e); } + MST.push_back(e); printMSTEdge(*bbi,"in MST"); } else { // This edge is either (0,entry) or (BB,0) or would create a circle in a // subtree. - if (inverted) { MST.push_back(e); } printMSTEdge(*bbi,"*not* in MST"); } } diff --git a/lib/Transforms/Instrumentation/MaximumSpanningTree.h b/lib/Transforms/Instrumentation/MaximumSpanningTree.h index 5ef8659fe2d..2343985f23d 100644 --- a/lib/Transforms/Instrumentation/MaximumSpanningTree.h +++ b/lib/Transforms/Instrumentation/MaximumSpanningTree.h @@ -37,7 +37,7 @@ namespace llvm { // special also all leaf edges of the MST are not included, this makes it // easier for the OptimalEdgeProfileInstrumentation to use this MST to do // an optimal profiling. - MaximumSpanningTree(Function *F, ProfileInfo *PI, bool invert); + MaximumSpanningTree(std::vector&); virtual ~MaximumSpanningTree() {} virtual MaxSpanTree::iterator begin(); diff --git a/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp b/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp index 0ba93338bc8..2c064238723 100644 --- a/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp +++ b/lib/Transforms/Instrumentation/OptimalEdgeProfiling.cpp @@ -22,6 +22,7 @@ #include "llvm/Support/Debug.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" #include "llvm/Transforms/Instrumentation.h" +#include "llvm/ADT/DenseSet.h" #include "llvm/ADT/Statistic.h" #include "MaximumSpanningTree.h" #include @@ -32,7 +33,6 @@ STATISTIC(NumEdgesInserted, "The # of edges inserted."); namespace { class VISIBILITY_HIDDEN OptimalEdgeProfiler : public ModulePass { bool runOnModule(Module &M); - ProfileInfo *PI; public: static char ID; // Pass identification, replacement for typeid OptimalEdgeProfiler() : ModulePass(&ID) {} @@ -128,8 +128,10 @@ bool OptimalEdgeProfiler::runOnModule(Module &M) { // The third parameter of MaximumSpanningTree() has the effect that not the // actual MST is returned but the edges _not_ in the MST. - PI = &getAnalysisID(ProfileEstimatorPassID, *F); - MaximumSpanningTree MST = MaximumSpanningTree(&(*F), PI, true); + ProfileInfo::EdgeWeights ECs = + getAnalysisID(ProfileEstimatorPassID, *F).getEdgeWeights(F); + std::vector EdgeVector(ECs.begin(), ECs.end()); + MaximumSpanningTree MST = MaximumSpanningTree(EdgeVector); // Check if (0,entry) not in the MST. If not, instrument edge // (IncrementCounterInBlock()) and set the counter initially to zero, if @@ -137,7 +139,7 @@ bool OptimalEdgeProfiler::runOnModule(Module &M) { BasicBlock *entry = &(F->getEntryBlock()); ProfileInfo::Edge edge = ProfileInfo::getEdge(0,entry); - if (std::binary_search(MST.begin(), MST.end(), edge)) { + if (!std::binary_search(MST.begin(), MST.end(), edge)) { printEdgeCounter(edge,entry,i); IncrementCounterInBlock(entry, i, Counters); NumEdgesInserted++; Initializer[i++] = (zeroc); @@ -147,7 +149,7 @@ bool OptimalEdgeProfiler::runOnModule(Module &M) { // InsertedBlocks contains all blocks that were inserted for splitting an // edge, this blocks do not have to be instrumented. - std::set InsertedBlocks; + DenseSet InsertedBlocks; for (Function::iterator BB = F->begin(), E = F->end(); BB != E; ++BB) { // Check if block was not inserted and thus does not have to be // instrumented. @@ -160,7 +162,7 @@ bool OptimalEdgeProfiler::runOnModule(Module &M) { TerminatorInst *TI = BB->getTerminator(); if (TI->getNumSuccessors() == 0) { ProfileInfo::Edge edge = ProfileInfo::getEdge(BB,0); - if (std::binary_search(MST.begin(), MST.end(), edge)) { + if (!std::binary_search(MST.begin(), MST.end(), edge)) { printEdgeCounter(edge,BB,i); IncrementCounterInBlock(BB, i, Counters); NumEdgesInserted++; Initializer[i++] = (zeroc); @@ -171,12 +173,12 @@ bool OptimalEdgeProfiler::runOnModule(Module &M) { for (unsigned s = 0, e = TI->getNumSuccessors(); s != e; ++s) { BasicBlock *Succ = TI->getSuccessor(s); ProfileInfo::Edge edge = ProfileInfo::getEdge(BB,Succ); - if (std::binary_search(MST.begin(), MST.end(), edge)) { + if (!std::binary_search(MST.begin(), MST.end(), edge)) { // If the edge is critical, split it. bool wasInserted = SplitCriticalEdge(TI, s, this); Succ = TI->getSuccessor(s); - if(wasInserted) + if (wasInserted) InsertedBlocks.insert(Succ); // Okay, we are guaranteed that the edge is no longer critical. If -- 2.34.1