diff options
author | Mikhail Glushenkov <foldr@codedgers.com> | 2008-05-06 18:14:24 +0000 |
---|---|---|
committer | Mikhail Glushenkov <foldr@codedgers.com> | 2008-05-06 18:14:24 +0000 |
commit | bb8b58dcf3e1994beb458e777b306fa3805ee50f (patch) | |
tree | ce39b38a87d9e75b283bee66bc1df981082eab94 /tools/llvmc2/CompilationGraph.cpp | |
parent | d83038c9605c84e92b6052500405ac3903f0d6f1 (diff) |
Add weights to graph edges. Choose between edges based on their weight.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50757 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/llvmc2/CompilationGraph.cpp')
-rw-r--r-- | tools/llvmc2/CompilationGraph.cpp | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/tools/llvmc2/CompilationGraph.cpp b/tools/llvmc2/CompilationGraph.cpp index 4b04d6f60b..310413b9f0 100644 --- a/tools/llvmc2/CompilationGraph.cpp +++ b/tools/llvmc2/CompilationGraph.cpp @@ -33,35 +33,37 @@ extern cl::list<std::string> Languages; namespace { - // Go through the list C and find the edge that isEnabled(); if - // there is no such edge, return the default edge; if there is no - // default edge, throw an exception. + // Return the edge with the maximum weight. template <class C> const Edge* ChooseEdge(const C& EdgesContainer, const std::string& NodeName = "root") { - const Edge* DefaultEdge = 0; + const Edge* MaxEdge = 0; + unsigned MaxWeight = 0; + bool SingleMax = true; for (typename C::const_iterator B = EdgesContainer.begin(), E = EdgesContainer.end(); B != E; ++B) { const Edge* E = B->getPtr(); - - if (E->isDefault()) - if (!DefaultEdge) - DefaultEdge = E; - else - throw std::runtime_error("Node " + NodeName - + ": multiple default outward edges found!" - " Most probably a specification error."); - if (E->isEnabled()) - return E; + unsigned EW = E->Weight(); + if (EW > MaxWeight) { + MaxEdge = E; + MaxWeight = EW; + SingleMax = true; + } + else if (EW == MaxWeight) { + SingleMax = false; + } } - if (DefaultEdge) - return DefaultEdge; - else - throw std::runtime_error("Node " + NodeName - + ": no default outward edge found!" + if (!SingleMax) + throw std::runtime_error("Node " + NodeName + + ": multiple maximal outward edges found!" + " Most probably a specification error."); + if (!MaxEdge) + throw std::runtime_error("Node " + NodeName + + ": no maximal outward edge found!" " Most probably a specification error."); + return MaxEdge; } } |