diff options
author | Evan Cheng <evan.cheng@apple.com> | 2006-04-19 18:07:24 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2006-04-19 18:07:24 +0000 |
commit | 5941320c0d89711571b87c486b5c50a7c70a8130 (patch) | |
tree | 7ccce9edac0bee4aa8fa70e9eb65a92ad0288c30 /utils | |
parent | 0c760dc224013afcc835f157073eaaf49918ab4b (diff) | |
download | external_llvm-5941320c0d89711571b87c486b5c50a7c70a8130.zip external_llvm-5941320c0d89711571b87c486b5c50a7c70a8130.tar.gz external_llvm-5941320c0d89711571b87c486b5c50a7c70a8130.tar.bz2 |
Allow "let AddedCost = n in" to increase pattern complexity.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27834 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/DAGISelEmitter.cpp | 21 | ||||
-rw-r--r-- | utils/TableGen/DAGISelEmitter.h | 7 |
2 files changed, 21 insertions, 7 deletions
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp index 7a6097f..8d5186f 100644 --- a/utils/TableGen/DAGISelEmitter.cpp +++ b/utils/TableGen/DAGISelEmitter.cpp @@ -1504,7 +1504,8 @@ void DAGISelEmitter::ParseInstructions() { TreePatternNode *DstPattern = TheInst.getResultPattern(); PatternsToMatch. push_back(PatternToMatch(Instr->getValueAsListInit("Predicates"), - SrcPattern, DstPattern)); + SrcPattern, DstPattern, + Instr->getValueAsInt("AddedCost"))); } } @@ -1580,7 +1581,8 @@ void DAGISelEmitter::ParsePatterns() { PatternsToMatch. push_back(PatternToMatch(Patterns[i]->getValueAsListInit("Predicates"), Pattern->getOnlyTree(), - Temp.getOnlyTree())); + Temp.getOnlyTree(), + Patterns[i]->getValueAsInt("AddedCost"))); } } @@ -1823,7 +1825,8 @@ void DAGISelEmitter::GenerateVariants() { // Otherwise, add it to the list of patterns we have. PatternsToMatch. push_back(PatternToMatch(PatternsToMatch[i].getPredicates(), - Variant, PatternsToMatch[i].getDstPattern())); + Variant, PatternsToMatch[i].getDstPattern(), + PatternsToMatch[i].getAddedCost())); } DEBUG(std::cerr << "\n"); @@ -1933,6 +1936,8 @@ struct PatternSortingPredicate { PatternToMatch *RHS) { unsigned LHSSize = getPatternSize(LHS->getSrcPattern(), ISE); unsigned RHSSize = getPatternSize(RHS->getSrcPattern(), ISE); + LHSSize += LHS->getAddedCost(); + RHSSize += RHS->getAddedCost(); if (LHSSize > RHSSize) return true; // LHS -> bigger -> less cost if (LHSSize < RHSSize) return false; @@ -2003,6 +2008,8 @@ private: // Predicates. ListInit *Predicates; + // Pattern cost. + unsigned Cost; // Instruction selector pattern. TreePatternNode *Pattern; // Matched instruction. @@ -2939,8 +2946,10 @@ void DAGISelEmitter::EmitPatterns(std::vector<std::pair<PatternToMatch*, OS << "\n" << std::string(Indent, ' ') << "// Emits: "; Pattern.getDstPattern()->print(OS); OS << "\n"; + unsigned AddedCost = Pattern.getAddedCost(); OS << std::string(Indent, ' ') << "// Pattern complexity = " - << getPatternSize(Pattern.getSrcPattern(), *this) << " cost = " + << getPatternSize(Pattern.getSrcPattern(), *this) + AddedCost + << " cost = " << getResultPatternCost(Pattern.getDstPattern(), *this) << "\n"; } if (!FirstCodeLine.first) { @@ -2960,8 +2969,10 @@ void DAGISelEmitter::EmitPatterns(std::vector<std::pair<PatternToMatch*, OS << "\n" << std::string(Indent, ' ') << "// Emits: "; Pattern.getDstPattern()->print(OS); OS << "\n"; + unsigned AddedCost = Pattern.getAddedCost(); OS << std::string(Indent, ' ') << "// Pattern complexity = " - << getPatternSize(Pattern.getSrcPattern(), *this) << " cost = " + << getPatternSize(Pattern.getSrcPattern(), *this) + AddedCost + << " cost = " << getResultPatternCost(Pattern.getDstPattern(), *this) << "\n"; } EmitPatterns(Other, Indent, OS); diff --git a/utils/TableGen/DAGISelEmitter.h b/utils/TableGen/DAGISelEmitter.h index 8ed66be..c0e984a 100644 --- a/utils/TableGen/DAGISelEmitter.h +++ b/utils/TableGen/DAGISelEmitter.h @@ -394,16 +394,19 @@ namespace llvm { /// PatternToMatch - Used by DAGISelEmitter to keep tab of patterns processed /// to produce isel. struct PatternToMatch { - PatternToMatch(ListInit *preds, TreePatternNode *src, TreePatternNode *dst): - Predicates(preds), SrcPattern(src), DstPattern(dst) {}; + PatternToMatch(ListInit *preds, + TreePatternNode *src, TreePatternNode *dst, unsigned cost): + Predicates(preds), SrcPattern(src), DstPattern(dst), AddedCost(cost) {}; ListInit *Predicates; // Top level predicate conditions to match. TreePatternNode *SrcPattern; // Source pattern to match. TreePatternNode *DstPattern; // Resulting pattern. + unsigned AddedCost; // Add to matching pattern complexity. ListInit *getPredicates() const { return Predicates; } TreePatternNode *getSrcPattern() const { return SrcPattern; } TreePatternNode *getDstPattern() const { return DstPattern; } + unsigned getAddedCost() const { return AddedCost; } }; /// DAGISelEmitter - The top-level class which coordinates construction |