Allow "let AddedCost = n in" to increase pattern complexity.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@27834 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/Target.td b/lib/Target/Target.td
index 4c84674..4d6c80c 100644
--- a/lib/Target/Target.td
+++ b/lib/Target/Target.td
@@ -144,6 +144,9 @@
   // 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?
diff --git a/lib/Target/TargetSelectionDAG.td b/lib/Target/TargetSelectionDAG.td
index 40a4a97..38613c4 100644
--- a/lib/Target/TargetSelectionDAG.td
+++ b/lib/Target/TargetSelectionDAG.td
@@ -313,7 +313,7 @@
 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 @@
   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
diff --git a/utils/TableGen/DAGISelEmitter.cpp b/utils/TableGen/DAGISelEmitter.cpp
index 7a6097f..8d5186f 100644
--- a/utils/TableGen/DAGISelEmitter.cpp
+++ b/utils/TableGen/DAGISelEmitter.cpp
@@ -1504,7 +1504,8 @@
     TreePatternNode *DstPattern = TheInst.getResultPattern();
     PatternsToMatch.
       push_back(PatternToMatch(Instr->getValueAsListInit("Predicates"),
-                               SrcPattern, DstPattern));
+                               SrcPattern, DstPattern,
+                               Instr->getValueAsInt("AddedCost")));
   }
 }
 
@@ -1580,7 +1581,8 @@
     PatternsToMatch.
       push_back(PatternToMatch(Patterns[i]->getValueAsListInit("Predicates"),
                                Pattern->getOnlyTree(),
-                               Temp.getOnlyTree()));
+                               Temp.getOnlyTree(),
+                               Patterns[i]->getValueAsInt("AddedCost")));
   }
 }
 
@@ -1823,7 +1825,8 @@
       // 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 @@
                   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 @@
 
   // Predicates.
   ListInit *Predicates;
+  // Pattern cost.
+  unsigned Cost;
   // Instruction selector pattern.
   TreePatternNode *Pattern;
   // Matched instruction.
@@ -2939,8 +2946,10 @@
       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 @@
       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/utils/TableGen/DAGISelEmitter.h b/utils/TableGen/DAGISelEmitter.h
index 8ed66be..c0e984a 100644
--- a/utils/TableGen/DAGISelEmitter.h
+++ b/utils/TableGen/DAGISelEmitter.h
@@ -394,16 +394,19 @@
 /// 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