Fix PR2590 by making PatternSortingPredicate actually be
authorChris Lattner <sabre@nondot.org>
Mon, 1 Mar 2010 22:09:11 +0000 (22:09 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 1 Mar 2010 22:09:11 +0000 (22:09 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97509 91177308-0d34-0410-b5e6-96231b3b80d8

test/CodeGen/Alpha/add.ll
utils/TableGen/CodeGenDAGPatterns.cpp
utils/TableGen/CodeGenDAGPatterns.h
utils/TableGen/DAGISelEmitter.cpp
utils/TableGen/Record.h

index 24a74188f8c09ff0f16483e972865df4d16e8c1a..cd883f64a6ba6f4dc151e3e2356c70620e936401 100644 (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
index 8f4788f872d6e7183330c2dbae3a801ceb26df78..db90031709cc441177dc511c7453fbb4fce5caee 100644 (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");
index 60898bc04ce58cbeb6baff18024306fcabbf303e..37d633ecc21d30ec08976d97490aa675796319f0 100644 (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; }
index 8816c9c0e749b67f6bcf5306a9a550a652c60ade..03a12cd13d90261d847fe4568de2ba3a68de855c 100644 (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;
   }
 };
 }
index 45f3072ff0d21c4d0609f7026c6559a2d2ace6d6..90096e98e206003f8fd3314cab627b03a834c574 100644 (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; }