Allow ComplexExpressions in InstrInfo.td files to be slightly more... complex! ComplexExpressions can now have attributes which affect how TableGen interprets

the pattern when generating matchin code. 

The first (and currently, only) attribute causes the immediate parent node of the ComplexPattern operand to be passed into the matching code rather than the node at the root of the entire DAG containing the pattern.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46606 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Christopher Lamb
2008-01-31 07:27:46 +00:00
parent 175e81598a
commit 8535624739
4 changed files with 37 additions and 7 deletions

View File

@@ -767,6 +767,12 @@ class Pat<dag pattern, dag result> : Pattern<pattern, [result]>;
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
// Complex pattern definitions. // Complex pattern definitions.
// //
class CPAttribute;
// Pass the parent Operand as root to CP function rather
// than the root of the sub-DAG
def CPAttrParentAsRoot : CPAttribute;
// Complex patterns, e.g. X86 addressing mode, requires pattern matching code // Complex patterns, e.g. X86 addressing mode, requires pattern matching code
// in C++. NumOperands is the number of operands returned by the select function; // in C++. NumOperands is the number of operands returned by the select function;
// SelectFunc is the name of the function used to pattern match the max. pattern; // SelectFunc is the name of the function used to pattern match the max. pattern;
@@ -774,12 +780,14 @@ class Pat<dag pattern, dag result> : Pattern<pattern, [result]>;
// e.g. X86 addressing mode - def addr : ComplexPattern<4, "SelectAddr", [add]>; // e.g. X86 addressing mode - def addr : ComplexPattern<4, "SelectAddr", [add]>;
// //
class ComplexPattern<ValueType ty, int numops, string fn, class ComplexPattern<ValueType ty, int numops, string fn,
list<SDNode> roots = [], list<SDNodeProperty> props = []> { list<SDNode> roots = [], list<SDNodeProperty> props = [],
list<CPAttribute> attrs = []> {
ValueType Ty = ty; ValueType Ty = ty;
int NumOperands = numops; int NumOperands = numops;
string SelectFunc = fn; string SelectFunc = fn;
list<SDNode> RootNodes = roots; list<SDNode> RootNodes = roots;
list<SDNodeProperty> Properties = props; list<SDNodeProperty> Properties = props;
list<CPAttribute> Attributes = attrs;
} }
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@@ -351,6 +351,18 @@ ComplexPattern::ComplexPattern(Record *R) {
<< "' on ComplexPattern '" << R->getName() << "'!\n"; << "' on ComplexPattern '" << R->getName() << "'!\n";
exit(1); exit(1);
} }
// Parse the attributes.
Attributes = 0;
PropList = R->getValueAsListOfDefs("Attributes");
for (unsigned i = 0, e = PropList.size(); i != e; ++i)
if (PropList[i]->getName() == "CPAttrParentAsRoot") {
Attributes |= 1 << CPAttrParentAsRoot;
} else {
cerr << "Unsupported pattern attribute '" << PropList[i]->getName()
<< "' on ComplexPattern '" << R->getName() << "'!\n";
exit(1);
}
} }
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@@ -42,6 +42,9 @@ enum SDNP {
SDNPSideEffect SDNPSideEffect
}; };
// ComplexPattern attributes.
enum CPAttr { CPAttrParentAsRoot };
/// getValueType - Return the MVT::ValueType that the specified TableGen record /// getValueType - Return the MVT::ValueType that the specified TableGen record
/// corresponds to. /// corresponds to.
MVT::ValueType getValueType(Record *Rec); MVT::ValueType getValueType(Record *Rec);
@@ -172,7 +175,8 @@ class ComplexPattern {
unsigned NumOperands; unsigned NumOperands;
std::string SelectFunc; std::string SelectFunc;
std::vector<Record*> RootNodes; std::vector<Record*> RootNodes;
unsigned Properties; unsigned Properties; // Node properties
unsigned Attributes; // Pattern attributes
public: public:
ComplexPattern() : NumOperands(0) {}; ComplexPattern() : NumOperands(0) {};
ComplexPattern(Record *R); ComplexPattern(Record *R);
@@ -184,7 +188,7 @@ public:
return RootNodes; return RootNodes;
} }
bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); } bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); }
bool hasAttribute(enum CPAttr Attr) const { return Attributes & (1 << Attr); }
}; };
} // End llvm namespace } // End llvm namespace

View File

@@ -550,7 +550,7 @@ public:
emitCheck(MaskPredicate + RootName + "0, cast<ConstantSDNode>(" + emitCheck(MaskPredicate + RootName + "0, cast<ConstantSDNode>(" +
RootName + "1), " + itostr(II->getValue()) + ")"); RootName + "1), " + itostr(II->getValue()) + ")");
EmitChildMatchCode(N->getChild(0), N, RootName + utostr(0), EmitChildMatchCode(N->getChild(0), N, RootName + utostr(0), RootName,
ChainSuffix + utostr(0), FoundChain); ChainSuffix + utostr(0), FoundChain);
return; return;
} }
@@ -561,7 +561,7 @@ public:
emitInit("SDOperand " + RootName + utostr(OpNo) + " = " + emitInit("SDOperand " + RootName + utostr(OpNo) + " = " +
RootName + ".getOperand(" +utostr(OpNo) + ");"); RootName + ".getOperand(" +utostr(OpNo) + ");");
EmitChildMatchCode(N->getChild(i), N, RootName + utostr(OpNo), EmitChildMatchCode(N->getChild(i), N, RootName + utostr(OpNo), RootName,
ChainSuffix + utostr(OpNo), FoundChain); ChainSuffix + utostr(OpNo), FoundChain);
} }
@@ -593,7 +593,8 @@ public:
} }
void EmitChildMatchCode(TreePatternNode *Child, TreePatternNode *Parent, void EmitChildMatchCode(TreePatternNode *Child, TreePatternNode *Parent,
const std::string &RootName, const std::string &RootName,
const std::string &ParentRootName,
const std::string &ChainSuffix, bool &FoundChain) { const std::string &ChainSuffix, bool &FoundChain) {
if (!Child->isLeaf()) { if (!Child->isLeaf()) {
// If it's not a leaf, recursively match. // If it's not a leaf, recursively match.
@@ -649,7 +650,12 @@ public:
emitCode("SDOperand " + ChainName + ";"); emitCode("SDOperand " + ChainName + ";");
} }
std::string Code = Fn + "(N, "; std::string Code = Fn + "(";
if (CP->hasAttribute(CPAttrParentAsRoot)) {
Code += ParentRootName + ", ";
} else {
Code += "N, ";
}
if (CP->hasProperty(SDNPHasChain)) { if (CP->hasProperty(SDNPHasChain)) {
std::string ParentName(RootName.begin(), RootName.end()-1); std::string ParentName(RootName.begin(), RootName.end()-1);
Code += ParentName + ", "; Code += ParentName + ", ";