diff options
Diffstat (limited to 'contrib/llvm/utils/TableGen/GlobalISelEmitter.cpp')
-rw-r--r-- | contrib/llvm/utils/TableGen/GlobalISelEmitter.cpp | 85 |
1 files changed, 38 insertions, 47 deletions
diff --git a/contrib/llvm/utils/TableGen/GlobalISelEmitter.cpp b/contrib/llvm/utils/TableGen/GlobalISelEmitter.cpp index 69726cc9f257..997ceb12becd 100644 --- a/contrib/llvm/utils/TableGen/GlobalISelEmitter.cpp +++ b/contrib/llvm/utils/TableGen/GlobalISelEmitter.cpp @@ -200,7 +200,8 @@ static Optional<LLTCodeGen> MVTToLLT(MVT::SimpleValueType SVT) { static std::string explainPredicates(const TreePatternNode *N) { std::string Explanation = ""; StringRef Separator = ""; - for (const auto &P : N->getPredicateFns()) { + for (const TreePredicateCall &Call : N->getPredicateCalls()) { + const TreePredicateFn &P = Call.Fn; Explanation += (Separator + P.getOrigPatFragRecord()->getRecord()->getName()).str(); Separator = ", "; @@ -284,7 +285,9 @@ static Error isTrivialOperatorNode(const TreePatternNode *N) { std::string Separator = ""; bool HasUnsupportedPredicate = false; - for (const auto &Predicate : N->getPredicateFns()) { + for (const TreePredicateCall &Call : N->getPredicateCalls()) { + const TreePredicateFn &Predicate = Call.Fn; + if (Predicate.isAlwaysTrue()) continue; @@ -1837,6 +1840,12 @@ public: static bool classof(const InstructionPredicateMatcher *P) { return P->getKind() == IPM_GenericPredicate; } + bool isIdentical(const PredicateMatcher &B) const override { + return InstructionPredicateMatcher::isIdentical(B) && + Predicate == + static_cast<const GenericInstructionPredicateMatcher &>(B) + .Predicate; + } void emitPredicateOpcodes(MatchTable &Table, RuleMatcher &Rule) const override { Table << MatchTable::Opcode("GIM_CheckCxxInsnPredicate") @@ -2607,7 +2616,7 @@ public: std::vector<unsigned> MergeInsnIDs; for (const auto &IDMatcherPair : Rule.defined_insn_vars()) MergeInsnIDs.push_back(IDMatcherPair.second); - llvm::sort(MergeInsnIDs.begin(), MergeInsnIDs.end()); + llvm::sort(MergeInsnIDs); for (const auto &MergeInsnID : MergeInsnIDs) Table << MatchTable::IntValue(MergeInsnID); Table << MatchTable::NamedValue("GIU_MergeMemOperands_EndOfList") @@ -2806,7 +2815,7 @@ void RuleMatcher::emit(MatchTable &Table) { InsnIDs.push_back(Pair.second); } - llvm::sort(InsnIDs.begin(), InsnIDs.end()); + llvm::sort(InsnIDs); for (const auto &InsnID : InsnIDs) { // Reject the difficult cases until we have a more accurate check. @@ -2984,9 +2993,6 @@ private: void gatherOpcodeValues(); void gatherTypeIDValues(); void gatherNodeEquivs(); - // Instruction predicate code that will be emitted in generated functions. - SmallVector<std::string, 2> InstructionPredicateCodes; - unsigned getOrCreateInstructionPredicateFnId(StringRef Code); Record *findNodeEquiv(Record *N) const; const CodeGenInstruction *getEquivNode(Record &Equiv, @@ -3085,20 +3091,6 @@ void GlobalISelEmitter::gatherOpcodeValues() { void GlobalISelEmitter::gatherTypeIDValues() { LLTOperandMatcher::initTypeIDValuesMap(); } -unsigned GlobalISelEmitter::getOrCreateInstructionPredicateFnId(StringRef Code) { - // There's not very many predicates that need to be here at the moment so we - // just maintain a simple set-like vector. If it grows then we'll need to do - // something more efficient. - const auto &I = std::find(InstructionPredicateCodes.begin(), - InstructionPredicateCodes.end(), - Code); - if (I == InstructionPredicateCodes.end()) { - unsigned ID = InstructionPredicateCodes.size(); - InstructionPredicateCodes.push_back(Code); - return ID; - } - return std::distance(InstructionPredicateCodes.begin(), I); -} void GlobalISelEmitter::gatherNodeEquivs() { assert(NodeEquivs.empty()); @@ -3128,7 +3120,8 @@ Record *GlobalISelEmitter::findNodeEquiv(Record *N) const { const CodeGenInstruction * GlobalISelEmitter::getEquivNode(Record &Equiv, const TreePatternNode *N) const { - for (const auto &Predicate : N->getPredicateFns()) { + for (const TreePredicateCall &Call : N->getPredicateCalls()) { + const TreePredicateFn &Predicate = Call.Fn; if (!Equiv.isValueUnset("IfSignExtend") && Predicate.isLoad() && Predicate.isSignExtLoad()) return &Target.getInstruction(Equiv.getValueAsDef("IfSignExtend")); @@ -3197,7 +3190,8 @@ Expected<InstructionMatcher &> GlobalISelEmitter::createAndImportSelDAGMatcher( " for result of Src pattern operator"); } - for (const auto &Predicate : Src->getPredicateFns()) { + for (const TreePredicateCall &Call : Src->getPredicateCalls()) { + const TreePredicateFn &Predicate = Call.Fn; if (Predicate.isAlwaysTrue()) continue; @@ -4299,11 +4293,11 @@ void GlobalISelEmitter::run(raw_ostream &OS) { std::vector<Record *> ComplexPredicates = RK.getAllDerivedDefinitions("GIComplexOperandMatcher"); - llvm::sort(ComplexPredicates.begin(), ComplexPredicates.end(), orderByName); + llvm::sort(ComplexPredicates, orderByName); std::vector<Record *> CustomRendererFns = RK.getAllDerivedDefinitions("GICustomOperandRenderer"); - llvm::sort(CustomRendererFns.begin(), CustomRendererFns.end(), orderByName); + llvm::sort(CustomRendererFns, orderByName); unsigned MaxTemporaries = 0; for (const auto &Rule : Rules) @@ -4382,7 +4376,7 @@ void GlobalISelEmitter::run(raw_ostream &OS) { std::vector<LLTCodeGen> TypeObjects; for (const auto &Ty : KnownTypes) TypeObjects.push_back(Ty); - llvm::sort(TypeObjects.begin(), TypeObjects.end()); + llvm::sort(TypeObjects); OS << "// LLT Objects.\n" << "enum {\n"; for (const auto &TypeObject : TypeObjects) { @@ -4405,21 +4399,20 @@ void GlobalISelEmitter::run(raw_ostream &OS) { std::vector<std::vector<Record *>> FeatureBitsets; for (auto &Rule : Rules) FeatureBitsets.push_back(Rule.getRequiredFeatures()); - llvm::sort( - FeatureBitsets.begin(), FeatureBitsets.end(), - [&](const std::vector<Record *> &A, const std::vector<Record *> &B) { - if (A.size() < B.size()) - return true; - if (A.size() > B.size()) - return false; - for (const auto &Pair : zip(A, B)) { - if (std::get<0>(Pair)->getName() < std::get<1>(Pair)->getName()) - return true; - if (std::get<0>(Pair)->getName() > std::get<1>(Pair)->getName()) - return false; - } + llvm::sort(FeatureBitsets, [&](const std::vector<Record *> &A, + const std::vector<Record *> &B) { + if (A.size() < B.size()) + return true; + if (A.size() > B.size()) + return false; + for (const auto &Pair : zip(A, B)) { + if (std::get<0>(Pair)->getName() < std::get<1>(Pair)->getName()) + return true; + if (std::get<0>(Pair)->getName() > std::get<1>(Pair)->getName()) return false; - }); + } + return false; + }); FeatureBitsets.erase( std::unique(FeatureBitsets.begin(), FeatureBitsets.end()), FeatureBitsets.end()); @@ -4588,13 +4581,11 @@ void RuleMatcher::optimize() { } InsnMatcher.optimize(); } - llvm::sort( - EpilogueMatchers.begin(), EpilogueMatchers.end(), - [](const std::unique_ptr<PredicateMatcher> &L, - const std::unique_ptr<PredicateMatcher> &R) { - return std::make_tuple(L->getKind(), L->getInsnVarID(), L->getOpIdx()) < - std::make_tuple(R->getKind(), R->getInsnVarID(), R->getOpIdx()); - }); + llvm::sort(EpilogueMatchers, [](const std::unique_ptr<PredicateMatcher> &L, + const std::unique_ptr<PredicateMatcher> &R) { + return std::make_tuple(L->getKind(), L->getInsnVarID(), L->getOpIdx()) < + std::make_tuple(R->getKind(), R->getInsnVarID(), R->getOpIdx()); + }); } bool RuleMatcher::hasFirstCondition() const { |