TableGen: Allow AddedComplexity values to be negative
This is useful for cases when stand-alone patterns are preferred to the patterns included in the instruction definitions. Instead of requiring that stand-alone patterns set a larger AddedComplexity value, which can be confusing to new developers, the allows us to reduce the complexity of the included patterns to achieve the same result. There will be test cases for this added to the R600 backend in a future commit. llvm-svn: 214466
This commit is contained in:
parent
0e975cf6e5
commit
6655dd699f
|
@ -771,7 +771,7 @@ static unsigned getPatternSize(const TreePatternNode *P,
|
||||||
|
|
||||||
/// Compute the complexity metric for the input pattern. This roughly
|
/// Compute the complexity metric for the input pattern. This roughly
|
||||||
/// corresponds to the number of nodes that are covered.
|
/// corresponds to the number of nodes that are covered.
|
||||||
unsigned PatternToMatch::
|
int PatternToMatch::
|
||||||
getPatternComplexity(const CodeGenDAGPatterns &CGP) const {
|
getPatternComplexity(const CodeGenDAGPatterns &CGP) const {
|
||||||
return getPatternSize(getSrcPattern(), CGP) + getAddedComplexity();
|
return getPatternSize(getSrcPattern(), CGP) + getAddedComplexity();
|
||||||
}
|
}
|
||||||
|
|
|
@ -667,7 +667,7 @@ public:
|
||||||
PatternToMatch(Record *srcrecord, ListInit *preds,
|
PatternToMatch(Record *srcrecord, ListInit *preds,
|
||||||
TreePatternNode *src, TreePatternNode *dst,
|
TreePatternNode *src, TreePatternNode *dst,
|
||||||
const std::vector<Record*> &dstregs,
|
const std::vector<Record*> &dstregs,
|
||||||
unsigned complexity, unsigned uid)
|
int complexity, unsigned uid)
|
||||||
: SrcRecord(srcrecord), Predicates(preds), SrcPattern(src), DstPattern(dst),
|
: SrcRecord(srcrecord), Predicates(preds), SrcPattern(src), DstPattern(dst),
|
||||||
Dstregs(dstregs), AddedComplexity(complexity), ID(uid) {}
|
Dstregs(dstregs), AddedComplexity(complexity), ID(uid) {}
|
||||||
|
|
||||||
|
@ -676,7 +676,7 @@ public:
|
||||||
TreePatternNode *SrcPattern; // Source pattern to match.
|
TreePatternNode *SrcPattern; // Source pattern to match.
|
||||||
TreePatternNode *DstPattern; // Resulting pattern.
|
TreePatternNode *DstPattern; // Resulting pattern.
|
||||||
std::vector<Record*> Dstregs; // Physical register defs being matched.
|
std::vector<Record*> Dstregs; // Physical register defs being matched.
|
||||||
unsigned AddedComplexity; // Add to matching pattern complexity.
|
int AddedComplexity; // Add to matching pattern complexity.
|
||||||
unsigned ID; // Unique ID for the record.
|
unsigned ID; // Unique ID for the record.
|
||||||
|
|
||||||
Record *getSrcRecord() const { return SrcRecord; }
|
Record *getSrcRecord() const { return SrcRecord; }
|
||||||
|
@ -684,13 +684,13 @@ public:
|
||||||
TreePatternNode *getSrcPattern() const { return SrcPattern; }
|
TreePatternNode *getSrcPattern() const { return SrcPattern; }
|
||||||
TreePatternNode *getDstPattern() const { return DstPattern; }
|
TreePatternNode *getDstPattern() const { return DstPattern; }
|
||||||
const std::vector<Record*> &getDstRegs() const { return Dstregs; }
|
const std::vector<Record*> &getDstRegs() const { return Dstregs; }
|
||||||
unsigned getAddedComplexity() const { return AddedComplexity; }
|
int getAddedComplexity() const { return AddedComplexity; }
|
||||||
|
|
||||||
std::string getPredicateCheck() const;
|
std::string getPredicateCheck() const;
|
||||||
|
|
||||||
/// Compute the complexity metric for the input pattern. This roughly
|
/// Compute the complexity metric for the input pattern. This roughly
|
||||||
/// corresponds to the number of nodes that are covered.
|
/// corresponds to the number of nodes that are covered.
|
||||||
unsigned getPatternComplexity(const CodeGenDAGPatterns &CGP) const;
|
int getPatternComplexity(const CodeGenDAGPatterns &CGP) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class CodeGenDAGPatterns {
|
class CodeGenDAGPatterns {
|
||||||
|
|
|
@ -94,8 +94,8 @@ struct PatternSortingPredicate {
|
||||||
// Otherwise, if the patterns might both match, sort based on complexity,
|
// Otherwise, if the patterns might both match, sort based on complexity,
|
||||||
// which means that we prefer to match patterns that cover more nodes in the
|
// which means that we prefer to match patterns that cover more nodes in the
|
||||||
// input over nodes that cover fewer.
|
// input over nodes that cover fewer.
|
||||||
unsigned LHSSize = LHS->getPatternComplexity(CGP);
|
int LHSSize = LHS->getPatternComplexity(CGP);
|
||||||
unsigned RHSSize = RHS->getPatternComplexity(CGP);
|
int RHSSize = RHS->getPatternComplexity(CGP);
|
||||||
if (LHSSize > RHSSize) return true; // LHS -> bigger -> less cost
|
if (LHSSize > RHSSize) return true; // LHS -> bigger -> less cost
|
||||||
if (LHSSize < RHSSize) return false;
|
if (LHSSize < RHSSize) return false;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue