[llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp
Evan Cheng
evan.cheng at apple.com
Sun Oct 15 23:33:59 PDT 2006
Changes in directory llvm/utils/TableGen:
DAGISelEmitter.cpp updated: 1.271 -> 1.272
---
Log message:
Passing isel root and use operands to ComplexPattern functions, these should do the usual load folding checks as well.
---
Diffs of the changes: (+28 -14)
DAGISelEmitter.cpp | 42 ++++++++++++++++++++++++++++--------------
1 files changed, 28 insertions(+), 14 deletions(-)
Index: llvm/utils/TableGen/DAGISelEmitter.cpp
diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.271 llvm/utils/TableGen/DAGISelEmitter.cpp:1.272
--- llvm/utils/TableGen/DAGISelEmitter.cpp:1.271 Sat Oct 14 03:30:15 2006
+++ llvm/utils/TableGen/DAGISelEmitter.cpp Mon Oct 16 01:33:44 2006
@@ -2199,9 +2199,9 @@
/// EmitMatchCode - Emit a matcher for N, going to the label for PatternNo
/// if the match fails. At this point, we already know that the opcode for N
/// matches, and the SDNode for the result has the RootName specified name.
- void EmitMatchCode(TreePatternNode *Root, TreePatternNode *N,
- TreePatternNode *P, const std::string &RootName,
- const std::string &ChainSuffix, bool &FoundChain) {
+ void EmitMatchCode(TreePatternNode *N, TreePatternNode *P,
+ const std::string &RootName, const std::string &ChainSuffix,
+ bool &FoundChain) {
bool isRoot = (P == NULL);
// Emit instruction predicates. Each predicate is just a string for now.
if (isRoot) {
@@ -2283,12 +2283,22 @@
// / [YY]
// | ^
// [XX]-------|
- const SDNodeInfo &PInfo = ISE.getSDNodeInfo(P->getOperator());
- if (P != Root ||
+ bool NeedCheck = false;
+ if (P != Pattern)
+ NeedCheck = true;
+ else {
+ const SDNodeInfo &PInfo = ISE.getSDNodeInfo(P->getOperator());
+ NeedCheck =
+ P->getOperator() == ISE.get_intrinsic_void_sdnode() ||
+ P->getOperator() == ISE.get_intrinsic_w_chain_sdnode() ||
+ P->getOperator() == ISE.get_intrinsic_wo_chain_sdnode() ||
PInfo.getNumOperands() > 1 ||
PInfo.hasProperty(SDNPHasChain) ||
PInfo.hasProperty(SDNPInFlag) ||
- PInfo.hasProperty(SDNPOptInFlag)) {
+ PInfo.hasProperty(SDNPOptInFlag);
+ }
+
+ if (NeedCheck) {
std::string ParentName(RootName.begin(), RootName.end()-1);
emitCheck("CanBeFoldedBy(" + RootName + ".Val, " + ParentName +
".Val, N.Val)");
@@ -2359,7 +2369,7 @@
emitCheck(MaskPredicate + RootName + "0, cast<ConstantSDNode>(" +
RootName + "1), " + itostr(II->getValue()) + ")");
- EmitChildMatchCode(Root, N->getChild(0), N, RootName + utostr(0),
+ EmitChildMatchCode(N->getChild(0), N, RootName + utostr(0),
ChainSuffix + utostr(0), FoundChain);
return;
}
@@ -2370,7 +2380,7 @@
emitInit("SDOperand " + RootName + utostr(OpNo) + " = " +
RootName + ".getOperand(" +utostr(OpNo) + ");");
- EmitChildMatchCode(Root, N->getChild(i), N, RootName + utostr(OpNo),
+ EmitChildMatchCode(N->getChild(i), N, RootName + utostr(OpNo),
ChainSuffix + utostr(OpNo), FoundChain);
}
@@ -2401,15 +2411,15 @@
}
}
- void EmitChildMatchCode(TreePatternNode *Root, TreePatternNode *Child,
- TreePatternNode *Parent, const std::string &RootName,
+ void EmitChildMatchCode(TreePatternNode *Child, TreePatternNode *Parent,
+ const std::string &RootName,
const std::string &ChainSuffix, bool &FoundChain) {
if (!Child->isLeaf()) {
// If it's not a leaf, recursively match.
const SDNodeInfo &CInfo = ISE.getSDNodeInfo(Child->getOperator());
emitCheck(RootName + ".getOpcode() == " +
CInfo.getEnumName());
- EmitMatchCode(Root, Child, Parent, RootName, ChainSuffix, FoundChain);
+ EmitMatchCode(Child, Parent, RootName, ChainSuffix, FoundChain);
if (NodeHasProperty(Child, SDNPHasChain, ISE))
FoldedChains.push_back(std::make_pair(RootName, CInfo.getNumResults()));
} else {
@@ -2457,7 +2467,12 @@
emitCode("SDOperand " + ChainName + ";");
}
- std::string Code = Fn + "(" + RootName;
+ std::string Code = Fn + "(";
+ if (CP->hasProperty(SDNPHasChain)) {
+ std::string ParentName(RootName.begin(), RootName.end()-1);
+ Code += "N, " + ParentName + ", ";
+ }
+ Code += RootName;
for (unsigned i = 0; i < NumOps; i++)
Code += ", CPTmp" + utostr(i);
if (CP->hasProperty(SDNPHasChain))
@@ -3099,8 +3114,7 @@
// Emit the matcher, capturing named arguments in VariableMap.
bool FoundChain = false;
- Emitter.EmitMatchCode(Pattern.getSrcPattern(), Pattern.getSrcPattern(), NULL,
- "N", "", FoundChain);
+ Emitter.EmitMatchCode(Pattern.getSrcPattern(), NULL, "N", "", FoundChain);
// TP - Get *SOME* tree pattern, we don't care which.
TreePattern &TP = *PatternFragments.begin()->second;
More information about the llvm-commits
mailing list