summaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
authorDaniel Sanders <daniel_l_sanders@apple.com>2017-12-20 14:41:51 +0000
committerDaniel Sanders <daniel_l_sanders@apple.com>2017-12-20 14:41:51 +0000
commitb379571ef2a30366012c3ee0c1505b341caafbaa (patch)
treec13ccb7dcc927c668e4729ccfc1abd07886415d0 /utils
parent2f9bbd62288e1039eda69b3466e269beeca8c928 (diff)
[globalisel][tablegen] Allow ImmLeaf predicates to use InstructionSelector members
NFC for currently supported targets. This resolves a problem encountered by targets such as RISCV that reference `Subtarget` in ImmLeaf predicates. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321176 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r--utils/TableGen/GlobalISelEmitter.cpp34
1 files changed, 22 insertions, 12 deletions
diff --git a/utils/TableGen/GlobalISelEmitter.cpp b/utils/TableGen/GlobalISelEmitter.cpp
index 15400c07279..f4e99622747 100644
--- a/utils/TableGen/GlobalISelEmitter.cpp
+++ b/utils/TableGen/GlobalISelEmitter.cpp
@@ -3550,16 +3550,21 @@ void GlobalISelEmitter::emitImmPredicates(
OS << "};\n";
}
- for (const auto *Record : MatchedRecords)
- OS << "static bool Predicate_" << Record->getName() << "(" << Type
- << " Imm) {" << Record->getValueAsString("ImmediateCode") << "}\n";
-
- OS << "static InstructionSelector::" << TypeIdentifier
- << "ImmediatePredicateFn " << TypeIdentifier << "ImmPredicateFns[] = {\n"
- << " nullptr,\n";
- for (const auto *Record : MatchedRecords)
- OS << " Predicate_" << Record->getName() << ",\n";
- OS << "};\n";
+ OS << "bool " << Target.getName() << "InstructionSelector::testImmPredicate_"
+ << TypeIdentifier << "(unsigned PredicateID, " << Type << " Imm) const {\n"
+ << " switch (PredicateID) {\n";
+ for (const auto *Record : MatchedRecords) {
+ OS << " case GIPFP_" << TypeIdentifier << "_Predicate_"
+ << Record->getName() << ": {\n"
+ << " " << Record->getValueAsString("ImmediateCode") << "\n"
+ << " llvm_unreachable(\"ImmediateCode should have returned\");\n"
+ << " return false;\n"
+ << " }\n";
+ }
+ OS << " }\n"
+ << " llvm_unreachable(\"Unknown predicate\");\n"
+ << " return false;\n"
+ << "}\n";
}
std::vector<Matcher *> GlobalISelEmitter::optimizeRules(
@@ -3673,12 +3678,17 @@ void GlobalISelEmitter::run(raw_ostream &OS) {
"MatcherInfo;\n"
<< " static " << Target.getName()
<< "InstructionSelector::ComplexMatcherMemFn ComplexPredicateFns[];\n"
+ << "bool testImmPredicate_I64(unsigned PredicateID, int64_t Imm) const "
+ "override;\n"
+ << "bool testImmPredicate_APInt(unsigned PredicateID, const APInt &Imm) "
+ "const override;\n"
+ << "bool testImmPredicate_APFloat(unsigned PredicateID, const APFloat "
+ "&Imm) const override;\n"
<< "#endif // ifdef GET_GLOBALISEL_TEMPORARIES_DECL\n\n";
OS << "#ifdef GET_GLOBALISEL_TEMPORARIES_INIT\n"
<< ", State(" << MaxTemporaries << "),\n"
- << "MatcherInfo({TypeObjects, FeatureBitsets, I64ImmPredicateFns, "
- "APIntImmPredicateFns, APFloatImmPredicateFns, ComplexPredicateFns})\n"
+ << "MatcherInfo({TypeObjects, FeatureBitsets, ComplexPredicateFns})\n"
<< "#endif // ifdef GET_GLOBALISEL_TEMPORARIES_INIT\n\n";
OS << "#ifdef GET_GLOBALISEL_IMPL\n";