DAGISelMatcher.h revision 23cfda719e059ce7d761b08fbfb89e676d6c9737
1//===- DAGISelMatcher.h - Representation of DAG pattern matcher -----------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef TBLGEN_DAGISELMATCHER_H
11#define TBLGEN_DAGISELMATCHER_H
12
13#include "llvm/CodeGen/ValueTypes.h"
14#include "llvm/ADT/OwningPtr.h"
15#include "llvm/ADT/StringRef.h"
16#include "llvm/ADT/SmallVector.h"
17#include "llvm/Support/Casting.h"
18
19namespace llvm {
20  class CodeGenDAGPatterns;
21  class MatcherNode;
22  class PatternToMatch;
23  class raw_ostream;
24  class ComplexPattern;
25  class Record;
26
27MatcherNode *ConvertPatternToMatcher(const PatternToMatch &Pattern,
28                                     const CodeGenDAGPatterns &CGP);
29MatcherNode *OptimizeMatcher(MatcherNode *Matcher);
30void EmitMatcherTable(const MatcherNode *Matcher, raw_ostream &OS);
31
32
33/// MatcherNode - Base class for all the the DAG ISel Matcher representation
34/// nodes.
35class MatcherNode {
36  // The next matcher node that is executed after this one.  Null if this is the
37  // last stage of a match.
38  OwningPtr<MatcherNode> Next;
39public:
40  enum KindTy {
41    // Matcher state manipulation.
42    Push,                 // Push a checking scope.
43    RecordNode,           // Record the current node.
44    RecordChild,          // Record a child of the current node.
45    RecordMemRef,         // Record the memref in the current node.
46    CaptureFlagInput,     // If the current node has an input flag, save it.
47    MoveChild,            // Move current node to specified child.
48    MoveParent,           // Move current node to parent.
49
50    // Predicate checking.
51    CheckSame,            // Fail if not same as prev match.
52    CheckPatternPredicate,
53    CheckPredicate,       // Fail if node predicate fails.
54    CheckOpcode,          // Fail if not opcode.
55    CheckMultiOpcode,     // Fail if not in opcode list.
56    CheckType,            // Fail if not correct type.
57    CheckChildType,       // Fail if child has wrong type.
58    CheckInteger,         // Fail if wrong val.
59    CheckCondCode,        // Fail if not condcode.
60    CheckValueType,
61    CheckComplexPat,
62    CheckAndImm,
63    CheckOrImm,
64    CheckFoldableChainNode,
65    CheckChainCompatible,
66
67    // Node creation/emisssion.
68    EmitInteger,          // Create a TargetConstant
69    EmitStringInteger,    // Create a TargetConstant from a string.
70    EmitRegister,         // Create a register.
71    EmitConvertToTarget,  // Convert a imm/fpimm to target imm/fpimm
72    EmitMergeInputChains, // Merge together a chains for an input.
73    EmitCopyToReg,        // Emit a copytoreg into a physreg.
74    EmitNode,             // Create a DAG node
75    EmitNodeXForm,        // Run a SDNodeXForm
76    MarkFlagResults,      // Indicate which interior nodes have flag results.
77    CompleteMatch         // Finish a match and update the results.
78  };
79  const KindTy Kind;
80
81protected:
82  MatcherNode(KindTy K) : Kind(K) {}
83public:
84  virtual ~MatcherNode() {}
85
86  KindTy getKind() const { return Kind; }
87
88  MatcherNode *getNext() { return Next.get(); }
89  const MatcherNode *getNext() const { return Next.get(); }
90  void setNext(MatcherNode *C) { Next.reset(C); }
91  MatcherNode *takeNext() { return Next.take(); }
92
93  OwningPtr<MatcherNode> &getNextPtr() { return Next; }
94
95  static inline bool classof(const MatcherNode *) { return true; }
96
97  virtual void print(raw_ostream &OS, unsigned indent = 0) const = 0;
98  void dump() const;
99protected:
100  void printNext(raw_ostream &OS, unsigned indent) const;
101};
102
103/// PushMatcherNode - This pushes a failure scope on the stack and evaluates
104/// 'Next'.  If 'Next' fails to match, it pops its scope and attempts to
105/// match 'Failure'.
106class PushMatcherNode : public MatcherNode {
107  OwningPtr<MatcherNode> Failure;
108public:
109  PushMatcherNode(MatcherNode *next = 0, MatcherNode *failure = 0)
110    : MatcherNode(Push), Failure(failure) {
111    setNext(next);
112  }
113
114  MatcherNode *getFailure() { return Failure.get(); }
115  const MatcherNode *getFailure() const { return Failure.get(); }
116  void setFailure(MatcherNode *N) { Failure.reset(N); }
117  OwningPtr<MatcherNode> &getFailurePtr() { return Failure; }
118
119  static inline bool classof(const MatcherNode *N) {
120    return N->getKind() == Push;
121  }
122
123  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
124};
125
126/// RecordMatcherNode - Save the current node in the operand list.
127class RecordMatcherNode : public MatcherNode {
128  /// WhatFor - This is a string indicating why we're recording this.  This
129  /// should only be used for comment generation not anything semantic.
130  std::string WhatFor;
131public:
132  RecordMatcherNode(const std::string &whatfor)
133    : MatcherNode(RecordNode), WhatFor(whatfor) {}
134
135  const std::string &getWhatFor() const { return WhatFor; }
136
137  static inline bool classof(const MatcherNode *N) {
138    return N->getKind() == RecordNode;
139  }
140
141  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
142};
143
144/// RecordChildMatcherNode - Save a numbered child of the current node, or fail
145/// the match if it doesn't exist.  This is logically equivalent to:
146///    MoveChild N + RecordNode + MoveParent.
147class RecordChildMatcherNode : public MatcherNode {
148  unsigned ChildNo;
149
150  /// WhatFor - This is a string indicating why we're recording this.  This
151  /// should only be used for comment generation not anything semantic.
152  std::string WhatFor;
153public:
154  RecordChildMatcherNode(unsigned childno, const std::string &whatfor)
155  : MatcherNode(RecordChild), ChildNo(childno), WhatFor(whatfor) {}
156
157  unsigned getChildNo() const { return ChildNo; }
158  const std::string &getWhatFor() const { return WhatFor; }
159
160  static inline bool classof(const MatcherNode *N) {
161    return N->getKind() == RecordChild;
162  }
163
164  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
165};
166
167/// RecordMemRefMatcherNode - Save the current node's memref.
168class RecordMemRefMatcherNode : public MatcherNode {
169public:
170  RecordMemRefMatcherNode() : MatcherNode(RecordMemRef) {}
171
172  static inline bool classof(const MatcherNode *N) {
173    return N->getKind() == RecordMemRef;
174  }
175
176  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
177};
178
179
180/// CaptureFlagInputMatcherNode - If the current record has a flag input, record
181/// it so that it is used as an input to the generated code.
182class CaptureFlagInputMatcherNode : public MatcherNode {
183public:
184  CaptureFlagInputMatcherNode()
185    : MatcherNode(CaptureFlagInput) {}
186
187  static inline bool classof(const MatcherNode *N) {
188    return N->getKind() == CaptureFlagInput;
189  }
190
191  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
192};
193
194/// MoveChildMatcherNode - This tells the interpreter to move into the
195/// specified child node.
196class MoveChildMatcherNode : public MatcherNode {
197  unsigned ChildNo;
198public:
199  MoveChildMatcherNode(unsigned childNo)
200  : MatcherNode(MoveChild), ChildNo(childNo) {}
201
202  unsigned getChildNo() const { return ChildNo; }
203
204  static inline bool classof(const MatcherNode *N) {
205    return N->getKind() == MoveChild;
206  }
207
208  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
209};
210
211/// MoveParentMatcherNode - This tells the interpreter to move to the parent
212/// of the current node.
213class MoveParentMatcherNode : public MatcherNode {
214public:
215  MoveParentMatcherNode()
216  : MatcherNode(MoveParent) {}
217
218  static inline bool classof(const MatcherNode *N) {
219    return N->getKind() == MoveParent;
220  }
221
222  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
223};
224
225/// CheckSameMatcherNode - This checks to see if this node is exactly the same
226/// node as the specified match that was recorded with 'Record'.  This is used
227/// when patterns have the same name in them, like '(mul GPR:$in, GPR:$in)'.
228class CheckSameMatcherNode : public MatcherNode {
229  unsigned MatchNumber;
230public:
231  CheckSameMatcherNode(unsigned matchnumber)
232  : MatcherNode(CheckSame), MatchNumber(matchnumber) {}
233
234  unsigned getMatchNumber() const { return MatchNumber; }
235
236  static inline bool classof(const MatcherNode *N) {
237    return N->getKind() == CheckSame;
238  }
239
240  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
241};
242
243/// CheckPatternPredicateMatcherNode - This checks the target-specific predicate
244/// to see if the entire pattern is capable of matching.  This predicate does
245/// not take a node as input.  This is used for subtarget feature checks etc.
246class CheckPatternPredicateMatcherNode : public MatcherNode {
247  std::string Predicate;
248public:
249  CheckPatternPredicateMatcherNode(StringRef predicate)
250  : MatcherNode(CheckPatternPredicate), Predicate(predicate) {}
251
252  StringRef getPredicate() const { return Predicate; }
253
254  static inline bool classof(const MatcherNode *N) {
255    return N->getKind() == CheckPatternPredicate;
256  }
257
258  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
259};
260
261/// CheckPredicateMatcherNode - This checks the target-specific predicate to
262/// see if the node is acceptable.
263class CheckPredicateMatcherNode : public MatcherNode {
264  StringRef PredName;
265public:
266  CheckPredicateMatcherNode(StringRef predname)
267    : MatcherNode(CheckPredicate), PredName(predname) {}
268
269  StringRef getPredicateName() const { return PredName; }
270
271  static inline bool classof(const MatcherNode *N) {
272    return N->getKind() == CheckPredicate;
273  }
274
275  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
276};
277
278
279/// CheckOpcodeMatcherNode - This checks to see if the current node has the
280/// specified opcode, if not it fails to match.
281class CheckOpcodeMatcherNode : public MatcherNode {
282  StringRef OpcodeName;
283public:
284  CheckOpcodeMatcherNode(StringRef opcodename)
285    : MatcherNode(CheckOpcode), OpcodeName(opcodename) {}
286
287  StringRef getOpcodeName() const { return OpcodeName; }
288
289  static inline bool classof(const MatcherNode *N) {
290    return N->getKind() == CheckOpcode;
291  }
292
293  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
294};
295
296/// CheckMultiOpcodeMatcherNode - This checks to see if the current node has one
297/// of the specified opcode, if not it fails to match.
298class CheckMultiOpcodeMatcherNode : public MatcherNode {
299  SmallVector<StringRef, 4> OpcodeNames;
300public:
301  CheckMultiOpcodeMatcherNode(const StringRef *opcodes, unsigned numops)
302  : MatcherNode(CheckMultiOpcode), OpcodeNames(opcodes, opcodes+numops) {}
303
304  unsigned getNumOpcodeNames() const { return OpcodeNames.size(); }
305  StringRef getOpcodeName(unsigned i) const { return OpcodeNames[i]; }
306
307  static inline bool classof(const MatcherNode *N) {
308    return N->getKind() == CheckMultiOpcode;
309  }
310
311  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
312};
313
314
315
316/// CheckTypeMatcherNode - This checks to see if the current node has the
317/// specified type, if not it fails to match.
318class CheckTypeMatcherNode : public MatcherNode {
319  MVT::SimpleValueType Type;
320public:
321  CheckTypeMatcherNode(MVT::SimpleValueType type)
322    : MatcherNode(CheckType), Type(type) {}
323
324  MVT::SimpleValueType getType() const { return Type; }
325
326  static inline bool classof(const MatcherNode *N) {
327    return N->getKind() == CheckType;
328  }
329
330  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
331};
332
333/// CheckChildTypeMatcherNode - This checks to see if a child node has the
334/// specified type, if not it fails to match.
335class CheckChildTypeMatcherNode : public MatcherNode {
336  unsigned ChildNo;
337  MVT::SimpleValueType Type;
338public:
339  CheckChildTypeMatcherNode(unsigned childno, MVT::SimpleValueType type)
340    : MatcherNode(CheckChildType), ChildNo(childno), Type(type) {}
341
342  unsigned getChildNo() const { return ChildNo; }
343  MVT::SimpleValueType getType() const { return Type; }
344
345  static inline bool classof(const MatcherNode *N) {
346    return N->getKind() == CheckChildType;
347  }
348
349  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
350};
351
352
353/// CheckIntegerMatcherNode - This checks to see if the current node is a
354/// ConstantSDNode with the specified integer value, if not it fails to match.
355class CheckIntegerMatcherNode : public MatcherNode {
356  int64_t Value;
357public:
358  CheckIntegerMatcherNode(int64_t value)
359    : MatcherNode(CheckInteger), Value(value) {}
360
361  int64_t getValue() const { return Value; }
362
363  static inline bool classof(const MatcherNode *N) {
364    return N->getKind() == CheckInteger;
365  }
366
367  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
368};
369
370/// CheckCondCodeMatcherNode - This checks to see if the current node is a
371/// CondCodeSDNode with the specified condition, if not it fails to match.
372class CheckCondCodeMatcherNode : public MatcherNode {
373  StringRef CondCodeName;
374public:
375  CheckCondCodeMatcherNode(StringRef condcodename)
376  : MatcherNode(CheckCondCode), CondCodeName(condcodename) {}
377
378  StringRef getCondCodeName() const { return CondCodeName; }
379
380  static inline bool classof(const MatcherNode *N) {
381    return N->getKind() == CheckCondCode;
382  }
383
384  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
385};
386
387/// CheckValueTypeMatcherNode - This checks to see if the current node is a
388/// VTSDNode with the specified type, if not it fails to match.
389class CheckValueTypeMatcherNode : public MatcherNode {
390  StringRef TypeName;
391public:
392  CheckValueTypeMatcherNode(StringRef type_name)
393  : MatcherNode(CheckValueType), TypeName(type_name) {}
394
395  StringRef getTypeName() const { return TypeName; }
396
397  static inline bool classof(const MatcherNode *N) {
398    return N->getKind() == CheckValueType;
399  }
400
401  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
402};
403
404
405
406/// CheckComplexPatMatcherNode - This node runs the specified ComplexPattern on
407/// the current node.
408class CheckComplexPatMatcherNode : public MatcherNode {
409  const ComplexPattern &Pattern;
410public:
411  CheckComplexPatMatcherNode(const ComplexPattern &pattern)
412  : MatcherNode(CheckComplexPat), Pattern(pattern) {}
413
414  const ComplexPattern &getPattern() const { return Pattern; }
415
416  static inline bool classof(const MatcherNode *N) {
417    return N->getKind() == CheckComplexPat;
418  }
419
420  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
421};
422
423/// CheckAndImmMatcherNode - This checks to see if the current node is an 'and'
424/// with something equivalent to the specified immediate.
425class CheckAndImmMatcherNode : public MatcherNode {
426  int64_t Value;
427public:
428  CheckAndImmMatcherNode(int64_t value)
429  : MatcherNode(CheckAndImm), Value(value) {}
430
431  int64_t getValue() const { return Value; }
432
433  static inline bool classof(const MatcherNode *N) {
434    return N->getKind() == CheckAndImm;
435  }
436
437  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
438};
439
440/// CheckOrImmMatcherNode - This checks to see if the current node is an 'and'
441/// with something equivalent to the specified immediate.
442class CheckOrImmMatcherNode : public MatcherNode {
443  int64_t Value;
444public:
445  CheckOrImmMatcherNode(int64_t value)
446    : MatcherNode(CheckOrImm), Value(value) {}
447
448  int64_t getValue() const { return Value; }
449
450  static inline bool classof(const MatcherNode *N) {
451    return N->getKind() == CheckOrImm;
452  }
453
454  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
455};
456
457/// CheckFoldableChainNodeMatcherNode - This checks to see if the current node
458/// (which defines a chain operand) is safe to fold into a larger pattern.
459class CheckFoldableChainNodeMatcherNode : public MatcherNode {
460public:
461  CheckFoldableChainNodeMatcherNode()
462    : MatcherNode(CheckFoldableChainNode) {}
463
464  static inline bool classof(const MatcherNode *N) {
465    return N->getKind() == CheckFoldableChainNode;
466  }
467
468  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
469};
470
471/// CheckChainCompatibleMatcherNode - Verify that the current node's chain
472/// operand is 'compatible' with the specified recorded node's.
473class CheckChainCompatibleMatcherNode : public MatcherNode {
474  unsigned PreviousOp;
475public:
476  CheckChainCompatibleMatcherNode(unsigned previousop)
477    : MatcherNode(CheckChainCompatible), PreviousOp(previousop) {}
478
479  unsigned getPreviousOp() const { return PreviousOp; }
480
481  static inline bool classof(const MatcherNode *N) {
482    return N->getKind() == CheckChainCompatible;
483  }
484
485  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
486};
487
488/// EmitIntegerMatcherNode - This creates a new TargetConstant.
489class EmitIntegerMatcherNode : public MatcherNode {
490  int64_t Val;
491  MVT::SimpleValueType VT;
492public:
493  EmitIntegerMatcherNode(int64_t val, MVT::SimpleValueType vt)
494  : MatcherNode(EmitInteger), Val(val), VT(vt) {}
495
496  int64_t getValue() const { return Val; }
497  MVT::SimpleValueType getVT() const { return VT; }
498
499  static inline bool classof(const MatcherNode *N) {
500    return N->getKind() == EmitInteger;
501  }
502
503  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
504};
505
506/// EmitStringIntegerMatcherNode - A target constant whose value is represented
507/// by a string.
508class EmitStringIntegerMatcherNode : public MatcherNode {
509  std::string Val;
510  MVT::SimpleValueType VT;
511public:
512  EmitStringIntegerMatcherNode(const std::string &val, MVT::SimpleValueType vt)
513    : MatcherNode(EmitStringInteger), Val(val), VT(vt) {}
514
515  const std::string &getValue() const { return Val; }
516  MVT::SimpleValueType getVT() const { return VT; }
517
518  static inline bool classof(const MatcherNode *N) {
519    return N->getKind() == EmitStringInteger;
520  }
521
522  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
523};
524
525/// EmitRegisterMatcherNode - This creates a new TargetConstant.
526class EmitRegisterMatcherNode : public MatcherNode {
527  /// Reg - The def for the register that we're emitting.  If this is null, then
528  /// this is a reference to zero_reg.
529  Record *Reg;
530  MVT::SimpleValueType VT;
531public:
532  EmitRegisterMatcherNode(Record *reg, MVT::SimpleValueType vt)
533    : MatcherNode(EmitRegister), Reg(reg), VT(vt) {}
534
535  Record *getReg() const { return Reg; }
536  MVT::SimpleValueType getVT() const { return VT; }
537
538  static inline bool classof(const MatcherNode *N) {
539    return N->getKind() == EmitRegister;
540  }
541
542  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
543};
544
545/// EmitConvertToTargetMatcherNode - Emit an operation that reads a specified
546/// recorded node and converts it from being a ISD::Constant to
547/// ISD::TargetConstant, likewise for ConstantFP.
548class EmitConvertToTargetMatcherNode : public MatcherNode {
549  unsigned Slot;
550public:
551  EmitConvertToTargetMatcherNode(unsigned slot)
552    : MatcherNode(EmitConvertToTarget), Slot(slot) {}
553
554  unsigned getSlot() const { return Slot; }
555
556  static inline bool classof(const MatcherNode *N) {
557    return N->getKind() == EmitConvertToTarget;
558  }
559
560  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
561};
562
563/// EmitMergeInputChainsMatcherNode - Emit a node that merges a list of input
564/// chains together with a token factor.  The list of nodes are the nodes in the
565/// matched pattern that have chain input/outputs.  This node adds all input
566/// chains of these nodes if they are not themselves a node in the pattern.
567class EmitMergeInputChainsMatcherNode : public MatcherNode {
568  SmallVector<unsigned, 3> ChainNodes;
569public:
570  EmitMergeInputChainsMatcherNode(const unsigned *nodes, unsigned NumNodes)
571  : MatcherNode(EmitMergeInputChains), ChainNodes(nodes, nodes+NumNodes) {}
572
573  unsigned getNumNodes() const { return ChainNodes.size(); }
574
575  unsigned getNode(unsigned i) const {
576    assert(i < ChainNodes.size());
577    return ChainNodes[i];
578  }
579
580  static inline bool classof(const MatcherNode *N) {
581    return N->getKind() == EmitMergeInputChains;
582  }
583
584  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
585};
586
587/// EmitCopyToRegMatcherNode - Emit a CopyToReg node from a value to a physreg,
588/// pushing the chain and flag results.
589///
590class EmitCopyToRegMatcherNode : public MatcherNode {
591  unsigned SrcSlot; // Value to copy into the physreg.
592  Record *DestPhysReg;
593public:
594  EmitCopyToRegMatcherNode(unsigned srcSlot, Record *destPhysReg)
595  : MatcherNode(EmitCopyToReg), SrcSlot(srcSlot), DestPhysReg(destPhysReg) {}
596
597  unsigned getSrcSlot() const { return SrcSlot; }
598  Record *getDestPhysReg() const { return DestPhysReg; }
599
600  static inline bool classof(const MatcherNode *N) {
601    return N->getKind() == EmitCopyToReg;
602  }
603
604  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
605};
606
607
608
609/// EmitNodeXFormMatcherNode - Emit an operation that runs an SDNodeXForm on a
610/// recorded node and records the result.
611class EmitNodeXFormMatcherNode : public MatcherNode {
612  unsigned Slot;
613  Record *NodeXForm;
614public:
615  EmitNodeXFormMatcherNode(unsigned slot, Record *nodeXForm)
616  : MatcherNode(EmitNodeXForm), Slot(slot), NodeXForm(nodeXForm) {}
617
618  unsigned getSlot() const { return Slot; }
619  Record *getNodeXForm() const { return NodeXForm; }
620
621  static inline bool classof(const MatcherNode *N) {
622    return N->getKind() == EmitNodeXForm;
623  }
624
625  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
626};
627
628/// EmitNodeMatcherNode - This signals a successful match and generates a node.
629class EmitNodeMatcherNode : public MatcherNode {
630  std::string OpcodeName;
631  const SmallVector<MVT::SimpleValueType, 3> VTs;
632  const SmallVector<unsigned, 6> Operands;
633  bool HasChain, HasFlag, HasMemRefs;
634
635  /// NumFixedArityOperands - If this is a fixed arity node, this is set to -1.
636  /// If this is a varidic node, this is set to the number of fixed arity
637  /// operands in the root of the pattern.  The rest are appended to this node.
638  int NumFixedArityOperands;
639public:
640  EmitNodeMatcherNode(const std::string &opcodeName,
641                      const MVT::SimpleValueType *vts, unsigned numvts,
642                      const unsigned *operands, unsigned numops,
643                      bool hasChain, bool hasFlag, bool hasmemrefs,
644                      int numfixedarityoperands)
645    : MatcherNode(EmitNode), OpcodeName(opcodeName),
646      VTs(vts, vts+numvts), Operands(operands, operands+numops),
647      HasChain(hasChain), HasFlag(hasFlag), HasMemRefs(hasmemrefs),
648      NumFixedArityOperands(numfixedarityoperands) {}
649
650  const std::string &getOpcodeName() const { return OpcodeName; }
651
652  unsigned getNumVTs() const { return VTs.size(); }
653  MVT::SimpleValueType getVT(unsigned i) const {
654    assert(i < VTs.size());
655    return VTs[i];
656  }
657
658  unsigned getNumOperands() const { return Operands.size(); }
659  unsigned getOperand(unsigned i) const {
660    assert(i < Operands.size());
661    return Operands[i];
662  }
663
664  bool hasChain() const { return HasChain; }
665  bool hasFlag() const { return HasFlag; }
666  bool hasMemRefs() const { return HasMemRefs; }
667  int getNumFixedArityOperands() const { return NumFixedArityOperands; }
668
669  static inline bool classof(const MatcherNode *N) {
670    return N->getKind() == EmitNode;
671  }
672
673  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
674};
675
676/// MarkFlagResultsMatcherNode - This node indicates which non-root nodes in the
677/// pattern produce flags.  This allows CompleteMatchMatcherNode to update them
678/// with the output flag of the resultant code.
679class MarkFlagResultsMatcherNode : public MatcherNode {
680  SmallVector<unsigned, 3> FlagResultNodes;
681public:
682  MarkFlagResultsMatcherNode(const unsigned *nodes, unsigned NumNodes)
683  : MatcherNode(MarkFlagResults), FlagResultNodes(nodes, nodes+NumNodes) {}
684
685  unsigned getNumNodes() const { return FlagResultNodes.size(); }
686
687  unsigned getNode(unsigned i) const {
688    assert(i < FlagResultNodes.size());
689    return FlagResultNodes[i];
690  }
691
692  static inline bool classof(const MatcherNode *N) {
693    return N->getKind() == MarkFlagResults;
694  }
695
696  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
697};
698
699/// CompleteMatchMatcherNode - Complete a match by replacing the results of the
700/// pattern with the newly generated nodes.  This also prints a comment
701/// indicating the source and dest patterns.
702class CompleteMatchMatcherNode : public MatcherNode {
703  SmallVector<unsigned, 2> Results;
704  const PatternToMatch &Pattern;
705public:
706  CompleteMatchMatcherNode(const unsigned *results, unsigned numresults,
707                           const PatternToMatch &pattern)
708  : MatcherNode(CompleteMatch), Results(results, results+numresults),
709    Pattern(pattern) {}
710
711  unsigned getNumResults() const { return Results.size(); }
712  unsigned getResult(unsigned R) const { return Results[R]; }
713  const PatternToMatch &getPattern() const { return Pattern; }
714
715  static inline bool classof(const MatcherNode *N) {
716    return N->getKind() == CompleteMatch;
717  }
718
719  virtual void print(raw_ostream &OS, unsigned indent = 0) const;
720};
721
722
723} // end namespace llvm
724
725#endif
726