mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-13 14:35:54 +00:00
Allow "let AddedCost = n in" to increase pattern complexity.
llvm-svn: 27834
This commit is contained in:
parent
435b87fa61
commit
318120f8ad
@ -144,6 +144,9 @@ class Instruction {
|
||||
// code.
|
||||
list<Predicate> Predicates = [];
|
||||
|
||||
// Added cost passed onto matching pattern.
|
||||
int AddedCost = 0;
|
||||
|
||||
// These bits capture information about the high-level semantics of the
|
||||
// instruction.
|
||||
bit isReturn = 0; // Is this instruction a return instruction?
|
||||
|
@ -313,7 +313,7 @@ def scalar_to_vector : SDNode<"ISD::SCALAR_TO_VECTOR", SDTypeProfile<1, 1, []>,
|
||||
def vector_extract : SDNode<"ISD::EXTRACT_VECTOR_ELT",
|
||||
SDTypeProfile<1, 2, []>, []>;
|
||||
def vector_insert : SDNode<"ISD::INSERT_VECTOR_ELT",
|
||||
SDTypeProfile<1, 3, []>, []>;
|
||||
SDTypeProfile<1, 3, [SDTCisSameAs<0, 1>]>, []>;
|
||||
|
||||
// Nodes for intrinsics, you should use the intrinsic itself and let tblgen use
|
||||
// these internally. Don't reference these directly.
|
||||
@ -473,6 +473,7 @@ class Pattern<dag patternToMatch, list<dag> resultInstrs> {
|
||||
dag PatternToMatch = patternToMatch;
|
||||
list<dag> ResultInstrs = resultInstrs;
|
||||
list<Predicate> Predicates = []; // See class Instruction in Target.td.
|
||||
int AddedCost = 0; // See class Instruction in Target.td.
|
||||
}
|
||||
|
||||
// Pat - A simple (but common) form of a pattern, which produces a simple result
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user