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 | aa3325e925c6cd0e69f869626f84dae7b2293ad8 (patch) | |
| tree | 89e1dd8a17549529a5b5fb652721807c39491590 /llvm/utils/TableGen | |
| parent | 7b96902d3587612811cba59498a5f5e3a5d6f729 (diff) | |
| download | bcm5719-llvm-aa3325e925c6cd0e69f869626f84dae7b2293ad8.tar.gz bcm5719-llvm-aa3325e925c6cd0e69f869626f84dae7b2293ad8.zip | |
Allow "let AddedCost = n in" to increase pattern complexity.
llvm-svn: 27834
Diffstat (limited to 'llvm/utils/TableGen')
| -rw-r--r-- | llvm/utils/TableGen/DAGISelEmitter.cpp | 21 | ||||
| -rw-r--r-- | llvm/utils/TableGen/DAGISelEmitter.h | 7 |
2 files changed, 21 insertions, 7 deletions
diff --git a/llvm/utils/TableGen/DAGISelEmitter.cpp b/llvm/utils/TableGen/DAGISelEmitter.cpp index 7a6097fa370..8d5186f2111 100644 --- a/llvm/utils/TableGen/DAGISelEmitter.cpp +++ b/llvm/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/llvm/utils/TableGen/DAGISelEmitter.h b/llvm/utils/TableGen/DAGISelEmitter.h index 8ed66be800a..c0e984a527f 100644 --- a/llvm/utils/TableGen/DAGISelEmitter.h +++ b/llvm/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 |

