diff options
author | Daniel Sanders <daniel_l_sanders@apple.com> | 2017-12-20 14:41:51 +0000 |
---|---|---|
committer | Daniel Sanders <daniel_l_sanders@apple.com> | 2017-12-20 14:41:51 +0000 |
commit | b379571ef2a30366012c3ee0c1505b341caafbaa (patch) | |
tree | c13ccb7dcc927c668e4729ccfc1abd07886415d0 /utils | |
parent | 2f9bbd62288e1039eda69b3466e269beeca8c928 (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.cpp | 34 |
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"; |