From bb8b58dcf3e1994beb458e777b306fa3805ee50f Mon Sep 17 00:00:00 2001 From: Mikhail Glushenkov Date: Tue, 6 May 2008 18:14:24 +0000 Subject: [PATCH] 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 --- tools/llvmc2/CompilationGraph.cpp | 40 ++++++++++---------- tools/llvmc2/CompilationGraph.h | 6 +-- utils/TableGen/LLVMCConfigurationEmitter.cpp | 23 +++++------ 3 files changed, 32 insertions(+), 37 deletions(-) diff --git a/tools/llvmc2/CompilationGraph.cpp b/tools/llvmc2/CompilationGraph.cpp index 4b04d6f60b3..310413b9f0a 100644 --- a/tools/llvmc2/CompilationGraph.cpp +++ b/tools/llvmc2/CompilationGraph.cpp @@ -33,35 +33,37 @@ extern cl::list 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 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; } } diff --git a/tools/llvmc2/CompilationGraph.h b/tools/llvmc2/CompilationGraph.h index 4692e5155d7..3dc8bc06232 100644 --- a/tools/llvmc2/CompilationGraph.h +++ b/tools/llvmc2/CompilationGraph.h @@ -35,8 +35,7 @@ namespace llvmc { virtual ~Edge() {}; const std::string& ToolName() const { return ToolName_; } - virtual bool isEnabled() const = 0; - virtual bool isDefault() const = 0; + virtual unsigned Weight() const = 0; private: std::string ToolName_; }; @@ -45,8 +44,7 @@ namespace llvmc { class SimpleEdge : public Edge { public: SimpleEdge(const std::string& T) : Edge(T) {} - bool isEnabled() const { return false;} - bool isDefault() const { return true;} + unsigned Weight() const { return 1; } }; // A node of the compilation graph. diff --git a/utils/TableGen/LLVMCConfigurationEmitter.cpp b/utils/TableGen/LLVMCConfigurationEmitter.cpp index ab6f2efc484..3db91763962 100644 --- a/utils/TableGen/LLVMCConfigurationEmitter.cpp +++ b/utils/TableGen/LLVMCConfigurationEmitter.cpp @@ -974,9 +974,9 @@ void EmitEdgeClass(unsigned N, const std::string& Target, << Indent1 << "Edge" << N << "() : Edge(\"" << Target << "\") {}\n\n" - // Function isEnabled(). - << Indent1 << "bool isEnabled() const {\n" - << Indent2 << "bool ret = false;\n"; + // Function Weight(). + << Indent1 << "unsigned Weight() const {\n" + << Indent2 << "unsigned ret = 0;\n"; for (size_t i = 0, PropsSize = Props->size(); i < PropsSize; ++i) { const DagInit& Prop = dynamic_cast(*Props->getElement(i)); @@ -985,7 +985,7 @@ void EmitEdgeClass(unsigned N, const std::string& Target, if (PropName == "default") IsDefault = true; - O << Indent2 << "if (ret || ("; + O << Indent2 << "if (("; if (PropName == "and") { O << '('; for (unsigned j = 0, NumArgs = Prop.getNumArgs(); j < NumArgs; ++j) { @@ -1002,19 +1002,14 @@ void EmitEdgeClass(unsigned N, const std::string& Target, else { EmitEdgePropertyTest(PropName, Prop, OptDescs, O); } - O << "))\n" << Indent3 << "ret = true;\n"; + O << "))\n" << Indent3 << "ret += 2;\n"; } - O << Indent2 << "return ret;\n" - << Indent1 << "};\n\n" - - // Function isDefault(). - << Indent1 << "bool isDefault() const { return "; if (IsDefault) - O << "true"; - else - O << "false"; - O <<"; }\n};\n\n"; + O << Indent2 << "ret += 1;\n"; + + O << Indent2 << "return ret;\n" + << Indent1 << "};\n\n};\n\n"; } // Emit Edge* classes that represent graph edges.