DAGISelMatcher.h revision a230f9623d864450d432bb76c397b0cb35a3437e
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 {
20da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  class CodeGenDAGPatterns;
21b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  class Matcher;
22da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  class PatternToMatch;
23da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  class raw_ostream;
24da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  class ComplexPattern;
25845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  class Record;
26a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  class SDNodeInfo;
27da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
28b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris LattnerMatcher *ConvertPatternToMatcher(const PatternToMatch &Pattern,
29b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner                                 const CodeGenDAGPatterns &CGP);
30b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris LattnerMatcher *OptimizeMatcher(Matcher *Matcher);
31b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnervoid EmitMatcherTable(const Matcher *Matcher, raw_ostream &OS);
32da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
33da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
34b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// Matcher - Base class for all the the DAG ISel Matcher representation
35da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// nodes.
36b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass Matcher {
37bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  // The next matcher node that is executed after this one.  Null if this is the
38bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner  // last stage of a match.
39b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  OwningPtr<Matcher> Next;
40da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
41da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  enum KindTy {
428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    // Matcher state manipulation.
4360df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner    Scope,                // Push a checking scope.
448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    RecordNode,           // Record the current node.
4519b5a7590b784f19875b9880ea8838c393431656Chris Lattner    RecordChild,          // Record a child of the current node.
468e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    RecordMemRef,         // Record the memref in the current node.
478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CaptureFlagInput,     // If the current node has an input flag, save it.
488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    MoveChild,            // Move current node to specified child.
498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    MoveParent,           // Move current node to parent.
50da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
51845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    // Predicate checking.
528e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckSame,            // Fail if not same as prev match.
53da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    CheckPatternPredicate,
548e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckPredicate,       // Fail if node predicate fails.
558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckOpcode,          // Fail if not opcode.
5612a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner    CheckMultiOpcode,     // Fail if not in opcode list.
578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckType,            // Fail if not correct type.
5823cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    CheckChildType,       // Fail if child has wrong type.
598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckInteger,         // Fail if wrong val.
608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    CheckCondCode,        // Fail if not condcode.
61da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    CheckValueType,
62da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    CheckComplexPat,
63da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    CheckAndImm,
64e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner    CheckOrImm,
659a747f1305e76025df2323a03b805a284f2cde77Chris Lattner    CheckFoldableChainNode,
66845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    CheckChainCompatible,
67845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
68845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    // Node creation/emisssion.
698e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitInteger,          // Create a TargetConstant
708e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitStringInteger,    // Create a TargetConstant from a string.
718e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitRegister,         // Create a register.
728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitConvertToTarget,  // Convert a imm/fpimm to target imm/fpimm
738e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitMergeInputChains, // Merge together a chains for an input.
748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitCopyToReg,        // Emit a copytoreg into a physreg.
758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitNode,             // Create a DAG node
768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    EmitNodeXForm,        // Run a SDNodeXForm
7702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    MarkFlagResults,      // Indicate which interior nodes have flag results.
7877f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    CompleteMatch         // Finish a match and update the results.
79da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  };
80da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  const KindTy Kind;
818ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner
82da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerprotected:
83b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  Matcher(KindTy K) : Kind(K) {}
84da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
85b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  virtual ~Matcher() {}
86da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
87da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  KindTy getKind() const { return Kind; }
888ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner
89b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  Matcher *getNext() { return Next.get(); }
90b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  const Matcher *getNext() const { return Next.get(); }
91b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  void setNext(Matcher *C) { Next.reset(C); }
92b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  Matcher *takeNext() { return Next.take(); }
9319b5a7590b784f19875b9880ea8838c393431656Chris Lattner
94b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  OwningPtr<Matcher> &getNextPtr() { return Next; }
95da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
96b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *) { return true; }
97da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
9858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  bool isEqual(const Matcher *M) const {
9958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    if (getKind() != M->getKind()) return false;
10058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return isEqualImpl(M);
10158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
10258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
10358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  unsigned getHash() const {
104ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner    // Clear the high bit so we don't conflict with tombstones etc.
105ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner    return ((getHashImpl() << 4) ^ getKind()) & (~0U>>1);
10658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
10758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner
108d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  /// isSafeToReorderWithPatternPredicate - Return true if it is safe to sink a
109d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  /// PatternPredicate node past this one.
110d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const {
111d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner    return false;
112d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  }
113d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
11482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  /// isContradictory - Return true of these two matchers could never match on
11582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  /// the same node.
11682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  bool isContradictory(const Matcher *Other) const {
11782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // Since this predicate is reflexive, we canonicalize the ordering so that
11882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // we always match a node against nodes with kinds that are greater or equal
11982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // to them.  For example, we'll pass in a CheckType node as an argument to
12082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    // the CheckOpcode method, not the other way around.
12182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    if (getKind() < Other->getKind())
12282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner      return isContradictoryImpl(Other);
12382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner    return Other->isContradictoryImpl(this);
12482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  }
12582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner
126a5028a64634f995630e93390c5c23374a09a450fChris Lattner  void print(raw_ostream &OS, unsigned indent = 0) const;
12782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  void printOne(raw_ostream &OS) const;
128da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  void dump() const;
1298ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattnerprotected:
130a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const = 0;
13158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const = 0;
13258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const = 0;
13382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  virtual bool isContradictoryImpl(const Matcher *M) const { return false; }
134da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
135da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
136d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner/// ScopeMatcher - This attempts to match each of its children to find the first
137d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner/// one that successfully matches.  If one child fails, it tries the next child.
138d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner/// If none of the children match then this check fails.  It never has a 'next'.
139b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass ScopeMatcher : public Matcher {
140d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  SmallVector<Matcher*, 4> Children;
141da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
142d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  ScopeMatcher(Matcher *const *children, unsigned numchildren)
143d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    : Matcher(Scope), Children(children, children+numchildren) {
144da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
145d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  virtual ~ScopeMatcher();
146da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
147d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  unsigned getNumChildren() const { return Children.size(); }
148d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
149d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  Matcher *getChild(unsigned i) { return Children[i]; }
150d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  const Matcher *getChild(unsigned i) const { return Children[i]; }
151d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
152d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  void resetChild(unsigned i, Matcher *N) {
153d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    delete Children[i];
154d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    Children[i] = N;
155d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  }
156d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner
157d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  Matcher *takeChild(unsigned i) {
158d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    Matcher *Res = Children[i];
159d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    Children[i] = 0;
160d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner    return Res;
161d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  }
162ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner
163ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner  void setNumChildren(unsigned NC) {
164ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner    if (NC < Children.size()) {
165ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner      // delete any children we're about to lose pointers to.
166ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner      for (unsigned i = NC, e = Children.size(); i != e; ++i)
167ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner        delete Children[i];
168ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner    }
169ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner    Children.resize(NC);
170ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner  }
171da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
172b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
17360df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner    return N->getKind() == Scope;
174da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
175da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
17658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
177a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
17858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return false; }
179d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner  virtual unsigned getHashImpl() const { return 12312; }
180da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
181da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
182b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// RecordMatcher - Save the current node in the operand list.
183b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass RecordMatcher : public Matcher {
184c96087b3433582f1c2bdb4f0ad3dad7f0b350339Chris Lattner  /// WhatFor - This is a string indicating why we're recording this.  This
185c96087b3433582f1c2bdb4f0ad3dad7f0b350339Chris Lattner  /// should only be used for comment generation not anything semantic.
186c96087b3433582f1c2bdb4f0ad3dad7f0b350339Chris Lattner  std::string WhatFor;
187da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
188b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  RecordMatcher(const std::string &whatfor)
189b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(RecordNode), WhatFor(whatfor) {}
190c96087b3433582f1c2bdb4f0ad3dad7f0b350339Chris Lattner
191c642b84fb866c3a6f1e61d39d6eda89563267b53Chris Lattner  const std::string &getWhatFor() const { return WhatFor; }
192da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
193b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
194845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    return N->getKind() == RecordNode;
195da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
196da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
197d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
19858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
199a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
20058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return true; }
20158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return 0; }
202da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
203da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
204b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// RecordChildMatcher - Save a numbered child of the current node, or fail
20519b5a7590b784f19875b9880ea8838c393431656Chris Lattner/// the match if it doesn't exist.  This is logically equivalent to:
20619b5a7590b784f19875b9880ea8838c393431656Chris Lattner///    MoveChild N + RecordNode + MoveParent.
207b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass RecordChildMatcher : public Matcher {
20819b5a7590b784f19875b9880ea8838c393431656Chris Lattner  unsigned ChildNo;
20919b5a7590b784f19875b9880ea8838c393431656Chris Lattner
21019b5a7590b784f19875b9880ea8838c393431656Chris Lattner  /// WhatFor - This is a string indicating why we're recording this.  This
21119b5a7590b784f19875b9880ea8838c393431656Chris Lattner  /// should only be used for comment generation not anything semantic.
21219b5a7590b784f19875b9880ea8838c393431656Chris Lattner  std::string WhatFor;
21319b5a7590b784f19875b9880ea8838c393431656Chris Lattnerpublic:
214b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  RecordChildMatcher(unsigned childno, const std::string &whatfor)
215b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  : Matcher(RecordChild), ChildNo(childno), WhatFor(whatfor) {}
21619b5a7590b784f19875b9880ea8838c393431656Chris Lattner
21719b5a7590b784f19875b9880ea8838c393431656Chris Lattner  unsigned getChildNo() const { return ChildNo; }
21819b5a7590b784f19875b9880ea8838c393431656Chris Lattner  const std::string &getWhatFor() const { return WhatFor; }
21919b5a7590b784f19875b9880ea8838c393431656Chris Lattner
220b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
22119b5a7590b784f19875b9880ea8838c393431656Chris Lattner    return N->getKind() == RecordChild;
22219b5a7590b784f19875b9880ea8838c393431656Chris Lattner  }
22319b5a7590b784f19875b9880ea8838c393431656Chris Lattner
224d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
225d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
22658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
227a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
22858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
22958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<RecordChildMatcher>(M)->getChildNo() == getChildNo();
23058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
23158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return getChildNo(); }
23219b5a7590b784f19875b9880ea8838c393431656Chris Lattner};
23319b5a7590b784f19875b9880ea8838c393431656Chris Lattner
234b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// RecordMemRefMatcher - Save the current node's memref.
235b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass RecordMemRefMatcher : public Matcher {
2368e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
237b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  RecordMemRefMatcher() : Matcher(RecordMemRef) {}
2388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
239b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
2408e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == RecordMemRef;
2418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
2428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
243d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
244d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
24558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
246a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
24758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return true; }
24858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return 0; }
2498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
2508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
2518e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
252b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CaptureFlagInputMatcher - If the current record has a flag input, record
2538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// it so that it is used as an input to the generated code.
254b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CaptureFlagInputMatcher : public Matcher {
2558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
256b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CaptureFlagInputMatcher() : Matcher(CaptureFlagInput) {}
2578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
258b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
2598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == CaptureFlagInput;
2608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
2618e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
262d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
263d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
26458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
265a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
26658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return true; }
26758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return 0; }
2688e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
2698e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
270b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// MoveChildMatcher - This tells the interpreter to move into the
271da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// specified child node.
272b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass MoveChildMatcher : public Matcher {
273da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned ChildNo;
274da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
275b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  MoveChildMatcher(unsigned childNo) : Matcher(MoveChild), ChildNo(childNo) {}
276da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
277da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned getChildNo() const { return ChildNo; }
278da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
279b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
280da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == MoveChild;
281da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
282da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
283d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
284d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
28558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
286a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
28758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
28858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<MoveChildMatcher>(M)->getChildNo() == getChildNo();
28958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
29058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return getChildNo(); }
291da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
292da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
293b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// MoveParentMatcher - This tells the interpreter to move to the parent
294da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// of the current node.
295b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass MoveParentMatcher : public Matcher {
296da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
297b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  MoveParentMatcher() : Matcher(MoveParent) {}
298da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
299b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
300da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == MoveParent;
301da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
302da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
303d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
304d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
30558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
306a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
30758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return true; }
30858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return 0; }
309da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
310da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
311b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckSameMatcher - This checks to see if this node is exactly the same
312da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// node as the specified match that was recorded with 'Record'.  This is used
313da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// when patterns have the same name in them, like '(mul GPR:$in, GPR:$in)'.
314b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckSameMatcher : public Matcher {
315da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned MatchNumber;
316da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
317b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckSameMatcher(unsigned matchnumber)
31858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    : Matcher(CheckSame), MatchNumber(matchnumber) {}
319da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
320da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  unsigned getMatchNumber() const { return MatchNumber; }
321da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
322b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
323da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckSame;
324da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
325da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
326d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
327d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
32858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
329a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
33058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
33158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckSameMatcher>(M)->getMatchNumber() == getMatchNumber();
33258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
33358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return getMatchNumber(); }
334da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
335da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
336b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckPatternPredicateMatcher - This checks the target-specific predicate
337da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// to see if the entire pattern is capable of matching.  This predicate does
338da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// not take a node as input.  This is used for subtarget feature checks etc.
339b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckPatternPredicateMatcher : public Matcher {
340da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  std::string Predicate;
341da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
342b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckPatternPredicateMatcher(StringRef predicate)
34358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    : Matcher(CheckPatternPredicate), Predicate(predicate) {}
344da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
345da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef getPredicate() const { return Predicate; }
346da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
347b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
348da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckPatternPredicate;
349da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
350da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
351d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
352d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
35358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
354a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
35558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
35658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckPatternPredicateMatcher>(M)->getPredicate() == Predicate;
35758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
35858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
359da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
360da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
361b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckPredicateMatcher - This checks the target-specific predicate to
362da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// see if the node is acceptable.
363b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckPredicateMatcher : public Matcher {
364da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef PredName;
365da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
366b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckPredicateMatcher(StringRef predname)
367b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckPredicate), PredName(predname) {}
368da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
369da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef getPredicateName() const { return PredName; }
370da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
371b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
372da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckPredicate;
373da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
374da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
375d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  // TODO: Ok?
376d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  //virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
377d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
37858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
379a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
38058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
38158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckPredicateMatcher>(M)->PredName == PredName;
38258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
38358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
384da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
385da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
386da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
387b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckOpcodeMatcher - This checks to see if the current node has the
388da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// specified opcode, if not it fails to match.
389b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckOpcodeMatcher : public Matcher {
390a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  const SDNodeInfo &Opcode;
391da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
392a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  CheckOpcodeMatcher(const SDNodeInfo &opcode)
393a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner    : Matcher(CheckOpcode), Opcode(opcode) {}
394da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
395a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  const SDNodeInfo &getOpcode() const { return Opcode; }
396da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
397b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
398da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckOpcode;
399da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
400da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
401d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
402d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
40358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
404a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
40558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
406a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner    return &cast<CheckOpcodeMatcher>(M)->Opcode == &Opcode;
40758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
40858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
40982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  virtual bool isContradictoryImpl(const Matcher *M) const;
410da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
411da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
412b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckMultiOpcodeMatcher - This checks to see if the current node has one
41312a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner/// of the specified opcode, if not it fails to match.
414b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckMultiOpcodeMatcher : public Matcher {
415a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  SmallVector<const SDNodeInfo*, 4> Opcodes;
41612a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattnerpublic:
417a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  CheckMultiOpcodeMatcher(const SDNodeInfo * const *opcodes, unsigned numops)
418a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner    : Matcher(CheckMultiOpcode), Opcodes(opcodes, opcodes+numops) {}
41912a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner
420a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  unsigned getNumOpcodes() const { return Opcodes.size(); }
421a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner  const SDNodeInfo &getOpcode(unsigned i) const { return *Opcodes[i]; }
42212a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner
423b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
42412a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner    return N->getKind() == CheckMultiOpcode;
42512a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner  }
42612a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner
427d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
428d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
42958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
430a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
43158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
432a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner    return cast<CheckMultiOpcodeMatcher>(M)->Opcodes == Opcodes;
43358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
43458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
43512a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner};
43612a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner
43712a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner
43812a667c1e8fa57a13ae751164b6dd4412a62dc5dChris Lattner
439b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckTypeMatcher - This checks to see if the current node has the
440da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// specified type, if not it fails to match.
441b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckTypeMatcher : public Matcher {
442da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  MVT::SimpleValueType Type;
443da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
444b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckTypeMatcher(MVT::SimpleValueType type)
445b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckType), Type(type) {}
446da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
447da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  MVT::SimpleValueType getType() const { return Type; }
448da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
449b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
450da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckType;
451da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
452da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
453d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
454d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
45558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
456a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
45758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
45838717f6ccfaa926ffa614f4232d744d4b50f5798Chris Lattner    return cast<CheckTypeMatcher>(M)->Type == Type;
45958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
46058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return Type; }
46182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  virtual bool isContradictoryImpl(const Matcher *M) const;
462da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
46323cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
464b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckChildTypeMatcher - This checks to see if a child node has the
46523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner/// specified type, if not it fails to match.
466b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckChildTypeMatcher : public Matcher {
46723cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  unsigned ChildNo;
46823cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  MVT::SimpleValueType Type;
46923cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattnerpublic:
470b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckChildTypeMatcher(unsigned childno, MVT::SimpleValueType type)
471b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckChildType), ChildNo(childno), Type(type) {}
47223cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
47323cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  unsigned getChildNo() const { return ChildNo; }
47423cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  MVT::SimpleValueType getType() const { return Type; }
47523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
476b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
47723cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner    return N->getKind() == CheckChildType;
47823cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner  }
47923cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
480d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
481d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
48258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
483a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
48458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
48558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckChildTypeMatcher>(M)->ChildNo == ChildNo &&
48658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner           cast<CheckChildTypeMatcher>(M)->Type == Type;
48758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
48858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return (Type << 3) | ChildNo; }
48982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner  virtual bool isContradictoryImpl(const Matcher *M) const;
49023cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner};
49123cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner
492da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
493b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckIntegerMatcher - This checks to see if the current node is a
494da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// ConstantSDNode with the specified integer value, if not it fails to match.
495b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckIntegerMatcher : public Matcher {
496da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t Value;
497da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
498b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckIntegerMatcher(int64_t value)
499b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckInteger), Value(value) {}
500da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
501da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t getValue() const { return Value; }
502da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
503b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
504da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckInteger;
505da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
506da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
507d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
508d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
50958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
510a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
51158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
51258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckIntegerMatcher>(M)->Value == Value;
51358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
51458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return Value; }
515247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner  virtual bool isContradictoryImpl(const Matcher *M) const;
516da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
517da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
518b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckCondCodeMatcher - This checks to see if the current node is a
519da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// CondCodeSDNode with the specified condition, if not it fails to match.
520b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckCondCodeMatcher : public Matcher {
521da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef CondCodeName;
522da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
523b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckCondCodeMatcher(StringRef condcodename)
524b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckCondCode), CondCodeName(condcodename) {}
525da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
526da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef getCondCodeName() const { return CondCodeName; }
527da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
528b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
529da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckCondCode;
530da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
531da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
532d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
533d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
53458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
535a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
53658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
53758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckCondCodeMatcher>(M)->CondCodeName == CondCodeName;
53858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
53958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
540da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
541da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
542b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckValueTypeMatcher - This checks to see if the current node is a
543da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// VTSDNode with the specified type, if not it fails to match.
544b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckValueTypeMatcher : public Matcher {
545da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef TypeName;
546da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
547b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckValueTypeMatcher(StringRef type_name)
548b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckValueType), TypeName(type_name) {}
549da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
550da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  StringRef getTypeName() const { return TypeName; }
551da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
552b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
553da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckValueType;
554da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
555da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
556d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
557d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
55858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
559a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
56058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
56158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckValueTypeMatcher>(M)->TypeName == TypeName;
56258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
56358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
564da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
565da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
566da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
567da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
568b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckComplexPatMatcher - This node runs the specified ComplexPattern on
569da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// the current node.
570b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckComplexPatMatcher : public Matcher {
571da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  const ComplexPattern &Pattern;
572da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
573b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckComplexPatMatcher(const ComplexPattern &pattern)
574b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckComplexPat), Pattern(pattern) {}
575da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
576e609a513f3c072bba28412c681465332a2822d9aChris Lattner  const ComplexPattern &getPattern() const { return Pattern; }
577e609a513f3c072bba28412c681465332a2822d9aChris Lattner
578b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
579da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckComplexPat;
580da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
581da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
582d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  // Not safe to move a pattern predicate past a complex pattern.
583d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return false; }
584d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
58558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
586a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
58758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
58858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return &cast<CheckComplexPatMatcher>(M)->Pattern == &Pattern;
58958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
59058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const {
59158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return (unsigned)(intptr_t)&Pattern;
59258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
593da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
594da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
595b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckAndImmMatcher - This checks to see if the current node is an 'and'
596da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// with something equivalent to the specified immediate.
597b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckAndImmMatcher : public Matcher {
598da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t Value;
599da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
600b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckAndImmMatcher(int64_t value)
601b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckAndImm), Value(value) {}
602da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
603da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t getValue() const { return Value; }
604da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
605b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
606da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckAndImm;
607da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
608da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
609d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
610d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
61158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
612a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
61358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
61458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckAndImmMatcher>(M)->Value == Value;
61558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
61658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return Value; }
617da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
618da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
619b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckOrImmMatcher - This checks to see if the current node is an 'and'
620da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// with something equivalent to the specified immediate.
621b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckOrImmMatcher : public Matcher {
622da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t Value;
623da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic:
624b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckOrImmMatcher(int64_t value)
625b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckOrImm), Value(value) {}
626da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
627da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  int64_t getValue() const { return Value; }
628da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
629b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
630da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner    return N->getKind() == CheckOrImm;
631da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner  }
632da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
633d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
634d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
63558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
636a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
63758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
63858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CheckOrImmMatcher>(M)->Value == Value;
63958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
64058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return Value; }
641da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner};
642e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner
643b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckFoldableChainNodeMatcher - This checks to see if the current node
64421390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner/// (which defines a chain operand) is safe to fold into a larger pattern.
645b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckFoldableChainNodeMatcher : public Matcher {
646e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattnerpublic:
647b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckFoldableChainNodeMatcher()
648b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckFoldableChainNode) {}
649e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner
650b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
65121390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner    return N->getKind() == CheckFoldableChainNode;
652e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner  }
653e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner
654d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
655d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
65658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
657a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
65858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const { return true; }
65958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return 0; }
660e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner};
661e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner
662b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckChainCompatibleMatcher - Verify that the current node's chain
6639a747f1305e76025df2323a03b805a284f2cde77Chris Lattner/// operand is 'compatible' with the specified recorded node's.
664b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckChainCompatibleMatcher : public Matcher {
6659a747f1305e76025df2323a03b805a284f2cde77Chris Lattner  unsigned PreviousOp;
6669a747f1305e76025df2323a03b805a284f2cde77Chris Lattnerpublic:
667b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CheckChainCompatibleMatcher(unsigned previousop)
668b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(CheckChainCompatible), PreviousOp(previousop) {}
6699a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
6709a747f1305e76025df2323a03b805a284f2cde77Chris Lattner  unsigned getPreviousOp() const { return PreviousOp; }
6719a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
672b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
6739a747f1305e76025df2323a03b805a284f2cde77Chris Lattner    return N->getKind() == CheckChainCompatible;
6749a747f1305e76025df2323a03b805a284f2cde77Chris Lattner  }
6759a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
676d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
677d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner
67858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
679a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
68058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
681bb08d89298630834c41c40841ee3df5d3f830ce2Chris Lattner    return cast<CheckChainCompatibleMatcher>(M)->PreviousOp == PreviousOp;
68258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
68358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return PreviousOp; }
6849a747f1305e76025df2323a03b805a284f2cde77Chris Lattner};
6859a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
686b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitIntegerMatcher - This creates a new TargetConstant.
687b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitIntegerMatcher : public Matcher {
688845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  int64_t Val;
689845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  MVT::SimpleValueType VT;
690845c04273461b2a10754a1455b02916a19ea72aaChris Lattnerpublic:
691b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitIntegerMatcher(int64_t val, MVT::SimpleValueType vt)
692b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitInteger), Val(val), VT(vt) {}
693845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
694906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner  int64_t getValue() const { return Val; }
695845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  MVT::SimpleValueType getVT() const { return VT; }
696845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
697b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
698845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    return N->getKind() == EmitInteger;
699845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  }
700845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
70158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
702a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
70358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
70458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitIntegerMatcher>(M)->Val == Val &&
70558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner           cast<EmitIntegerMatcher>(M)->VT == VT;
70658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
70758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return (Val << 4) | VT; }
708845c04273461b2a10754a1455b02916a19ea72aaChris Lattner};
7098e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
710b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitStringIntegerMatcher - A target constant whose value is represented
7118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// by a string.
712b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitStringIntegerMatcher : public Matcher {
7138e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  std::string Val;
7148e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  MVT::SimpleValueType VT;
7158e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
716b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitStringIntegerMatcher(const std::string &val, MVT::SimpleValueType vt)
717b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitStringInteger), Val(val), VT(vt) {}
7188e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
7198e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  const std::string &getValue() const { return Val; }
7208e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  MVT::SimpleValueType getVT() const { return VT; }
7218e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
722b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
7238e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitStringInteger;
7248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
7258e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
72658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
727a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
72858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
72958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitStringIntegerMatcher>(M)->Val == Val &&
73058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner           cast<EmitStringIntegerMatcher>(M)->VT == VT;
73158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
73258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
7338e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
734845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
735b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitRegisterMatcher - This creates a new TargetConstant.
736b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitRegisterMatcher : public Matcher {
737845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  /// Reg - The def for the register that we're emitting.  If this is null, then
738845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  /// this is a reference to zero_reg.
739845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  Record *Reg;
740845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  MVT::SimpleValueType VT;
741845c04273461b2a10754a1455b02916a19ea72aaChris Lattnerpublic:
742b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitRegisterMatcher(Record *reg, MVT::SimpleValueType vt)
743b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitRegister), Reg(reg), VT(vt) {}
744845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
745845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  Record *getReg() const { return Reg; }
746845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  MVT::SimpleValueType getVT() const { return VT; }
747845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
748b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
749845c04273461b2a10754a1455b02916a19ea72aaChris Lattner    return N->getKind() == EmitRegister;
750845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  }
751845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
75258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
753a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
75458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
75558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitRegisterMatcher>(M)->Reg == Reg &&
75658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner           cast<EmitRegisterMatcher>(M)->VT == VT;
75758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
75858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const {
75958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return ((unsigned)(intptr_t)Reg) << 4 | VT;
76058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
761845c04273461b2a10754a1455b02916a19ea72aaChris Lattner};
7628e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
763b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitConvertToTargetMatcher - Emit an operation that reads a specified
7648e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// recorded node and converts it from being a ISD::Constant to
7658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// ISD::TargetConstant, likewise for ConstantFP.
766b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitConvertToTargetMatcher : public Matcher {
7678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned Slot;
7688e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
769b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitConvertToTargetMatcher(unsigned slot)
770b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitConvertToTarget), Slot(slot) {}
7718e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
7728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getSlot() const { return Slot; }
7738e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
774b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
7758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitConvertToTarget;
7768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
7778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
77858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
779a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
78058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
78158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitConvertToTargetMatcher>(M)->Slot == Slot;
78258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
78358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const { return Slot; }
7848e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
7858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
786b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitMergeInputChainsMatcher - Emit a node that merges a list of input
7878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// chains together with a token factor.  The list of nodes are the nodes in the
7888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// matched pattern that have chain input/outputs.  This node adds all input
7898e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// chains of these nodes if they are not themselves a node in the pattern.
790b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitMergeInputChainsMatcher : public Matcher {
7918e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  SmallVector<unsigned, 3> ChainNodes;
7928e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
793b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitMergeInputChainsMatcher(const unsigned *nodes, unsigned NumNodes)
794b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitMergeInputChains), ChainNodes(nodes, nodes+NumNodes) {}
7958e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
7968e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNumNodes() const { return ChainNodes.size(); }
7978e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
7988e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNode(unsigned i) const {
7998e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    assert(i < ChainNodes.size());
8008e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return ChainNodes[i];
8018e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
8028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
803b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
8048e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitMergeInputChains;
8058e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
8068e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
80758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
808a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
80958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
81058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitMergeInputChainsMatcher>(M)->ChainNodes == ChainNodes;
81158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
81258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
8138e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
8148e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
815b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitCopyToRegMatcher - Emit a CopyToReg node from a value to a physreg,
8168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// pushing the chain and flag results.
8178e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner///
818b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitCopyToRegMatcher : public Matcher {
8198e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned SrcSlot; // Value to copy into the physreg.
8208e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  Record *DestPhysReg;
8218e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
822b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitCopyToRegMatcher(unsigned srcSlot, Record *destPhysReg)
823b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitCopyToReg), SrcSlot(srcSlot), DestPhysReg(destPhysReg) {}
8248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
8258e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getSrcSlot() const { return SrcSlot; }
8268e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  Record *getDestPhysReg() const { return DestPhysReg; }
8278e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
828b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
8298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitCopyToReg;
8308e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
8318e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
83258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
833a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
83458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
83558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<EmitCopyToRegMatcher>(M)->SrcSlot == SrcSlot &&
83658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner           cast<EmitCopyToRegMatcher>(M)->DestPhysReg == DestPhysReg;
83758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
83858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const {
83958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return SrcSlot ^ ((unsigned)(intptr_t)DestPhysReg << 4);
84058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
8418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
8428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
8438e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
8448e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
845b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitNodeXFormMatcher - Emit an operation that runs an SDNodeXForm on a
8468e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// recorded node and records the result.
847b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitNodeXFormMatcher : public Matcher {
8488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned Slot;
8498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  Record *NodeXForm;
8508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
851b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitNodeXFormMatcher(unsigned slot, Record *nodeXForm)
852b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitNodeXForm), Slot(slot), NodeXForm(nodeXForm) {}
8538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
8548e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getSlot() const { return Slot; }
8558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  Record *getNodeXForm() const { return NodeXForm; }
8568e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
857b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
8588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitNodeXForm;
8598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
8608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
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<EmitNodeXFormMatcher>(M)->Slot == Slot &&
86558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner           cast<EmitNodeXFormMatcher>(M)->NodeXForm == NodeXForm;
86658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
86758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const {
86858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return Slot ^ ((unsigned)(intptr_t)NodeXForm << 4);
86958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
8708e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
871845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
872b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitNodeMatcher - This signals a successful match and generates a node.
873b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitNodeMatcher : public Matcher {
8748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  std::string OpcodeName;
8758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  const SmallVector<MVT::SimpleValueType, 3> VTs;
8768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  const SmallVector<unsigned, 6> Operands;
8778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  bool HasChain, HasFlag, HasMemRefs;
8788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
8798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  /// NumFixedArityOperands - If this is a fixed arity node, this is set to -1.
8808e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  /// If this is a varidic node, this is set to the number of fixed arity
8818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  /// operands in the root of the pattern.  The rest are appended to this node.
8828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  int NumFixedArityOperands;
8838e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic:
884b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  EmitNodeMatcher(const std::string &opcodeName,
88558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner                  const MVT::SimpleValueType *vts, unsigned numvts,
88658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner                  const unsigned *operands, unsigned numops,
88758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner                  bool hasChain, bool hasFlag, bool hasmemrefs,
88858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner                  int numfixedarityoperands)
889b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(EmitNode), OpcodeName(opcodeName),
8908e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      VTs(vts, vts+numvts), Operands(operands, operands+numops),
8918e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      HasChain(hasChain), HasFlag(hasFlag), HasMemRefs(hasmemrefs),
8928e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner      NumFixedArityOperands(numfixedarityoperands) {}
8938e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
8948e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  const std::string &getOpcodeName() const { return OpcodeName; }
8958e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
8968e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNumVTs() const { return VTs.size(); }
8978e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  MVT::SimpleValueType getVT(unsigned i) const {
8988e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    assert(i < VTs.size());
8998e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return VTs[i];
9008e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
9018e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
9028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getNumOperands() const { return Operands.size(); }
9038e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  unsigned getOperand(unsigned i) const {
9048e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    assert(i < Operands.size());
9058e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return Operands[i];
9068e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
9078e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
9088e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  bool hasChain() const { return HasChain; }
9098e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  bool hasFlag() const { return HasFlag; }
9108e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  bool hasMemRefs() const { return HasMemRefs; }
9118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  int getNumFixedArityOperands() const { return NumFixedArityOperands; }
9128e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
913b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
9148e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner    return N->getKind() == EmitNode;
9158e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner  }
9168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner
91758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
918a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
91958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const;
92058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
9218e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner};
92277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner
923b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// MarkFlagResultsMatcher - This node indicates which non-root nodes in the
924b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// pattern produce flags.  This allows CompleteMatchMatcher to update them
92502f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner/// with the output flag of the resultant code.
926b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass MarkFlagResultsMatcher : public Matcher {
92702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  SmallVector<unsigned, 3> FlagResultNodes;
92802f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattnerpublic:
929b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  MarkFlagResultsMatcher(const unsigned *nodes, unsigned NumNodes)
930b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner    : Matcher(MarkFlagResults), FlagResultNodes(nodes, nodes+NumNodes) {}
93102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
93202f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  unsigned getNumNodes() const { return FlagResultNodes.size(); }
93302f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
93402f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  unsigned getNode(unsigned i) const {
93502f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    assert(i < FlagResultNodes.size());
93602f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    return FlagResultNodes[i];
93702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  }
93802f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
939b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
94002f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner    return N->getKind() == MarkFlagResults;
94102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner  }
94202f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
94358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
944a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
94558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
94658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<MarkFlagResultsMatcher>(M)->FlagResultNodes == FlagResultNodes;
94758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
94858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
94902f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner};
95002f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner
951b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CompleteMatchMatcher - Complete a match by replacing the results of the
95277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner/// pattern with the newly generated nodes.  This also prints a comment
95377f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner/// indicating the source and dest patterns.
954b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CompleteMatchMatcher : public Matcher {
95577f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  SmallVector<unsigned, 2> Results;
956845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  const PatternToMatch &Pattern;
957845c04273461b2a10754a1455b02916a19ea72aaChris Lattnerpublic:
958b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  CompleteMatchMatcher(const unsigned *results, unsigned numresults,
95977f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner                           const PatternToMatch &pattern)
960b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  : Matcher(CompleteMatch), Results(results, results+numresults),
96177f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    Pattern(pattern) {}
96277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner
96377f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  unsigned getNumResults() const { return Results.size(); }
96477f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner  unsigned getResult(unsigned R) const { return Results[R]; }
965845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  const PatternToMatch &getPattern() const { return Pattern; }
966845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
967b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner  static inline bool classof(const Matcher *N) {
96877f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner    return N->getKind() == CompleteMatch;
969845c04273461b2a10754a1455b02916a19ea72aaChris Lattner  }
970845c04273461b2a10754a1455b02916a19ea72aaChris Lattner
97158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate:
972a5028a64634f995630e93390c5c23374a09a450fChris Lattner  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
97358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual bool isEqualImpl(const Matcher *M) const {
97458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner    return cast<CompleteMatchMatcher>(M)->Results == Results &&
97558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner          &cast<CompleteMatchMatcher>(M)->Pattern == &Pattern;
97658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  }
97758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner  virtual unsigned getHashImpl() const;
978845c04273461b2a10754a1455b02916a19ea72aaChris Lattner};
9799a747f1305e76025df2323a03b805a284f2cde77Chris Lattner
980da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} // end namespace llvm
981da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner
982da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#endif
983