From e86097af5598e44727875f00e492d43c978239be Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 28 Feb 2010 02:31:26 +0000 Subject: [PATCH] add infrastructure to support forming selectnodeto. Not used yet because I have to go on another detour first. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97362 91177308-0d34-0410-b5e6-96231b3b80d8 --- utils/TableGen/DAGISelMatcher.cpp | 12 +++-- utils/TableGen/DAGISelMatcher.h | 64 ++++++++++++++++++++---- utils/TableGen/DAGISelMatcherEmitter.cpp | 9 ++-- utils/TableGen/DAGISelMatcherGen.cpp | 8 +-- utils/TableGen/DAGISelMatcherOpt.cpp | 9 ++++ 5 files changed, 79 insertions(+), 23 deletions(-) diff --git a/utils/TableGen/DAGISelMatcher.cpp b/utils/TableGen/DAGISelMatcher.cpp index 3ea5b5d7fbf..d6f4f788768 100644 --- a/utils/TableGen/DAGISelMatcher.cpp +++ b/utils/TableGen/DAGISelMatcher.cpp @@ -170,8 +170,10 @@ void EmitNodeXFormMatcher::printImpl(raw_ostream &OS, unsigned indent) const { } -void EmitNodeMatcher::printImpl(raw_ostream &OS, unsigned indent) const { - OS.indent(indent) << "EmitNode: " << OpcodeName << ": "; +void EmitNodeMatcherCommon::printImpl(raw_ostream &OS, unsigned indent) const { + OS.indent(indent); + OS << (isSelectNodeTo() ? "SelectNodeTo: " : "EmitNode: ") + << OpcodeName << ": "; for (unsigned i = 0, e = VTs.size(); i != e; ++i) OS << ' ' << getEnumName(VTs[i]); @@ -236,15 +238,15 @@ unsigned EmitMergeInputChainsMatcher::getHashImpl() const { return HashUnsigneds(ChainNodes.begin(), ChainNodes.end()); } -bool EmitNodeMatcher::isEqualImpl(const Matcher *m) const { - const EmitNodeMatcher *M = cast(m); +bool EmitNodeMatcherCommon::isEqualImpl(const Matcher *m) const { + const EmitNodeMatcherCommon *M = cast(m); return M->OpcodeName == OpcodeName && M->VTs == VTs && M->Operands == Operands && M->HasChain == HasChain && M->HasFlag == HasFlag && M->HasMemRefs == HasMemRefs && M->NumFixedArityOperands == NumFixedArityOperands; } -unsigned EmitNodeMatcher::getHashImpl() const { +unsigned EmitNodeMatcherCommon::getHashImpl() const { return (HashString(OpcodeName) << 4) | Operands.size(); } diff --git a/utils/TableGen/DAGISelMatcher.h b/utils/TableGen/DAGISelMatcher.h index d80f19b3346..3d73262ef88 100644 --- a/utils/TableGen/DAGISelMatcher.h +++ b/utils/TableGen/DAGISelMatcher.h @@ -75,7 +75,8 @@ public: EmitNode, // Create a DAG node EmitNodeXForm, // Run a SDNodeXForm MarkFlagResults, // Indicate which interior nodes have flag results. - CompleteMatch // Finish a match and update the results. + CompleteMatch, // Finish a match and update the results. + SelectNodeTo // Build a node, finish a match and update results. }; const KindTy Kind; @@ -869,8 +870,9 @@ private: } }; -/// EmitNodeMatcher - This signals a successful match and generates a node. -class EmitNodeMatcher : public Matcher { +/// EmitNodeMatcherCommon - Common class shared between EmitNode and +/// SelectNodeTo. +class EmitNodeMatcherCommon : public Matcher { std::string OpcodeName; const SmallVector VTs; const SmallVector Operands; @@ -881,16 +883,18 @@ class EmitNodeMatcher : public Matcher { /// operands in the root of the pattern. The rest are appended to this node. int NumFixedArityOperands; public: - EmitNodeMatcher(const std::string &opcodeName, - const MVT::SimpleValueType *vts, unsigned numvts, - const unsigned *operands, unsigned numops, - bool hasChain, bool hasFlag, bool hasmemrefs, - int numfixedarityoperands) - : Matcher(EmitNode), OpcodeName(opcodeName), + EmitNodeMatcherCommon(const std::string &opcodeName, + const MVT::SimpleValueType *vts, unsigned numvts, + const unsigned *operands, unsigned numops, + bool hasChain, bool hasFlag, bool hasmemrefs, + int numfixedarityoperands, bool isSelectNodeTo) + : Matcher(isSelectNodeTo ? SelectNodeTo : EmitNode), OpcodeName(opcodeName), VTs(vts, vts+numvts), Operands(operands, operands+numops), HasChain(hasChain), HasFlag(hasFlag), HasMemRefs(hasmemrefs), NumFixedArityOperands(numfixedarityoperands) {} + bool isSelectNodeTo() const { return getKind() == SelectNodeTo; } + const std::string &getOpcodeName() const { return OpcodeName; } unsigned getNumVTs() const { return VTs.size(); } @@ -911,7 +915,7 @@ public: int getNumFixedArityOperands() const { return NumFixedArityOperands; } static inline bool classof(const Matcher *N) { - return N->getKind() == EmitNode; + return N->getKind() == EmitNode || N->getKind() == SelectNodeTo; } private: @@ -920,6 +924,44 @@ private: virtual unsigned getHashImpl() const; }; +/// EmitNodeMatcher - This signals a successful match and generates a node. +class EmitNodeMatcher : public EmitNodeMatcherCommon { +public: + EmitNodeMatcher(const std::string &opcodeName, + const MVT::SimpleValueType *vts, unsigned numvts, + const unsigned *operands, unsigned numops, + bool hasChain, bool hasFlag, bool hasmemrefs, + int numfixedarityoperands) + : EmitNodeMatcherCommon(opcodeName, vts, numvts, operands, numops, hasChain, + hasFlag, hasmemrefs, numfixedarityoperands, false) + {} + + static inline bool classof(const Matcher *N) { + return N->getKind() == EmitNode; + } + +}; + +class SelectNodeToMatcher : public EmitNodeMatcherCommon { + const PatternToMatch &Pattern; +public: + SelectNodeToMatcher(const std::string &opcodeName, + const MVT::SimpleValueType *vts, unsigned numvts, + const unsigned *operands, unsigned numops, + bool hasChain, bool hasFlag, bool hasmemrefs, + int numfixedarityoperands, const PatternToMatch &pattern) + : EmitNodeMatcherCommon(opcodeName, vts, numvts, operands, numops, hasChain, + hasFlag, hasmemrefs, numfixedarityoperands, true), + Pattern(pattern) { + } + + const PatternToMatch &getPattern() const { return Pattern; } + + static inline bool classof(const Matcher *N) { + return N->getKind() == SelectNodeTo; + } +}; + /// MarkFlagResultsMatcher - This node indicates which non-root nodes in the /// pattern produce flags. This allows CompleteMatchMatcher to update them /// with the output flag of the resultant code. @@ -976,7 +1018,7 @@ private: } virtual unsigned getHashImpl() const; }; - + } // end namespace llvm #endif diff --git a/utils/TableGen/DAGISelMatcherEmitter.cpp b/utils/TableGen/DAGISelMatcherEmitter.cpp index 450a4575bf6..84e33f39235 100644 --- a/utils/TableGen/DAGISelMatcherEmitter.cpp +++ b/utils/TableGen/DAGISelMatcherEmitter.cpp @@ -389,9 +389,11 @@ EmitMatcher(const Matcher *N, unsigned Indent, unsigned CurrentIdx, return 3; } - case Matcher::EmitNode: { - const EmitNodeMatcher *EN = cast(N); - OS << "OPC_EmitNode, TARGET_OPCODE(" << EN->getOpcodeName() << "), 0"; + case Matcher::EmitNode: + case Matcher::SelectNodeTo: { + const EmitNodeMatcherCommon *EN = cast(N); + OS << (EN->isSelectNodeTo() ? "OPC_EmitNode" : "OPC_SelectNodeTo"); + OS << ", TARGET_OPCODE(" << EN->getOpcodeName() << "), 0"; if (EN->hasChain()) OS << "|OPFL_Chain"; if (EN->hasFlag()) OS << "|OPFL_Flag"; @@ -564,6 +566,7 @@ void MatcherTableEmitter::EmitHistogram(formatted_raw_ostream &OS) { case Matcher::EmitMergeInputChains: OS << "OPC_EmitMergeInputChains"; break; case Matcher::EmitCopyToReg: OS << "OPC_EmitCopyToReg"; break; case Matcher::EmitNode: OS << "OPC_EmitNode"; break; + case Matcher::SelectNodeTo: OS << "OPC_SelectNodeTo"; break; case Matcher::EmitNodeXForm: OS << "OPC_EmitNodeXForm"; break; case Matcher::MarkFlagResults: OS << "OPC_MarkFlagResults"; break; case Matcher::CompleteMatch: OS << "OPC_CompleteMatch"; break; diff --git a/utils/TableGen/DAGISelMatcherGen.cpp b/utils/TableGen/DAGISelMatcherGen.cpp index cae2dfbc596..ee385074a9e 100644 --- a/utils/TableGen/DAGISelMatcherGen.cpp +++ b/utils/TableGen/DAGISelMatcherGen.cpp @@ -746,10 +746,10 @@ EmitResultInstructionAsOperand(const TreePatternNode *N, // (add (load)) -> add32rm is ok because result #0 is the result and result #1 // is new. AddMatcher(new EmitNodeMatcher(II.Namespace+"::"+II.TheDef->getName(), - ResultVTs.data(), ResultVTs.size(), - InstOps.data(), InstOps.size(), - NodeHasChain, TreeHasInFlag, - NodeHasMemRefs,NumFixedArityOperands)); + ResultVTs.data(), ResultVTs.size(), + InstOps.data(), InstOps.size(), + NodeHasChain, TreeHasInFlag, + NodeHasMemRefs, NumFixedArityOperands)); // The non-chain and non-flag results of the newly emitted node get recorded. for (unsigned i = 0, e = ResultVTs.size(); i != e; ++i) { diff --git a/utils/TableGen/DAGISelMatcherOpt.cpp b/utils/TableGen/DAGISelMatcherOpt.cpp index 1ce573353f2..79534574363 100644 --- a/utils/TableGen/DAGISelMatcherOpt.cpp +++ b/utils/TableGen/DAGISelMatcherOpt.cpp @@ -56,6 +56,7 @@ static void ContractNodes(OwningPtr &MatcherPtr) { } } + // Zap movechild -> moveparent. if (MoveChildMatcher *MC = dyn_cast(N)) if (MoveParentMatcher *MP = dyn_cast(MC->getNext())) { @@ -63,6 +64,14 @@ static void ContractNodes(OwningPtr &MatcherPtr) { return ContractNodes(MatcherPtr); } + // Turn EmitNode->CompleteMatch into SelectNodeTo if we can. + if (EmitNodeMatcher *EN = dyn_cast(N)) + if (CompleteMatchMatcher *CM = cast(EN->getNext())) { + (void)CM; + + + } + ContractNodes(N->getNextPtr()); } -- 2.34.1