1da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===- DAGISelMatcher.h - Representation of DAG pattern matcher -----------===//
2da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
3da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//                     The LLVM Compiler Infrastructure
4da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
5da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// This file is distributed under the University of Illinois Open Source
6da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner// License. See LICENSE.TXT for details.
7da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//
8da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner//===----------------------------------------------------------------------===//
9da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
10da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#ifndef TBLGEN_DAGISELMATCHER_H
11da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#define TBLGEN_DAGISELMATCHER_H
12da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
13050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner#include "llvm/CodeGen/ValueTypes.h"
14da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/ADT/OwningPtr.h"
15da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#include "llvm/ADT/StringRef.h"
168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner#include "llvm/ADT/SmallVector.h"
17050a03d0f31ee7033d0459dae3c95b8bf12bff89Chris Lattner#include "llvm/Support/Casting.h"
18da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
19da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnernamespace llvm {
204a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach  struct CodeGenRegister;
21da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  class CodeGenDAGPatterns;
22b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  class Matcher;
23da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  class PatternToMatch;
24da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  class raw_ostream;
25da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  class ComplexPattern;
26845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  class Record;
27a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  class SDNodeInfo;
28543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  class TreePredicateFn;
29543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  class TreePattern;
30da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
31fa342faef9d1c89de356ed83a6c6529ed3e87610Chris LattnerMatcher *ConvertPatternToMatcher(const PatternToMatch &Pattern,unsigned Variant,
32b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner                                 const CodeGenDAGPatterns &CGP);
33c78f2a39945339752a163949a2d7c27f28635d99Chris LattnerMatcher *OptimizeMatcher(Matcher *Matcher, const CodeGenDAGPatterns &CGP);
344d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid EmitMatcherTable(const Matcher *Matcher, const CodeGenDAGPatterns &CGP,
354a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach                      raw_ostream &OS);
36da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
37fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
38b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// Matcher - Base class for all the the DAG ISel Matcher representation
39da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// nodes.
40b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass Matcher {
41bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  // The next matcher node that is executed after this one.  Null if this is the
42bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  // last stage of a match.
43b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  OwningPtr<Matcher> Next;
442d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
45da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
46da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  enum KindTy {
478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    // Matcher state manipulation.
4860df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner    Scope,                // Push a checking scope.
498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    RecordNode,           // Record the current node.
5019b5a7590b784f19875b9880ea8838c393431656Chris Lattner    RecordChild,          // Record a child of the current node.
518e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    RecordMemRef,         // Record the memref in the current node.
528950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner    CaptureGlueInput,     // If the current node has an input glue, save it.
538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    MoveChild,            // Move current node to specified child.
548e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    MoveParent,           // Move current node to parent.
55fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
56845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    // Predicate checking.
578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckSame,            // Fail if not same as prev match.
58da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    CheckPatternPredicate,
598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckPredicate,       // Fail if node predicate fails.
608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckOpcode,          // Fail if not opcode.
61eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    SwitchOpcode,         // Dispatch based on opcode.
628e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckType,            // Fail if not correct type.
63cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    SwitchType,           // Dispatch based on type.
6423cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    CheckChildType,       // Fail if child has wrong type.
658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckInteger,         // Fail if wrong val.
668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckCondCode,        // Fail if not condcode.
67da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    CheckValueType,
68da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    CheckComplexPat,
69da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    CheckAndImm,
70e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner    CheckOrImm,
719a747f1305e76025df2323a03b805a284f2cde77Chris Lattner    CheckFoldableChainNode,
72fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
73845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    // Node creation/emisssion.
748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitInteger,          // Create a TargetConstant
758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitStringInteger,    // Create a TargetConstant from a string.
768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitRegister,         // Create a register.
778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitConvertToTarget,  // Convert a imm/fpimm to target imm/fpimm
788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitMergeInputChains, // Merge together a chains for an input.
798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitCopyToReg,        // Emit a copytoreg into a physreg.
808e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitNode,             // Create a DAG node
818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitNodeXForm,        // Run a SDNodeXForm
828950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner    MarkGlueResults,      // Indicate which interior nodes have glue results.
83e86097af5598e44727875f00e492d43c978239beChris Lattner    CompleteMatch,        // Finish a match and update the results.
849a21500edc485a2c383a03fba429943f031c1398Chris Lattner    MorphNodeTo           // Build a node, finish a match and update results.
85da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  };
86da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  const KindTy Kind;
878ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner
88da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerprotected:
89b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  Matcher(KindTy K) : Kind(K) {}
90da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
91b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  virtual ~Matcher() {}
92fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
93da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  KindTy getKind() const { return Kind; }
948ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner
95b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  Matcher *getNext() { return Next.get(); }
96b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  const Matcher *getNext() const { return Next.get(); }
97b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  void setNext(Matcher *C) { Next.reset(C); }
98b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  Matcher *takeNext() { return Next.take(); }
9919b5a7590b784f19875b9880ea8838c393431656Chris Lattner
100b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  OwningPtr<Matcher> &getNextPtr() { return Next; }
101fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
102b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *) { return true; }
103fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
10458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  bool isEqual(const Matcher *M) const {
10558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    if (getKind() != M->getKind()) return false;
10658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return isEqualImpl(M);
10758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
108fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
10958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  unsigned getHash() const {
110ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner    // Clear the high bit so we don't conflict with tombstones etc.
111ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner    return ((getHashImpl() << 4) ^ getKind()) & (~0U>>1);
11258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
113fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
114d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  /// isSafeToReorderWithPatternPredicate - Return true if it is safe to sink a
115d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  /// PatternPredicate node past this one.
116d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const {
117d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner    return false;
118d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  }
119fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
12048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// isSimplePredicateNode - Return true if this is a simple predicate that
12148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// operates on the node or its children without potential side effects or a
12248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// change of the current node.
12348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  bool isSimplePredicateNode() const {
12448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    switch (getKind()) {
12548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    default: return false;
12648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckSame:
12748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckPatternPredicate:
12848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckPredicate:
12948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckOpcode:
13048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckType:
13148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckChildType:
13248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckInteger:
13348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckCondCode:
13448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckValueType:
13548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckAndImm:
13648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckOrImm:
13748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    case CheckFoldableChainNode:
13848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner      return true;
13948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    }
14048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  }
141fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
14248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// isSimplePredicateOrRecordNode - Return true if this is a record node or
14348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// a simple predicate.
14448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  bool isSimplePredicateOrRecordNode() const {
14548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner    return isSimplePredicateNode() ||
14648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner           getKind() == RecordNode || getKind() == RecordChild;
14748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  }
148fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
14948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// unlinkNode - Unlink the specified node from this chain.  If Other == this,
15048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// we unlink the next pointer and return it.  Otherwise we unlink Other from
15148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// the list and return this.
15248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  Matcher *unlinkNode(Matcher *Other);
153fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
15448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// canMoveBefore - Return true if this matcher is the same as Other, or if
15548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// we can move this matcher past all of the nodes in-between Other and this
15648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// node.  Other must be equal to or before this.
15748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  bool canMoveBefore(const Matcher *Other) const;
158fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
15948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// canMoveBefore - Return true if it is safe to move the current matcher
16048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  /// across the specified one.
16148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  bool canMoveBeforeNode(const Matcher *Other) const;
162fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
16382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  /// isContradictory - Return true of these two matchers could never match on
16482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  /// the same node.
16582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  bool isContradictory(const Matcher *Other) const {
16682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // Since this predicate is reflexive, we canonicalize the ordering so that
16782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // we always match a node against nodes with kinds that are greater or equal
16882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // to them.  For example, we'll pass in a CheckType node as an argument to
16982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // the CheckOpcode method, not the other way around.
17082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    if (getKind() < Other->getKind())
17182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner      return isContradictoryImpl(Other);
17282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return Other->isContradictoryImpl(this);
17382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  }
174fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
175a5028a64634f995630e93390c5c23374a09a450fChris Lattner  void print(raw_ostream &OS, unsigned indent = 0) const;
17682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  void printOne(raw_ostream &OS) const;
177da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  void dump() const;
1788ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattnerprotected:
179a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const = 0;
18058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const = 0;
18158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const = 0;
18282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  virtual bool isContradictoryImpl(const Matcher *M) const { return false; }
183da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
184fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
185d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner/// ScopeMatcher - This attempts to match each of its children to find the first
186d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner/// one that successfully matches.  If one child fails, it tries the next child.
187d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner/// If none of the children match then this check fails.  It never has a 'next'.
188b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass ScopeMatcher : public Matcher {
189d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  SmallVector<Matcher*, 4> Children;
190da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
191d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  ScopeMatcher(Matcher *const *children, unsigned numchildren)
192d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    : Matcher(Scope), Children(children, children+numchildren) {
193da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
194d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  virtual ~ScopeMatcher();
195fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
196d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  unsigned getNumChildren() const { return Children.size(); }
197fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
198d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  Matcher *getChild(unsigned i) { return Children[i]; }
199d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  const Matcher *getChild(unsigned i) const { return Children[i]; }
200fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
201d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  void resetChild(unsigned i, Matcher *N) {
202d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    delete Children[i];
203d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    Children[i] = N;
204d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  }
205d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
206d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  Matcher *takeChild(unsigned i) {
207d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    Matcher *Res = Children[i];
208d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    Children[i] = 0;
209d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    return Res;
210d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  }
211fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
212ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner  void setNumChildren(unsigned NC) {
213ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner    if (NC < Children.size()) {
214ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner      // delete any children we're about to lose pointers to.
215ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner      for (unsigned i = NC, e = Children.size(); i != e; ++i)
216ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner        delete Children[i];
217ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner    }
218ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner    Children.resize(NC);
219ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner  }
220da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
221b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
22260df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner    return N->getKind() == Scope;
223da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
224fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
22558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
226a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
22758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return false; }
228d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  virtual unsigned getHashImpl() const { return 12312; }
229da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
230da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
231b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// RecordMatcher - Save the current node in the operand list.
232b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass RecordMatcher : public Matcher {
233c96087b3433582f1c2bdb4f0ad3dad7f0b350339Chris Lattner  /// WhatFor - This is a string indicating why we're recording this.  This
234c96087b3433582f1c2bdb4f0ad3dad7f0b350339Chris Lattner  /// should only be used for comment generation not anything semantic.
235c96087b3433582f1c2bdb4f0ad3dad7f0b350339Chris Lattner  std::string WhatFor;
236fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
2370cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  /// ResultNo - The slot number in the RecordedNodes vector that this will be,
2380cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  /// just printed as a comment.
2390cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  unsigned ResultNo;
240da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
2410cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  RecordMatcher(const std::string &whatfor, unsigned resultNo)
2420cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner    : Matcher(RecordNode), WhatFor(whatfor), ResultNo(resultNo) {}
243fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
244c642b84fb866c3a6f1e61d39d6eda89563267b53Chris Lattner  const std::string &getWhatFor() const { return WhatFor; }
2450cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  unsigned getResultNo() const { return ResultNo; }
246fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
247b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
248845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    return N->getKind() == RecordNode;
249da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
250fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
251d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
25258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
253a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
25458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return true; }
25558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return 0; }
256da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
257fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
258b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// RecordChildMatcher - Save a numbered child of the current node, or fail
25919b5a7590b784f19875b9880ea8838c393431656Chris Lattner/// the match if it doesn't exist.  This is logically equivalent to:
26019b5a7590b784f19875b9880ea8838c393431656Chris Lattner///    MoveChild N + RecordNode + MoveParent.
261b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass RecordChildMatcher : public Matcher {
26219b5a7590b784f19875b9880ea8838c393431656Chris Lattner  unsigned ChildNo;
263fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
26419b5a7590b784f19875b9880ea8838c393431656Chris Lattner  /// WhatFor - This is a string indicating why we're recording this.  This
26519b5a7590b784f19875b9880ea8838c393431656Chris Lattner  /// should only be used for comment generation not anything semantic.
26619b5a7590b784f19875b9880ea8838c393431656Chris Lattner  std::string WhatFor;
267fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
2680cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  /// ResultNo - The slot number in the RecordedNodes vector that this will be,
2690cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  /// just printed as a comment.
2700cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  unsigned ResultNo;
27119b5a7590b784f19875b9880ea8838c393431656Chris Lattnerpublic:
2720cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  RecordChildMatcher(unsigned childno, const std::string &whatfor,
2730cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner                     unsigned resultNo)
2740cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  : Matcher(RecordChild), ChildNo(childno), WhatFor(whatfor),
2750cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner    ResultNo(resultNo) {}
276fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
27719b5a7590b784f19875b9880ea8838c393431656Chris Lattner  unsigned getChildNo() const { return ChildNo; }
27819b5a7590b784f19875b9880ea8838c393431656Chris Lattner  const std::string &getWhatFor() const { return WhatFor; }
2790cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner  unsigned getResultNo() const { return ResultNo; }
2800cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner
281b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
28219b5a7590b784f19875b9880ea8838c393431656Chris Lattner    return N->getKind() == RecordChild;
28319b5a7590b784f19875b9880ea8838c393431656Chris Lattner  }
284fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
285d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
286d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
28758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
288a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
28958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
29058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<RecordChildMatcher>(M)->getChildNo() == getChildNo();
29158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
29258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return getChildNo(); }
29319b5a7590b784f19875b9880ea8838c393431656Chris Lattner};
294fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
295b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// RecordMemRefMatcher - Save the current node's memref.
296b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass RecordMemRefMatcher : public Matcher {
2978e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
298b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  RecordMemRefMatcher() : Matcher(RecordMemRef) {}
299fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
300b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
3018e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == RecordMemRef;
3028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
303fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
304d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
305d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
30658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
307a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
30858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return true; }
30958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return 0; }
3108e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
3118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
312fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
3138950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner/// CaptureGlueInputMatcher - If the current record has a glue input, record
3148e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// it so that it is used as an input to the generated code.
3158950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnerclass CaptureGlueInputMatcher : public Matcher {
3168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
3178950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  CaptureGlueInputMatcher() : Matcher(CaptureGlueInput) {}
318fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
319b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
3208950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner    return N->getKind() == CaptureGlueInput;
3218e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
322fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
323d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
324d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
32558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
326a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
32758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return true; }
32858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return 0; }
3298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
330fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
331b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// MoveChildMatcher - This tells the interpreter to move into the
332da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// specified child node.
333b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass MoveChildMatcher : public Matcher {
334da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned ChildNo;
335da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
336b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  MoveChildMatcher(unsigned childNo) : Matcher(MoveChild), ChildNo(childNo) {}
337fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
338da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned getChildNo() const { return ChildNo; }
339fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
340b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
341da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == MoveChild;
342da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
343fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
344d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
345d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
34658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
347a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
34858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
34958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<MoveChildMatcher>(M)->getChildNo() == getChildNo();
35058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
35158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return getChildNo(); }
352da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
353fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
354b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// MoveParentMatcher - This tells the interpreter to move to the parent
355da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// of the current node.
356b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass MoveParentMatcher : public Matcher {
357da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
358b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  MoveParentMatcher() : Matcher(MoveParent) {}
359fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
360b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
361da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == MoveParent;
362da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
363fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
364d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
365d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
36658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
367a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
36858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return true; }
36958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return 0; }
370da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
371da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
372b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckSameMatcher - This checks to see if this node is exactly the same
373da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// node as the specified match that was recorded with 'Record'.  This is used
374da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// when patterns have the same name in them, like '(mul GPR:$in, GPR:$in)'.
375b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckSameMatcher : public Matcher {
376da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned MatchNumber;
377da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
378b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckSameMatcher(unsigned matchnumber)
37958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    : Matcher(CheckSame), MatchNumber(matchnumber) {}
380fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
381da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned getMatchNumber() const { return MatchNumber; }
382fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
383b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
384da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckSame;
385da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
386fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
387d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
388d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
38958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
390a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
39158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
39258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckSameMatcher>(M)->getMatchNumber() == getMatchNumber();
39358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
39458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return getMatchNumber(); }
395da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
396fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
397b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckPatternPredicateMatcher - This checks the target-specific predicate
398da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// to see if the entire pattern is capable of matching.  This predicate does
399da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// not take a node as input.  This is used for subtarget feature checks etc.
400b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckPatternPredicateMatcher : public Matcher {
401da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  std::string Predicate;
402da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
403b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckPatternPredicateMatcher(StringRef predicate)
40458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    : Matcher(CheckPatternPredicate), Predicate(predicate) {}
405fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
406da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef getPredicate() const { return Predicate; }
407fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
408b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
409da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckPatternPredicate;
410da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
411fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
412d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
413d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
41458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
415a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
41658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
41758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckPatternPredicateMatcher>(M)->getPredicate() == Predicate;
41858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
41958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
420da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
421fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
422b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckPredicateMatcher - This checks the target-specific predicate to
423da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// see if the node is acceptable.
424b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckPredicateMatcher : public Matcher {
425543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  TreePattern *Pred;
426da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
427543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  CheckPredicateMatcher(const TreePredicateFn &pred);
428fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
429543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner  TreePredicateFn getPredicate() const;
430da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
431b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
432da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckPredicate;
433da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
434fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
435d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  // TODO: Ok?
436d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  //virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
437d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
43858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
439a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
44058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
441543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner    return cast<CheckPredicateMatcher>(M)->Pred == Pred;
44258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
44358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
444da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
445fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
446fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
447b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckOpcodeMatcher - This checks to see if the current node has the
448da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// specified opcode, if not it fails to match.
449b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckOpcodeMatcher : public Matcher {
450a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  const SDNodeInfo &Opcode;
451da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
452a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  CheckOpcodeMatcher(const SDNodeInfo &opcode)
453a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner    : Matcher(CheckOpcode), Opcode(opcode) {}
454fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
455a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  const SDNodeInfo &getOpcode() const { return Opcode; }
456fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
457b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
458da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckOpcode;
459da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
460fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
461d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
462d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
46358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
464a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
465eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  virtual bool isEqualImpl(const Matcher *M) const;
46658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
46782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  virtual bool isContradictoryImpl(const Matcher *M) const;
468da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
469eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
470eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner/// SwitchOpcodeMatcher - Switch based on the current node's opcode, dispatching
471eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner/// to one matcher per opcode.  If the opcode doesn't match any of the cases,
472eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner/// then the match fails.  This is semantically equivalent to a Scope node where
473eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner/// every child does a CheckOpcode, but is much faster.
474eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerclass SwitchOpcodeMatcher : public Matcher {
475eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  SmallVector<std::pair<const SDNodeInfo*, Matcher*>, 8> Cases;
476eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerpublic:
477eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  SwitchOpcodeMatcher(const std::pair<const SDNodeInfo*, Matcher*> *cases,
478eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner                      unsigned numcases)
479eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    : Matcher(SwitchOpcode), Cases(cases, cases+numcases) {}
480eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner
481eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  static inline bool classof(const Matcher *N) {
482eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner    return N->getKind() == SwitchOpcode;
483eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  }
484fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
485eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  unsigned getNumCases() const { return Cases.size(); }
486fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
487eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  const SDNodeInfo &getCaseOpcode(unsigned i) const { return *Cases[i].first; }
488eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  Matcher *getCaseMatcher(unsigned i) { return Cases[i].second; }
489eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  const Matcher *getCaseMatcher(unsigned i) const { return Cases[i].second; }
490fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
491eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerprivate:
492eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
493eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return false; }
494eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner  virtual unsigned getHashImpl() const { return 4123; }
495eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner};
496fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
497b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckTypeMatcher - This checks to see if the current node has the
498084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner/// specified type at the specified result, if not it fails to match.
499b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckTypeMatcher : public Matcher {
500da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  MVT::SimpleValueType Type;
501084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner  unsigned ResNo;
502da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
503084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner  CheckTypeMatcher(MVT::SimpleValueType type, unsigned resno)
504084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner    : Matcher(CheckType), Type(type), ResNo(resno) {}
505fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
506da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  MVT::SimpleValueType getType() const { return Type; }
507084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner  unsigned getResNo() const { return ResNo; }
508fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
509b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
510da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckType;
511da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
512fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
513d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
514d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
51558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
516a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
51758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
51838717f6ccfaa926ffa614f4232d744d4b50f5798Chris Lattner    return cast<CheckTypeMatcher>(M)->Type == Type;
51958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
52058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return Type; }
52182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  virtual bool isContradictoryImpl(const Matcher *M) const;
522da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
523fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
524cfe2eab7446dedc471592fe702fefef783383171Chris Lattner/// SwitchTypeMatcher - Switch based on the current node's type, dispatching
525cfe2eab7446dedc471592fe702fefef783383171Chris Lattner/// to one matcher per case.  If the type doesn't match any of the cases,
526cfe2eab7446dedc471592fe702fefef783383171Chris Lattner/// then the match fails.  This is semantically equivalent to a Scope node where
527cfe2eab7446dedc471592fe702fefef783383171Chris Lattner/// every child does a CheckType, but is much faster.
528cfe2eab7446dedc471592fe702fefef783383171Chris Lattnerclass SwitchTypeMatcher : public Matcher {
529cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  SmallVector<std::pair<MVT::SimpleValueType, Matcher*>, 8> Cases;
530cfe2eab7446dedc471592fe702fefef783383171Chris Lattnerpublic:
531cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  SwitchTypeMatcher(const std::pair<MVT::SimpleValueType, Matcher*> *cases,
532cfe2eab7446dedc471592fe702fefef783383171Chris Lattner                    unsigned numcases)
533cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  : Matcher(SwitchType), Cases(cases, cases+numcases) {}
534fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
535cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  static inline bool classof(const Matcher *N) {
536cfe2eab7446dedc471592fe702fefef783383171Chris Lattner    return N->getKind() == SwitchType;
537cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  }
538fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
539cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  unsigned getNumCases() const { return Cases.size(); }
540fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
541cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  MVT::SimpleValueType getCaseType(unsigned i) const { return Cases[i].first; }
542cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  Matcher *getCaseMatcher(unsigned i) { return Cases[i].second; }
543cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  const Matcher *getCaseMatcher(unsigned i) const { return Cases[i].second; }
544fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
545cfe2eab7446dedc471592fe702fefef783383171Chris Lattnerprivate:
546cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
547cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return false; }
548cfe2eab7446dedc471592fe702fefef783383171Chris Lattner  virtual unsigned getHashImpl() const { return 4123; }
549cfe2eab7446dedc471592fe702fefef783383171Chris Lattner};
550fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
551fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
552b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckChildTypeMatcher - This checks to see if a child node has the
55323cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner/// specified type, if not it fails to match.
554b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckChildTypeMatcher : public Matcher {
55523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  unsigned ChildNo;
55623cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  MVT::SimpleValueType Type;
55723cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattnerpublic:
558b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckChildTypeMatcher(unsigned childno, MVT::SimpleValueType type)
559b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckChildType), ChildNo(childno), Type(type) {}
560fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
56123cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  unsigned getChildNo() const { return ChildNo; }
56223cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  MVT::SimpleValueType getType() const { return Type; }
563fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
564b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
56523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    return N->getKind() == CheckChildType;
56623cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  }
567fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
568d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
569d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
57058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
571a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
57258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
57358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckChildTypeMatcher>(M)->ChildNo == ChildNo &&
57458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner           cast<CheckChildTypeMatcher>(M)->Type == Type;
57558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
57658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return (Type << 3) | ChildNo; }
57782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  virtual bool isContradictoryImpl(const Matcher *M) const;
57823cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner};
579fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
580da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
581b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckIntegerMatcher - This checks to see if the current node is a
582da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// ConstantSDNode with the specified integer value, if not it fails to match.
583b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckIntegerMatcher : public Matcher {
584da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t Value;
585da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
586b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckIntegerMatcher(int64_t value)
587b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckInteger), Value(value) {}
588fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
589da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t getValue() const { return Value; }
590fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
591b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
592da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckInteger;
593da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
594fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
595d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
596d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
59758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
598a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
59958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
60058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckIntegerMatcher>(M)->Value == Value;
60158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
60258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return Value; }
603247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner  virtual bool isContradictoryImpl(const Matcher *M) const;
604da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
605fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
606b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckCondCodeMatcher - This checks to see if the current node is a
607da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// CondCodeSDNode with the specified condition, if not it fails to match.
608b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckCondCodeMatcher : public Matcher {
609da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef CondCodeName;
610da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
611b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckCondCodeMatcher(StringRef condcodename)
612b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckCondCode), CondCodeName(condcodename) {}
613fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
614da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef getCondCodeName() const { return CondCodeName; }
615fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
616b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
617da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckCondCode;
618da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
619fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
620d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
621d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
62258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
623a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
62458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
62558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckCondCodeMatcher>(M)->CondCodeName == CondCodeName;
62658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
62758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
628da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
629fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
630b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckValueTypeMatcher - This checks to see if the current node is a
631da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// VTSDNode with the specified type, if not it fails to match.
632b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckValueTypeMatcher : public Matcher {
633da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef TypeName;
634da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
635b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckValueTypeMatcher(StringRef type_name)
636b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckValueType), TypeName(type_name) {}
637fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
638da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef getTypeName() const { return TypeName; }
639da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
640b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
641da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckValueType;
642da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
643fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
644d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
645d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
64658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
647a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
64858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
64958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckValueTypeMatcher>(M)->TypeName == TypeName;
65058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
65158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
65248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner  bool isContradictoryImpl(const Matcher *M) const;
653da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
654fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
655fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
656fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
657b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckComplexPatMatcher - This node runs the specified ComplexPattern on
658da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// the current node.
659b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckComplexPatMatcher : public Matcher {
660da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  const ComplexPattern &Pattern;
661fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
662fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach  /// MatchNumber - This is the recorded nodes slot that contains the node we
663fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach  /// want to match against.
66457bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner  unsigned MatchNumber;
665fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
66657bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner  /// Name - The name of the node we're matching, for comment emission.
66757bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner  std::string Name;
668fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
669d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner  /// FirstResult - This is the first slot in the RecordedNodes list that the
670d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner  /// result of the match populates.
671d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner  unsigned FirstResult;
672da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
67357bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner  CheckComplexPatMatcher(const ComplexPattern &pattern, unsigned matchnumber,
67457bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner                         const std::string &name, unsigned firstresult)
67557bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner    : Matcher(CheckComplexPat), Pattern(pattern), MatchNumber(matchnumber),
67657bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner      Name(name), FirstResult(firstresult) {}
677fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
678e609a513f3c072bba28412c681465332a2822d9aChris Lattner  const ComplexPattern &getPattern() const { return Pattern; }
67957bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner  unsigned getMatchNumber() const { return MatchNumber; }
680fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
68157bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner  const std::string getName() const { return Name; }
682d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner  unsigned getFirstResult() const { return FirstResult; }
683fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
684b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
685da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckComplexPat;
686da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
687fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
688d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  // Not safe to move a pattern predicate past a complex pattern.
689d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return false; }
690d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
69158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
692a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
69358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
69457bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner    return &cast<CheckComplexPatMatcher>(M)->Pattern == &Pattern &&
69557bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner           cast<CheckComplexPatMatcher>(M)->MatchNumber == MatchNumber;
69658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
69758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const {
69857bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner    return (unsigned)(intptr_t)&Pattern ^ MatchNumber;
69958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
700da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
701fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
702b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckAndImmMatcher - This checks to see if the current node is an 'and'
703da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// with something equivalent to the specified immediate.
704b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckAndImmMatcher : public Matcher {
705da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t Value;
706da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
707b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckAndImmMatcher(int64_t value)
708b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckAndImm), Value(value) {}
709fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
710da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t getValue() const { return Value; }
711fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
712b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
713da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckAndImm;
714da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
715fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
716d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
717d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
71858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
719a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
72058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
72158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckAndImmMatcher>(M)->Value == Value;
72258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
72358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return Value; }
724da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
725da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
726b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckOrImmMatcher - This checks to see if the current node is an 'and'
727da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// with something equivalent to the specified immediate.
728b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckOrImmMatcher : public Matcher {
729da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t Value;
730da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
731b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckOrImmMatcher(int64_t value)
732b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckOrImm), Value(value) {}
733fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
734da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t getValue() const { return Value; }
735da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
736b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
737da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckOrImm;
738da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
739fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
740d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
741d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
74258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
743a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
74458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
74558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckOrImmMatcher>(M)->Value == Value;
74658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
74758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return Value; }
748da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
749e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner
750b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckFoldableChainNodeMatcher - This checks to see if the current node
75121390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner/// (which defines a chain operand) is safe to fold into a larger pattern.
752b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckFoldableChainNodeMatcher : public Matcher {
753e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattnerpublic:
754b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckFoldableChainNodeMatcher()
755b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckFoldableChainNode) {}
756fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
757b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
75821390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner    return N->getKind() == CheckFoldableChainNode;
759e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner  }
760fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
761d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
762d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
76358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
764a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
76558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return true; }
76658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return 0; }
767e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner};
768e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner
769b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitIntegerMatcher - This creates a new TargetConstant.
770b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitIntegerMatcher : public Matcher {
771845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  int64_t Val;
772845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  MVT::SimpleValueType VT;
773845c04273461b2a10754a1455b02916a19ea72aaChris Lattnerpublic:
774b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitIntegerMatcher(int64_t val, MVT::SimpleValueType vt)
775b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitInteger), Val(val), VT(vt) {}
776fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
777906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner  int64_t getValue() const { return Val; }
778845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  MVT::SimpleValueType getVT() const { return VT; }
779fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
780b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
781845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    return N->getKind() == EmitInteger;
782845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  }
783fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
78458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
785a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
78658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
78758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitIntegerMatcher>(M)->Val == Val &&
78858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner           cast<EmitIntegerMatcher>(M)->VT == VT;
78958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
79058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return (Val << 4) | VT; }
791845c04273461b2a10754a1455b02916a19ea72aaChris Lattner};
7928e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
793b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitStringIntegerMatcher - A target constant whose value is represented
7948e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// by a string.
795b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitStringIntegerMatcher : public Matcher {
7968e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  std::string Val;
7978e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  MVT::SimpleValueType VT;
7988e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
799b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitStringIntegerMatcher(const std::string &val, MVT::SimpleValueType vt)
800b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitStringInteger), Val(val), VT(vt) {}
801fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
8028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  const std::string &getValue() const { return Val; }
8038e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  MVT::SimpleValueType getVT() const { return VT; }
804fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
805b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
8068e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitStringInteger;
8078e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
808fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
80958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
810a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
81158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
81258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitStringIntegerMatcher>(M)->Val == Val &&
81358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner           cast<EmitStringIntegerMatcher>(M)->VT == VT;
81458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
81558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
8168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
817fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
818b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitRegisterMatcher - This creates a new TargetConstant.
819b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitRegisterMatcher : public Matcher {
820845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  /// Reg - The def for the register that we're emitting.  If this is null, then
821845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  /// this is a reference to zero_reg.
8224a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach  const CodeGenRegister *Reg;
823845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  MVT::SimpleValueType VT;
824845c04273461b2a10754a1455b02916a19ea72aaChris Lattnerpublic:
8254a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach  EmitRegisterMatcher(const CodeGenRegister *reg, MVT::SimpleValueType vt)
826b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitRegister), Reg(reg), VT(vt) {}
827fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
8284a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach  const CodeGenRegister *getReg() const { return Reg; }
829845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  MVT::SimpleValueType getVT() const { return VT; }
830fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
831b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
832845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    return N->getKind() == EmitRegister;
833845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  }
834fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
83558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
836a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
83758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
83858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitRegisterMatcher>(M)->Reg == Reg &&
83958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner           cast<EmitRegisterMatcher>(M)->VT == VT;
84058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
84158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const {
84258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return ((unsigned)(intptr_t)Reg) << 4 | VT;
84358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
844845c04273461b2a10754a1455b02916a19ea72aaChris Lattner};
8458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
846b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitConvertToTargetMatcher - Emit an operation that reads a specified
8478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// recorded node and converts it from being a ISD::Constant to
8488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// ISD::TargetConstant, likewise for ConstantFP.
849b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitConvertToTargetMatcher : public Matcher {
8508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned Slot;
8518e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
852b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitConvertToTargetMatcher(unsigned slot)
853b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitConvertToTarget), Slot(slot) {}
854fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
8558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getSlot() const { return Slot; }
856fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
857b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
8588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitConvertToTarget;
8598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
860fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
86158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
862a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
86358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
86458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitConvertToTargetMatcher>(M)->Slot == Slot;
86558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
86658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return Slot; }
8678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
868fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
869b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitMergeInputChainsMatcher - Emit a node that merges a list of input
8708e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// chains together with a token factor.  The list of nodes are the nodes in the
8718e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// matched pattern that have chain input/outputs.  This node adds all input
8728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// chains of these nodes if they are not themselves a node in the pattern.
873b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitMergeInputChainsMatcher : public Matcher {
8748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  SmallVector<unsigned, 3> ChainNodes;
8758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
876b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitMergeInputChainsMatcher(const unsigned *nodes, unsigned NumNodes)
877b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitMergeInputChains), ChainNodes(nodes, nodes+NumNodes) {}
878fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
8798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNumNodes() const { return ChainNodes.size(); }
880fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
8818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNode(unsigned i) const {
8828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    assert(i < ChainNodes.size());
8838e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return ChainNodes[i];
884fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach  }
885fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
886b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
8878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitMergeInputChains;
8888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
889fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
89058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
891a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
89258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
89358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitMergeInputChainsMatcher>(M)->ChainNodes == ChainNodes;
89458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
89558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
8968e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
897fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
898b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitCopyToRegMatcher - Emit a CopyToReg node from a value to a physreg,
8998950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner/// pushing the chain and glue results.
9008e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner///
901b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitCopyToRegMatcher : public Matcher {
9028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned SrcSlot; // Value to copy into the physreg.
9038e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  Record *DestPhysReg;
9048e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
905b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitCopyToRegMatcher(unsigned srcSlot, Record *destPhysReg)
906b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitCopyToReg), SrcSlot(srcSlot), DestPhysReg(destPhysReg) {}
907fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
9088e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getSrcSlot() const { return SrcSlot; }
9098e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  Record *getDestPhysReg() const { return DestPhysReg; }
910fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
911b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
9128e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitCopyToReg;
9138e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
914fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
91558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
916a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
91758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
91858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitCopyToRegMatcher>(M)->SrcSlot == SrcSlot &&
919fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach           cast<EmitCopyToRegMatcher>(M)->DestPhysReg == DestPhysReg;
92058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
92158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const {
92258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return SrcSlot ^ ((unsigned)(intptr_t)DestPhysReg << 4);
92358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
9248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
925fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
926fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
927fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
928b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitNodeXFormMatcher - Emit an operation that runs an SDNodeXForm on a
9298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// recorded node and records the result.
930b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitNodeXFormMatcher : public Matcher {
9318e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned Slot;
9328e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  Record *NodeXForm;
9338e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
934b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitNodeXFormMatcher(unsigned slot, Record *nodeXForm)
935b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitNodeXForm), Slot(slot), NodeXForm(nodeXForm) {}
936fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
9378e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getSlot() const { return Slot; }
9388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  Record *getNodeXForm() const { return NodeXForm; }
939fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
940b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
9418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitNodeXForm;
9428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
943fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
94458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
945a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
94658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
94758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitNodeXFormMatcher>(M)->Slot == Slot &&
948fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach           cast<EmitNodeXFormMatcher>(M)->NodeXForm == NodeXForm;
94958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
95058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const {
95158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return Slot ^ ((unsigned)(intptr_t)NodeXForm << 4);
95258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
9538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
954fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
955e86097af5598e44727875f00e492d43c978239beChris Lattner/// EmitNodeMatcherCommon - Common class shared between EmitNode and
9569a21500edc485a2c383a03fba429943f031c1398Chris Lattner/// MorphNodeTo.
957e86097af5598e44727875f00e492d43c978239beChris Lattnerclass EmitNodeMatcherCommon : public Matcher {
9588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  std::string OpcodeName;
9598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  const SmallVector<MVT::SimpleValueType, 3> VTs;
9608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  const SmallVector<unsigned, 6> Operands;
961036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner  bool HasChain, HasInGlue, HasOutGlue, HasMemRefs;
962fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
9638e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  /// NumFixedArityOperands - If this is a fixed arity node, this is set to -1.
9648e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  /// If this is a varidic node, this is set to the number of fixed arity
9658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  /// operands in the root of the pattern.  The rest are appended to this node.
9668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  int NumFixedArityOperands;
9678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
968e86097af5598e44727875f00e492d43c978239beChris Lattner  EmitNodeMatcherCommon(const std::string &opcodeName,
969e86097af5598e44727875f00e492d43c978239beChris Lattner                        const MVT::SimpleValueType *vts, unsigned numvts,
970e86097af5598e44727875f00e492d43c978239beChris Lattner                        const unsigned *operands, unsigned numops,
9718950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner                        bool hasChain, bool hasInGlue, bool hasOutGlue,
972ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner                        bool hasmemrefs,
9739a21500edc485a2c383a03fba429943f031c1398Chris Lattner                        int numfixedarityoperands, bool isMorphNodeTo)
9749a21500edc485a2c383a03fba429943f031c1398Chris Lattner    : Matcher(isMorphNodeTo ? MorphNodeTo : EmitNode), OpcodeName(opcodeName),
9758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      VTs(vts, vts+numvts), Operands(operands, operands+numops),
976036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner      HasChain(hasChain), HasInGlue(hasInGlue), HasOutGlue(hasOutGlue),
977ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner      HasMemRefs(hasmemrefs), NumFixedArityOperands(numfixedarityoperands) {}
978fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
9798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  const std::string &getOpcodeName() const { return OpcodeName; }
980fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
9818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNumVTs() const { return VTs.size(); }
9828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  MVT::SimpleValueType getVT(unsigned i) const {
9838e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    assert(i < VTs.size());
9848e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return VTs[i];
9858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
986c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner
9878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNumOperands() const { return Operands.size(); }
9888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getOperand(unsigned i) const {
9898e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    assert(i < Operands.size());
9908e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return Operands[i];
991c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  }
992fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
993c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  const SmallVectorImpl<MVT::SimpleValueType> &getVTList() const { return VTs; }
994c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner  const SmallVectorImpl<unsigned> &getOperandList() const { return Operands; }
995c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner
996fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
9978e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  bool hasChain() const { return HasChain; }
998036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner  bool hasInFlag() const { return HasInGlue; }
999036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner  bool hasOutFlag() const { return HasOutGlue; }
10008e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  bool hasMemRefs() const { return HasMemRefs; }
10018e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  int getNumFixedArityOperands() const { return NumFixedArityOperands; }
1002fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
1003b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
10049a21500edc485a2c383a03fba429943f031c1398Chris Lattner    return N->getKind() == EmitNode || N->getKind() == MorphNodeTo;
10058e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
1006fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
100758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
1008a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
100958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const;
101058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
10118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
1012fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
1013e86097af5598e44727875f00e492d43c978239beChris Lattner/// EmitNodeMatcher - This signals a successful match and generates a node.
1014e86097af5598e44727875f00e492d43c978239beChris Lattnerclass EmitNodeMatcher : public EmitNodeMatcherCommon {
10152d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
10166281cda6737bcda0e924318ddcce28392001691eChris Lattner  unsigned FirstResultSlot;
1017e86097af5598e44727875f00e492d43c978239beChris Lattnerpublic:
1018e86097af5598e44727875f00e492d43c978239beChris Lattner  EmitNodeMatcher(const std::string &opcodeName,
1019e86097af5598e44727875f00e492d43c978239beChris Lattner                  const MVT::SimpleValueType *vts, unsigned numvts,
1020e86097af5598e44727875f00e492d43c978239beChris Lattner                  const unsigned *operands, unsigned numops,
1021ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner                  bool hasChain, bool hasInFlag, bool hasOutFlag,
1022ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner                  bool hasmemrefs,
10236281cda6737bcda0e924318ddcce28392001691eChris Lattner                  int numfixedarityoperands, unsigned firstresultslot)
1024e86097af5598e44727875f00e492d43c978239beChris Lattner  : EmitNodeMatcherCommon(opcodeName, vts, numvts, operands, numops, hasChain,
1025ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner                          hasInFlag, hasOutFlag, hasmemrefs,
1026ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner                          numfixedarityoperands, false),
10276281cda6737bcda0e924318ddcce28392001691eChris Lattner    FirstResultSlot(firstresultslot) {}
1028fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
10296281cda6737bcda0e924318ddcce28392001691eChris Lattner  unsigned getFirstResultSlot() const { return FirstResultSlot; }
1030fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
1031e86097af5598e44727875f00e492d43c978239beChris Lattner  static inline bool classof(const Matcher *N) {
1032e86097af5598e44727875f00e492d43c978239beChris Lattner    return N->getKind() == EmitNode;
1033e86097af5598e44727875f00e492d43c978239beChris Lattner  }
1034fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
1035e86097af5598e44727875f00e492d43c978239beChris Lattner};
1036fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
10379a21500edc485a2c383a03fba429943f031c1398Chris Lattnerclass MorphNodeToMatcher : public EmitNodeMatcherCommon {
10382d24e2a396a1d211baaeedf32148a3b657240170David Blaikie  virtual void anchor();
1039e86097af5598e44727875f00e492d43c978239beChris Lattner  const PatternToMatch &Pattern;
1040e86097af5598e44727875f00e492d43c978239beChris Lattnerpublic:
10419a21500edc485a2c383a03fba429943f031c1398Chris Lattner  MorphNodeToMatcher(const std::string &opcodeName,
10429a21500edc485a2c383a03fba429943f031c1398Chris Lattner                     const MVT::SimpleValueType *vts, unsigned numvts,
10439a21500edc485a2c383a03fba429943f031c1398Chris Lattner                     const unsigned *operands, unsigned numops,
1044ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner                     bool hasChain, bool hasInFlag, bool hasOutFlag,
1045ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner                     bool hasmemrefs,
10469a21500edc485a2c383a03fba429943f031c1398Chris Lattner                     int numfixedarityoperands, const PatternToMatch &pattern)
1047e86097af5598e44727875f00e492d43c978239beChris Lattner    : EmitNodeMatcherCommon(opcodeName, vts, numvts, operands, numops, hasChain,
1048ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner                            hasInFlag, hasOutFlag, hasmemrefs,
1049ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner                            numfixedarityoperands, true),
1050e86097af5598e44727875f00e492d43c978239beChris Lattner      Pattern(pattern) {
1051e86097af5598e44727875f00e492d43c978239beChris Lattner  }
1052fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
1053e86097af5598e44727875f00e492d43c978239beChris Lattner  const PatternToMatch &getPattern() const { return Pattern; }
1054e86097af5598e44727875f00e492d43c978239beChris Lattner
1055e86097af5598e44727875f00e492d43c978239beChris Lattner  static inline bool classof(const Matcher *N) {
10569a21500edc485a2c383a03fba429943f031c1398Chris Lattner    return N->getKind() == MorphNodeTo;
1057e86097af5598e44727875f00e492d43c978239beChris Lattner  }
1058e86097af5598e44727875f00e492d43c978239beChris Lattner};
1059fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
10608950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner/// MarkGlueResultsMatcher - This node indicates which non-root nodes in the
10618950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner/// pattern produce glue.  This allows CompleteMatchMatcher to update them
10628950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner/// with the output glue of the resultant code.
10638950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnerclass MarkGlueResultsMatcher : public Matcher {
10648950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  SmallVector<unsigned, 3> GlueResultNodes;
106502f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattnerpublic:
10668950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  MarkGlueResultsMatcher(const unsigned *nodes, unsigned NumNodes)
10678950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner    : Matcher(MarkGlueResults), GlueResultNodes(nodes, nodes+NumNodes) {}
1068fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
10698950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner  unsigned getNumNodes() const { return GlueResultNodes.size(); }
1070fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
107102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  unsigned getNode(unsigned i) const {
10728950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner    assert(i < GlueResultNodes.size());
10738950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner    return GlueResultNodes[i];
1074fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach  }
1075fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
1076b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
10778950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner    return N->getKind() == MarkGlueResults;
107802f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  }
1079fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
108058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
1081a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
108258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
10838950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner    return cast<MarkGlueResultsMatcher>(M)->GlueResultNodes == GlueResultNodes;
108458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
108558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
108602f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner};
108702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
1088b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CompleteMatchMatcher - Complete a match by replacing the results of the
108977f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner/// pattern with the newly generated nodes.  This also prints a comment
109077f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner/// indicating the source and dest patterns.
1091b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CompleteMatchMatcher : public Matcher {
109277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  SmallVector<unsigned, 2> Results;
1093845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  const PatternToMatch &Pattern;
1094845c04273461b2a10754a1455b02916a19ea72aaChris Lattnerpublic:
1095b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CompleteMatchMatcher(const unsigned *results, unsigned numresults,
1096c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner                       const PatternToMatch &pattern)
1097b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  : Matcher(CompleteMatch), Results(results, results+numresults),
109877f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    Pattern(pattern) {}
109977f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner
110077f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  unsigned getNumResults() const { return Results.size(); }
110177f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  unsigned getResult(unsigned R) const { return Results[R]; }
1102845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  const PatternToMatch &getPattern() const { return Pattern; }
1103fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
1104b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
110577f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    return N->getKind() == CompleteMatch;
1106845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  }
1107fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
110858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
1109a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
111058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
111158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CompleteMatchMatcher>(M)->Results == Results &&
111258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner          &cast<CompleteMatchMatcher>(M)->Pattern == &Pattern;
111358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
111458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
1115845c04273461b2a10754a1455b02916a19ea72aaChris Lattner};
1116fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach
1117da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} // end namespace llvm
1118da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
1119da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#endif
1120