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
This commit is contained in:
Chris Lattner
2010-02-28 02:31:26 +00:00
parent 6ac33b4533
commit e86097af55
5 changed files with 79 additions and 23 deletions

View File

@@ -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<MVT::SimpleValueType, 3> VTs;
const SmallVector<unsigned, 6> 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