aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--utils/TableGen/DAGISelEmitter.cpp16
-rw-r--r--utils/TableGen/DAGISelEmitter.h8
2 files changed, 24 insertions, 0 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index 9f5e387..dde7f67 100644
--- a/utils/TableGen/DAGISelEmitter.cpp
+++ b/utils/TableGen/DAGISelEmitter.cpp
@@ -137,6 +137,22 @@ SDNodeInfo::SDNodeInfo(Record *R) : Def(R) {
NumResults = TypeProfile->getValueAsInt("NumResults");
NumOperands = TypeProfile->getValueAsInt("NumOperands");
+ // Parse the properties.
+ Properties = 0;
+ ListInit *LI = R->getValueAsListInit("Properties");
+ for (unsigned i = 0, e = LI->getSize(); i != e; ++i) {
+ DefInit *DI = dynamic_cast<DefInit*>(LI->getElement(i));
+ assert(DI && "Properties list must be list of defs!");
+ if (DI->getDef()->getName() == "SDNPCommutative") {
+ Properties |= 1 << SDNPCommutative;
+ } else {
+ std::cerr << "Unknown SD Node property '" << DI->getDef()->getName()
+ << "' on node '" << R->getName() << "'!\n";
+ exit(1);
+ }
+ }
+
+
// Parse the type constraints.
ListInit *Constraints = TypeProfile->getValueAsListInit("Constraints");
for (unsigned i = 0, e = Constraints->getSize(); i != e; ++i) {
diff --git a/utils/TableGen/DAGISelEmitter.h b/utils/TableGen/DAGISelEmitter.h
index 8ec7299..48f941d 100644
--- a/utils/TableGen/DAGISelEmitter.h
+++ b/utils/TableGen/DAGISelEmitter.h
@@ -69,6 +69,7 @@ namespace llvm {
Record *Def;
std::string EnumName;
std::string SDClassName;
+ unsigned Properties;
unsigned NumResults;
int NumOperands;
std::vector<SDTypeConstraint> TypeConstraints;
@@ -84,6 +85,13 @@ namespace llvm {
const std::vector<SDTypeConstraint> &getTypeConstraints() const {
return TypeConstraints;
}
+
+ // SelectionDAG node properties.
+ enum SDNP { SDNPCommutative };
+
+ /// hasProperty - Return true if this node has the specified property.
+ ///
+ bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); }
/// ApplyTypeConstraints - Given a node in a pattern, apply the type
/// constraints for this node to the operands of the node. This returns