diff options
Diffstat (limited to 'llvm/utils/TableGen/CodeGenDAGPatterns.cpp')
-rw-r--r-- | llvm/utils/TableGen/CodeGenDAGPatterns.cpp | 97 |
1 files changed, 56 insertions, 41 deletions
diff --git a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp index 95d7581..1bd502d 100644 --- a/llvm/utils/TableGen/CodeGenDAGPatterns.cpp +++ b/llvm/utils/TableGen/CodeGenDAGPatterns.cpp @@ -1440,24 +1440,50 @@ getPatternComplexity(const CodeGenDAGPatterns &CGP) const { return getPatternSize(getSrcPattern(), CGP) + getAddedComplexity(); } +void PatternToMatch::getPredicateRecords( + SmallVectorImpl<Record *> &PredicateRecs) const { + for (Init *I : Predicates->getValues()) { + if (DefInit *Pred = dyn_cast<DefInit>(I)) { + Record *Def = Pred->getDef(); + if (!Def->isSubClassOf("Predicate")) { +#ifndef NDEBUG + Def->dump(); +#endif + llvm_unreachable("Unknown predicate type!"); + } + PredicateRecs.push_back(Def); + } + } + // Sort so that different orders get canonicalized to the same string. + llvm::sort(PredicateRecs, LessRecord()); +} + /// getPredicateCheck - Return a single string containing all of this /// pattern's predicates concatenated with "&&" operators. /// std::string PatternToMatch::getPredicateCheck() const { - SmallVector<const Predicate*,4> PredList; - for (const Predicate &P : Predicates) { - if (!P.getCondString().empty()) - PredList.push_back(&P); + SmallVector<Record *, 4> PredicateRecs; + getPredicateRecords(PredicateRecs); + + SmallString<128> PredicateCheck; + for (Record *Pred : PredicateRecs) { + StringRef CondString = Pred->getValueAsString("CondString"); + if (CondString.empty()) + continue; + if (!PredicateCheck.empty()) + PredicateCheck += " && "; + PredicateCheck += "("; + PredicateCheck += CondString; + PredicateCheck += ")"; } - llvm::sort(PredList, deref<std::less<>>()); - std::string Check; - for (unsigned i = 0, e = PredList.size(); i != e; ++i) { - if (i != 0) - Check += " && "; - Check += '(' + PredList[i]->getCondString() + ')'; + if (!HwModeFeatures.empty()) { + if (!PredicateCheck.empty()) + PredicateCheck += " && "; + PredicateCheck += HwModeFeatures; } - return Check; + + return std::string(PredicateCheck); } //===----------------------------------------------------------------------===// @@ -3930,20 +3956,6 @@ static void FindNames(TreePatternNode *P, } } -std::vector<Predicate> CodeGenDAGPatterns::makePredList(ListInit *L) { - std::vector<Predicate> Preds; - for (Init *I : L->getValues()) { - if (DefInit *Pred = dyn_cast<DefInit>(I)) - Preds.push_back(Pred->getDef()); - else - llvm_unreachable("Non-def on the list"); - } - - // Sort so that different orders get canonicalized to the same string. - llvm::sort(Preds); - return Preds; -} - void CodeGenDAGPatterns::AddPatternToMatch(TreePattern *Pattern, PatternToMatch &&PTM) { // Do some sanity checking on the pattern we're about to match. @@ -4254,8 +4266,7 @@ void CodeGenDAGPatterns::ParseOnePattern(Record *TheDef, for (const auto &T : Pattern.getTrees()) if (T->hasPossibleType()) AddPatternToMatch(&Pattern, - PatternToMatch(TheDef, makePredList(Preds), - T, Temp.getOnlyTree(), + PatternToMatch(TheDef, Preds, T, Temp.getOnlyTree(), InstImpResults, Complexity, TheDef->getID())); } @@ -4310,20 +4321,17 @@ void CodeGenDAGPatterns::ExpandHwModeBasedTypes() { PatternsToMatch.swap(Copy); auto AppendPattern = [this](PatternToMatch &P, unsigned Mode, - ArrayRef<Predicate> Check) { + StringRef Check) { TreePatternNodePtr NewSrc = P.getSrcPattern()->clone(); TreePatternNodePtr NewDst = P.getDstPattern()->clone(); if (!NewSrc->setDefaultMode(Mode) || !NewDst->setDefaultMode(Mode)) { return; } - std::vector<Predicate> Preds = P.getPredicates(); - llvm::append_range(Preds, Check); - PatternsToMatch.emplace_back(P.getSrcRecord(), std::move(Preds), + PatternsToMatch.emplace_back(P.getSrcRecord(), P.getPredicates(), std::move(NewSrc), std::move(NewDst), - P.getDstRegs(), - P.getAddedComplexity(), Record::getNewUID(), - Mode); + P.getDstRegs(), P.getAddedComplexity(), + Record::getNewUID(), Mode, Check); }; for (PatternToMatch &P : Copy) { @@ -4354,7 +4362,7 @@ void CodeGenDAGPatterns::ExpandHwModeBasedTypes() { // duplicated patterns with different predicate checks, construct the // default check as a negation of all predicates that are actually present // in the source/destination patterns. - SmallVector<Predicate, 2> DefaultCheck; + SmallString<128> DefaultCheck; for (unsigned M : Modes) { if (M == DefaultMode) @@ -4362,10 +4370,14 @@ void CodeGenDAGPatterns::ExpandHwModeBasedTypes() { // Fill the map entry for this mode. const HwMode &HM = CGH.getMode(M); - AppendPattern(P, M, Predicate(HM.Features, true)); + AppendPattern(P, M, "(MF->getSubtarget().checkFeatures(\"" + HM.Features + "\"))"); // Add negations of the HM's predicates to the default predicate. - DefaultCheck.push_back(Predicate(HM.Features, false)); + if (!DefaultCheck.empty()) + DefaultCheck += " && "; + DefaultCheck += "(!(MF->getSubtarget().checkFeatures(\""; + DefaultCheck += HM.Features; + DefaultCheck += "\")))"; } bool HasDefault = Modes.count(DefaultMode); @@ -4685,8 +4697,8 @@ void CodeGenDAGPatterns::GenerateVariants() { if (MatchedPatterns[i]) continue; - const std::vector<Predicate> &Predicates = - PatternsToMatch[i].getPredicates(); + ListInit *Predicates = PatternsToMatch[i].getPredicates(); + StringRef HwModeFeatures = PatternsToMatch[i].getHwModeFeatures(); BitVector &Matches = MatchedPredicates[i]; MatchedPatterns.set(i); @@ -4695,7 +4707,8 @@ void CodeGenDAGPatterns::GenerateVariants() { // Don't test patterns that have already been cached - it won't match. for (unsigned p = 0; p != NumOriginalPatterns; ++p) if (!MatchedPatterns[p]) - Matches[p] = (Predicates == PatternsToMatch[p].getPredicates()); + Matches[p] = (Predicates == PatternsToMatch[p].getPredicates()) && + (HwModeFeatures == PatternsToMatch[p].getHwModeFeatures()); // Copy this to all the matching patterns. for (int p = Matches.find_first(); p != -1; p = Matches.find_next(p)) @@ -4739,7 +4752,9 @@ void CodeGenDAGPatterns::GenerateVariants() { PatternsToMatch[i].getSrcRecord(), PatternsToMatch[i].getPredicates(), Variant, PatternsToMatch[i].getDstPatternShared(), PatternsToMatch[i].getDstRegs(), - PatternsToMatch[i].getAddedComplexity(), Record::getNewUID()); + PatternsToMatch[i].getAddedComplexity(), Record::getNewUID(), + PatternsToMatch[i].getForceMode(), + PatternsToMatch[i].getHwModeFeatures().str()); MatchedPredicates.push_back(Matches); // Add a new match the same as this pattern. |