aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/CodeGenDAGPatterns.cpp24
-rw-r--r--utils/TableGen/CodeGenDAGPatterns.h3
-rw-r--r--utils/TableGen/Record.h2
3 files changed, 26 insertions, 3 deletions
diff --git a/utils/TableGen/CodeGenDAGPatterns.cpp b/utils/TableGen/CodeGenDAGPatterns.cpp
index b74144ebfd..13ac6b15ba 100644
--- a/utils/TableGen/CodeGenDAGPatterns.cpp
+++ b/utils/TableGen/CodeGenDAGPatterns.cpp
@@ -621,14 +621,24 @@ static void DumpDepVars(MultipleUseVarSet &DepVars) {
// TreePredicateFn Implementation
//===----------------------------------------------------------------------===//
+/// TreePredicateFn constructor. Here 'N' is a subclass of PatFrag.
+TreePredicateFn::TreePredicateFn(TreePattern *N) : PatFragRec(N) {
+ assert((getPredCode().empty() || getImmCode().empty()) &&
+ ".td file corrupt: can't have a node predicate *and* an imm predicate");
+}
+
std::string TreePredicateFn::getPredCode() const {
return PatFragRec->getRecord()->getValueAsCode("PredicateCode");
}
+std::string TreePredicateFn::getImmCode() const {
+ return PatFragRec->getRecord()->getValueAsCode("ImmediateCode");
+}
+
/// isAlwaysTrue - Return true if this is a noop predicate.
bool TreePredicateFn::isAlwaysTrue() const {
- return getPredCode().empty();
+ return getPredCode().empty() && getImmCode().empty();
}
/// Return the name to use in the generated code to reference this, this is
@@ -642,6 +652,18 @@ std::string TreePredicateFn::getFnName() const {
/// not N. This handles casting and conversion to a concrete node type as
/// appropriate.
std::string TreePredicateFn::getCodeToRunOnSDNode() const {
+ // Handle immediate predicates first.
+ std::string ImmCode = getImmCode();
+ if (!ImmCode.empty()) {
+ std::string Result =
+ " int64_t Imm = cast<ConstantSDNode>(Node)->getSExtValue();\n";
+ if (ImmCode.find("VT") != std::string::npos)
+ Result += " MVT VT = Node->getValueType(0).getSimpleVT();\n";
+ return Result + ImmCode;
+ }
+
+ // Handle arbitrary node predicates.
+ assert(!getPredCode().empty() && "Don't have any predicate code!");
std::string ClassName;
if (PatFragRec->getOnlyTree()->isLeaf())
ClassName = "SDNode";
diff --git a/utils/TableGen/CodeGenDAGPatterns.h b/utils/TableGen/CodeGenDAGPatterns.h
index 2624495a8d..b113a59e4a 100644
--- a/utils/TableGen/CodeGenDAGPatterns.h
+++ b/utils/TableGen/CodeGenDAGPatterns.h
@@ -249,7 +249,7 @@ class TreePredicateFn {
TreePattern *PatFragRec;
public:
/// TreePredicateFn constructor. Here 'N' is a subclass of PatFrag.
- TreePredicateFn(TreePattern *N) : PatFragRec(N) {}
+ TreePredicateFn(TreePattern *N);
TreePattern *getOrigPatFragRecord() const { return PatFragRec; }
@@ -276,6 +276,7 @@ public:
private:
std::string getPredCode() const;
+ std::string getImmCode() const;
};
diff --git a/utils/TableGen/Record.h b/utils/TableGen/Record.h
index f3a5df23ec..522b719803 100644
--- a/utils/TableGen/Record.h
+++ b/utils/TableGen/Record.h
@@ -707,7 +707,7 @@ class CodeInit : public Init {
public:
explicit CodeInit(const std::string &V) : Value(V) {}
- const std::string getValue() const { return Value; }
+ const std::string &getValue() const { return Value; }
virtual Init *convertInitializerTo(RecTy *Ty) {
return Ty->convertValue(this);