aboutsummaryrefslogtreecommitdiff
path: root/utils/TableGen/DAGISelMatcher.h
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-02-24 07:31:45 +0000
committerChris Lattner <sabre@nondot.org>2010-02-24 07:31:45 +0000
commit19b5a7590b784f19875b9880ea8838c393431656 (patch)
treea72bfb5c816b6e8751d7e9b76b904b1ff53f4871 /utils/TableGen/DAGISelMatcher.h
parent91c6a822baaba3cb2def94224115e57b84805347 (diff)
implement a simple proof-of-concept optimization for
the new isel: fold movechild+record+moveparent into a single recordchild N node. This shrinks the X86 table from 125443 to 117502 bytes. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97031 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/DAGISelMatcher.h')
-rw-r--r--utils/TableGen/DAGISelMatcher.h30
1 files changed, 29 insertions, 1 deletions
diff --git a/utils/TableGen/DAGISelMatcher.h b/utils/TableGen/DAGISelMatcher.h
index 4dcbc8f55f..ab84168bd8 100644
--- a/utils/TableGen/DAGISelMatcher.h
+++ b/utils/TableGen/DAGISelMatcher.h
@@ -26,7 +26,7 @@ namespace llvm {
MatcherNode *ConvertPatternToMatcher(const PatternToMatch &Pattern,
const CodeGenDAGPatterns &CGP);
-void OptimizeMatcher(const MatcherNode *Matcher);
+MatcherNode *OptimizeMatcher(MatcherNode *Matcher);
void EmitMatcherTable(const MatcherNode *Matcher, raw_ostream &OS);
@@ -41,6 +41,7 @@ public:
// Matcher state manipulation.
Push, // Push a checking scope.
RecordNode, // Record the current node.
+ RecordChild, // Record a child of the current node.
RecordMemRef, // Record the memref in the current node.
CaptureFlagInput, // If the current node has an input flag, save it.
MoveChild, // Move current node to specified child.
@@ -86,6 +87,9 @@ public:
MatcherNode *getNext() { return Next.get(); }
const MatcherNode *getNext() const { return Next.get(); }
void setNext(MatcherNode *C) { Next.reset(C); }
+ MatcherNode *takeNext() { return Next.take(); }
+
+ OwningPtr<MatcherNode> &getNextPtr() { return Next; }
static inline bool classof(const MatcherNode *) { return true; }
@@ -109,6 +113,7 @@ public:
MatcherNode *getFailure() { return Failure.get(); }
const MatcherNode *getFailure() const { return Failure.get(); }
void setFailure(MatcherNode *N) { Failure.reset(N); }
+ OwningPtr<MatcherNode> &getFailurePtr() { return Failure; }
static inline bool classof(const MatcherNode *N) {
return N->getKind() == Push;
@@ -135,6 +140,29 @@ public:
virtual void print(raw_ostream &OS, unsigned indent = 0) const;
};
+/// RecordChildMatcherNode - Save a numbered child of the current node, or fail
+/// the match if it doesn't exist. This is logically equivalent to:
+/// MoveChild N + RecordNode + MoveParent.
+class RecordChildMatcherNode : public MatcherNode {
+ unsigned ChildNo;
+
+ /// WhatFor - This is a string indicating why we're recording this. This
+ /// should only be used for comment generation not anything semantic.
+ std::string WhatFor;
+public:
+ RecordChildMatcherNode(unsigned childno, const std::string &whatfor)
+ : MatcherNode(RecordChild), ChildNo(childno), WhatFor(whatfor) {}
+
+ unsigned getChildNo() const { return ChildNo; }
+ const std::string &getWhatFor() const { return WhatFor; }
+
+ static inline bool classof(const MatcherNode *N) {
+ return N->getKind() == RecordChild;
+ }
+
+ virtual void print(raw_ostream &OS, unsigned indent = 0) const;
+};
+
/// RecordMemRefMatcherNode - Save the current node's memref.
class RecordMemRefMatcherNode : public MatcherNode {
public: