1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 19:23:23 +01:00

Fix PR2590 by making PatternSortingPredicate actually be

ordered correctly.  Previously it would get in trouble when
two patterns were too similar and give them nondet ordering.
We force this by using the record ID order as a fallback.

The testsuite diff is due to alpha patterns being ordered
slightly differently, the change is a semantic noop afaict:

< 	lda $0,-100($16)
---
> 	subq $16,100,$0

llvm-svn: 97509
This commit is contained in:
Chris Lattner 2010-03-01 22:09:11 +00:00
parent 63fd249741
commit c0839055a9
5 changed files with 23 additions and 10 deletions

View File

@ -4,9 +4,8 @@
; RUN: grep { addl} %t.s | count 2
; RUN: grep { addq} %t.s | count 2
; RUN: grep { subl} %t.s | count 2
; RUN: grep { subq} %t.s | count 1
; RUN: grep { subq} %t.s | count 2
;
; RUN: grep {lda \$0,-100(\$16)} %t.s | count 1
; RUN: grep {s4addl} %t.s | count 2
; RUN: grep {s8addl} %t.s | count 2
; RUN: grep {s4addq} %t.s | count 2

View File

@ -2110,7 +2110,8 @@ void CodeGenDAGPatterns::ParseInstructions() {
SrcPattern,
TheInst.getResultPattern(),
TheInst.getImpResults(),
Instr->getValueAsInt("AddedComplexity")));
Instr->getValueAsInt("AddedComplexity"),
Instr->getID()));
}
}
@ -2320,7 +2321,8 @@ void CodeGenDAGPatterns::ParsePatterns() {
PatternToMatch(Patterns[i]->getValueAsListInit("Predicates"),
Pattern->getTree(0),
Temp.getOnlyTree(), InstImpResults,
Patterns[i]->getValueAsInt("AddedComplexity")));
Patterns[i]->getValueAsInt("AddedComplexity"),
Patterns[i]->getID()));
}
}
@ -2614,7 +2616,8 @@ void CodeGenDAGPatterns::GenerateVariants() {
push_back(PatternToMatch(PatternsToMatch[i].getPredicates(),
Variant, PatternsToMatch[i].getDstPattern(),
PatternsToMatch[i].getDstRegs(),
PatternsToMatch[i].getAddedComplexity()));
PatternsToMatch[i].getAddedComplexity(),
Record::getNewUID()));
}
DEBUG(errs() << "\n");

View File

@ -476,15 +476,16 @@ public:
PatternToMatch(ListInit *preds,
TreePatternNode *src, TreePatternNode *dst,
const std::vector<Record*> &dstregs,
unsigned complexity):
Predicates(preds), SrcPattern(src), DstPattern(dst), Dstregs(dstregs),
AddedComplexity(complexity) {}
unsigned complexity, unsigned uid)
: Predicates(preds), SrcPattern(src), DstPattern(dst),
Dstregs(dstregs), AddedComplexity(complexity), ID(uid) {}
ListInit *Predicates; // Top level predicate conditions to match.
TreePatternNode *SrcPattern; // Source pattern to match.
TreePatternNode *DstPattern; // Resulting pattern.
std::vector<Record*> Dstregs; // Physical register defs being matched.
unsigned AddedComplexity; // Add to matching pattern complexity.
unsigned ID; // Unique ID for the record.
ListInit *getPredicates() const { return Predicates; }
TreePatternNode *getSrcPattern() const { return SrcPattern; }

View File

@ -174,8 +174,14 @@ struct PatternSortingPredicate {
if (LHSCost < RHSCost) return true;
if (LHSCost > RHSCost) return false;
return getResultPatternSize(LHS->getDstPattern(), CGP) <
getResultPatternSize(RHS->getDstPattern(), CGP);
unsigned LHSPatSize = getResultPatternSize(LHS->getDstPattern(), CGP);
unsigned RHSPatSize = getResultPatternSize(RHS->getDstPattern(), CGP);
if (LHSPatSize < RHSPatSize) return true;
if (LHSPatSize > RHSPatSize) return false;
// Sort based on the UID of the pattern, giving us a deterministic ordering.
assert(LHS->ID != RHS->ID);
return LHS->ID < RHS->ID;
}
};
}

View File

@ -1225,6 +1225,10 @@ public:
ID(LastID++), Name(N), Loc(loc) {}
~Record() {}
static unsigned getNewUID() { return LastID++; }
unsigned getID() const { return ID; }
const std::string &getName() const { return Name; }