DAGISelMatcher.h revision ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7
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 Matcher;
22  class PatternToMatch;
23  class raw_ostream;
24  class ComplexPattern;
25  class Record;
26  class SDNodeInfo;
27
28Matcher *ConvertPatternToMatcher(const PatternToMatch &Pattern,
29                                 const CodeGenDAGPatterns &CGP);
30Matcher *OptimizeMatcher(Matcher *Matcher, const CodeGenDAGPatterns &CGP);
31void EmitMatcherTable(const Matcher *Matcher, raw_ostream &OS);
32
33
34/// Matcher - Base class for all the the DAG ISel Matcher representation
35/// nodes.
36class Matcher {
37  // The next matcher node that is executed after this one.  Null if this is the
38  // last stage of a match.
39  OwningPtr<Matcher> Next;
40public:
41  enum KindTy {
42    // Matcher state manipulation.
43    Scope,                // Push a checking scope.
44    RecordNode,           // Record the current node.
45    RecordChild,          // Record a child of the current node.
46    RecordMemRef,         // Record the memref in the current node.
47    CaptureFlagInput,     // If the current node has an input flag, save it.
48    MoveChild,            // Move current node to specified child.
49    MoveParent,           // Move current node to parent.
50
51    // Predicate checking.
52    CheckSame,            // Fail if not same as prev match.
53    CheckPatternPredicate,
54    CheckPredicate,       // Fail if node predicate fails.
55    CheckOpcode,          // Fail if not opcode.
56    CheckMultiOpcode,     // Fail if not in opcode list.
57    CheckType,            // Fail if not correct type.
58    CheckChildType,       // Fail if child has wrong type.
59    CheckInteger,         // Fail if wrong val.
60    CheckCondCode,        // Fail if not condcode.
61    CheckValueType,
62    CheckComplexPat,
63    CheckAndImm,
64    CheckOrImm,
65    CheckFoldableChainNode,
66    CheckChainCompatible,
67
68    // Node creation/emisssion.
69    EmitInteger,          // Create a TargetConstant
70    EmitStringInteger,    // Create a TargetConstant from a string.
71    EmitRegister,         // Create a register.
72    EmitConvertToTarget,  // Convert a imm/fpimm to target imm/fpimm
73    EmitMergeInputChains, // Merge together a chains for an input.
74    EmitCopyToReg,        // Emit a copytoreg into a physreg.
75    EmitNode,             // Create a DAG node
76    EmitNodeXForm,        // Run a SDNodeXForm
77    MarkFlagResults,      // Indicate which interior nodes have flag results.
78    CompleteMatch,        // Finish a match and update the results.
79    MorphNodeTo           // Build a node, finish a match and update results.
80  };
81  const KindTy Kind;
82
83protected:
84  Matcher(KindTy K) : Kind(K) {}
85public:
86  virtual ~Matcher() {}
87
88  KindTy getKind() const { return Kind; }
89
90  Matcher *getNext() { return Next.get(); }
91  const Matcher *getNext() const { return Next.get(); }
92  void setNext(Matcher *C) { Next.reset(C); }
93  Matcher *takeNext() { return Next.take(); }
94
95  OwningPtr<Matcher> &getNextPtr() { return Next; }
96
97  static inline bool classof(const Matcher *) { return true; }
98
99  bool isEqual(const Matcher *M) const {
100    if (getKind() != M->getKind()) return false;
101    return isEqualImpl(M);
102  }
103
104  unsigned getHash() const {
105    // Clear the high bit so we don't conflict with tombstones etc.
106    return ((getHashImpl() << 4) ^ getKind()) & (~0U>>1);
107  }
108
109  /// isSafeToReorderWithPatternPredicate - Return true if it is safe to sink a
110  /// PatternPredicate node past this one.
111  virtual bool isSafeToReorderWithPatternPredicate() const {
112    return false;
113  }
114
115  /// isContradictory - Return true of these two matchers could never match on
116  /// the same node.
117  bool isContradictory(const Matcher *Other) const {
118    // Since this predicate is reflexive, we canonicalize the ordering so that
119    // we always match a node against nodes with kinds that are greater or equal
120    // to them.  For example, we'll pass in a CheckType node as an argument to
121    // the CheckOpcode method, not the other way around.
122    if (getKind() < Other->getKind())
123      return isContradictoryImpl(Other);
124    return Other->isContradictoryImpl(this);
125  }
126
127  void print(raw_ostream &OS, unsigned indent = 0) const;
128  void printOne(raw_ostream &OS) const;
129  void dump() const;
130protected:
131  virtual void printImpl(raw_ostream &OS, unsigned indent) const = 0;
132  virtual bool isEqualImpl(const Matcher *M) const = 0;
133  virtual unsigned getHashImpl() const = 0;
134  virtual bool isContradictoryImpl(const Matcher *M) const { return false; }
135};
136
137/// ScopeMatcher - This attempts to match each of its children to find the first
138/// one that successfully matches.  If one child fails, it tries the next child.
139/// If none of the children match then this check fails.  It never has a 'next'.
140class ScopeMatcher : public Matcher {
141  SmallVector<Matcher*, 4> Children;
142public:
143  ScopeMatcher(Matcher *const *children, unsigned numchildren)
144    : Matcher(Scope), Children(children, children+numchildren) {
145  }
146  virtual ~ScopeMatcher();
147
148  unsigned getNumChildren() const { return Children.size(); }
149
150  Matcher *getChild(unsigned i) { return Children[i]; }
151  const Matcher *getChild(unsigned i) const { return Children[i]; }
152
153  void resetChild(unsigned i, Matcher *N) {
154    delete Children[i];
155    Children[i] = N;
156  }
157
158  Matcher *takeChild(unsigned i) {
159    Matcher *Res = Children[i];
160    Children[i] = 0;
161    return Res;
162  }
163
164  void setNumChildren(unsigned NC) {
165    if (NC < Children.size()) {
166      // delete any children we're about to lose pointers to.
167      for (unsigned i = NC, e = Children.size(); i != e; ++i)
168        delete Children[i];
169    }
170    Children.resize(NC);
171  }
172
173  static inline bool classof(const Matcher *N) {
174    return N->getKind() == Scope;
175  }
176
177private:
178  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
179  virtual bool isEqualImpl(const Matcher *M) const { return false; }
180  virtual unsigned getHashImpl() const { return 12312; }
181};
182
183/// RecordMatcher - Save the current node in the operand list.
184class RecordMatcher : public Matcher {
185  /// WhatFor - This is a string indicating why we're recording this.  This
186  /// should only be used for comment generation not anything semantic.
187  std::string WhatFor;
188public:
189  RecordMatcher(const std::string &whatfor)
190    : Matcher(RecordNode), WhatFor(whatfor) {}
191
192  const std::string &getWhatFor() const { return WhatFor; }
193
194  static inline bool classof(const Matcher *N) {
195    return N->getKind() == RecordNode;
196  }
197
198  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
199private:
200  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
201  virtual bool isEqualImpl(const Matcher *M) const { return true; }
202  virtual unsigned getHashImpl() const { return 0; }
203};
204
205/// RecordChildMatcher - Save a numbered child of the current node, or fail
206/// the match if it doesn't exist.  This is logically equivalent to:
207///    MoveChild N + RecordNode + MoveParent.
208class RecordChildMatcher : public Matcher {
209  unsigned ChildNo;
210
211  /// WhatFor - This is a string indicating why we're recording this.  This
212  /// should only be used for comment generation not anything semantic.
213  std::string WhatFor;
214public:
215  RecordChildMatcher(unsigned childno, const std::string &whatfor)
216  : Matcher(RecordChild), ChildNo(childno), WhatFor(whatfor) {}
217
218  unsigned getChildNo() const { return ChildNo; }
219  const std::string &getWhatFor() const { return WhatFor; }
220
221  static inline bool classof(const Matcher *N) {
222    return N->getKind() == RecordChild;
223  }
224
225  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
226
227private:
228  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
229  virtual bool isEqualImpl(const Matcher *M) const {
230    return cast<RecordChildMatcher>(M)->getChildNo() == getChildNo();
231  }
232  virtual unsigned getHashImpl() const { return getChildNo(); }
233};
234
235/// RecordMemRefMatcher - Save the current node's memref.
236class RecordMemRefMatcher : public Matcher {
237public:
238  RecordMemRefMatcher() : Matcher(RecordMemRef) {}
239
240  static inline bool classof(const Matcher *N) {
241    return N->getKind() == RecordMemRef;
242  }
243
244  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
245
246private:
247  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
248  virtual bool isEqualImpl(const Matcher *M) const { return true; }
249  virtual unsigned getHashImpl() const { return 0; }
250};
251
252
253/// CaptureFlagInputMatcher - If the current record has a flag input, record
254/// it so that it is used as an input to the generated code.
255class CaptureFlagInputMatcher : public Matcher {
256public:
257  CaptureFlagInputMatcher() : Matcher(CaptureFlagInput) {}
258
259  static inline bool classof(const Matcher *N) {
260    return N->getKind() == CaptureFlagInput;
261  }
262
263  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
264
265private:
266  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
267  virtual bool isEqualImpl(const Matcher *M) const { return true; }
268  virtual unsigned getHashImpl() const { return 0; }
269};
270
271/// MoveChildMatcher - This tells the interpreter to move into the
272/// specified child node.
273class MoveChildMatcher : public Matcher {
274  unsigned ChildNo;
275public:
276  MoveChildMatcher(unsigned childNo) : Matcher(MoveChild), ChildNo(childNo) {}
277
278  unsigned getChildNo() const { return ChildNo; }
279
280  static inline bool classof(const Matcher *N) {
281    return N->getKind() == MoveChild;
282  }
283
284  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
285
286private:
287  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
288  virtual bool isEqualImpl(const Matcher *M) const {
289    return cast<MoveChildMatcher>(M)->getChildNo() == getChildNo();
290  }
291  virtual unsigned getHashImpl() const { return getChildNo(); }
292};
293
294/// MoveParentMatcher - This tells the interpreter to move to the parent
295/// of the current node.
296class MoveParentMatcher : public Matcher {
297public:
298  MoveParentMatcher() : Matcher(MoveParent) {}
299
300  static inline bool classof(const Matcher *N) {
301    return N->getKind() == MoveParent;
302  }
303
304  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
305
306private:
307  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
308  virtual bool isEqualImpl(const Matcher *M) const { return true; }
309  virtual unsigned getHashImpl() const { return 0; }
310};
311
312/// CheckSameMatcher - This checks to see if this node is exactly the same
313/// node as the specified match that was recorded with 'Record'.  This is used
314/// when patterns have the same name in them, like '(mul GPR:$in, GPR:$in)'.
315class CheckSameMatcher : public Matcher {
316  unsigned MatchNumber;
317public:
318  CheckSameMatcher(unsigned matchnumber)
319    : Matcher(CheckSame), MatchNumber(matchnumber) {}
320
321  unsigned getMatchNumber() const { return MatchNumber; }
322
323  static inline bool classof(const Matcher *N) {
324    return N->getKind() == CheckSame;
325  }
326
327  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
328
329private:
330  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
331  virtual bool isEqualImpl(const Matcher *M) const {
332    return cast<CheckSameMatcher>(M)->getMatchNumber() == getMatchNumber();
333  }
334  virtual unsigned getHashImpl() const { return getMatchNumber(); }
335};
336
337/// CheckPatternPredicateMatcher - This checks the target-specific predicate
338/// to see if the entire pattern is capable of matching.  This predicate does
339/// not take a node as input.  This is used for subtarget feature checks etc.
340class CheckPatternPredicateMatcher : public Matcher {
341  std::string Predicate;
342public:
343  CheckPatternPredicateMatcher(StringRef predicate)
344    : Matcher(CheckPatternPredicate), Predicate(predicate) {}
345
346  StringRef getPredicate() const { return Predicate; }
347
348  static inline bool classof(const Matcher *N) {
349    return N->getKind() == CheckPatternPredicate;
350  }
351
352  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
353
354private:
355  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
356  virtual bool isEqualImpl(const Matcher *M) const {
357    return cast<CheckPatternPredicateMatcher>(M)->getPredicate() == Predicate;
358  }
359  virtual unsigned getHashImpl() const;
360};
361
362/// CheckPredicateMatcher - This checks the target-specific predicate to
363/// see if the node is acceptable.
364class CheckPredicateMatcher : public Matcher {
365  StringRef PredName;
366public:
367  CheckPredicateMatcher(StringRef predname)
368    : Matcher(CheckPredicate), PredName(predname) {}
369
370  StringRef getPredicateName() const { return PredName; }
371
372  static inline bool classof(const Matcher *N) {
373    return N->getKind() == CheckPredicate;
374  }
375
376  // TODO: Ok?
377  //virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
378
379private:
380  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
381  virtual bool isEqualImpl(const Matcher *M) const {
382    return cast<CheckPredicateMatcher>(M)->PredName == PredName;
383  }
384  virtual unsigned getHashImpl() const;
385};
386
387
388/// CheckOpcodeMatcher - This checks to see if the current node has the
389/// specified opcode, if not it fails to match.
390class CheckOpcodeMatcher : public Matcher {
391  const SDNodeInfo &Opcode;
392public:
393  CheckOpcodeMatcher(const SDNodeInfo &opcode)
394    : Matcher(CheckOpcode), Opcode(opcode) {}
395
396  const SDNodeInfo &getOpcode() const { return Opcode; }
397
398  static inline bool classof(const Matcher *N) {
399    return N->getKind() == CheckOpcode;
400  }
401
402  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
403
404private:
405  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
406  virtual bool isEqualImpl(const Matcher *M) const {
407    return &cast<CheckOpcodeMatcher>(M)->Opcode == &Opcode;
408  }
409  virtual unsigned getHashImpl() const;
410  virtual bool isContradictoryImpl(const Matcher *M) const;
411};
412
413/// CheckMultiOpcodeMatcher - This checks to see if the current node has one
414/// of the specified opcode, if not it fails to match.
415class CheckMultiOpcodeMatcher : public Matcher {
416  SmallVector<const SDNodeInfo*, 4> Opcodes;
417public:
418  CheckMultiOpcodeMatcher(const SDNodeInfo * const *opcodes, unsigned numops)
419    : Matcher(CheckMultiOpcode), Opcodes(opcodes, opcodes+numops) {}
420
421  unsigned getNumOpcodes() const { return Opcodes.size(); }
422  const SDNodeInfo &getOpcode(unsigned i) const { return *Opcodes[i]; }
423
424  static inline bool classof(const Matcher *N) {
425    return N->getKind() == CheckMultiOpcode;
426  }
427
428  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
429
430private:
431  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
432  virtual bool isEqualImpl(const Matcher *M) const {
433    return cast<CheckMultiOpcodeMatcher>(M)->Opcodes == Opcodes;
434  }
435  virtual unsigned getHashImpl() const;
436};
437
438
439
440/// CheckTypeMatcher - This checks to see if the current node has the
441/// specified type, if not it fails to match.
442class CheckTypeMatcher : public Matcher {
443  MVT::SimpleValueType Type;
444public:
445  CheckTypeMatcher(MVT::SimpleValueType type)
446    : Matcher(CheckType), Type(type) {}
447
448  MVT::SimpleValueType getType() const { return Type; }
449
450  static inline bool classof(const Matcher *N) {
451    return N->getKind() == CheckType;
452  }
453
454  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
455
456private:
457  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
458  virtual bool isEqualImpl(const Matcher *M) const {
459    return cast<CheckTypeMatcher>(M)->Type == Type;
460  }
461  virtual unsigned getHashImpl() const { return Type; }
462  virtual bool isContradictoryImpl(const Matcher *M) const;
463};
464
465/// CheckChildTypeMatcher - This checks to see if a child node has the
466/// specified type, if not it fails to match.
467class CheckChildTypeMatcher : public Matcher {
468  unsigned ChildNo;
469  MVT::SimpleValueType Type;
470public:
471  CheckChildTypeMatcher(unsigned childno, MVT::SimpleValueType type)
472    : Matcher(CheckChildType), ChildNo(childno), Type(type) {}
473
474  unsigned getChildNo() const { return ChildNo; }
475  MVT::SimpleValueType getType() const { return Type; }
476
477  static inline bool classof(const Matcher *N) {
478    return N->getKind() == CheckChildType;
479  }
480
481  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
482
483private:
484  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
485  virtual bool isEqualImpl(const Matcher *M) const {
486    return cast<CheckChildTypeMatcher>(M)->ChildNo == ChildNo &&
487           cast<CheckChildTypeMatcher>(M)->Type == Type;
488  }
489  virtual unsigned getHashImpl() const { return (Type << 3) | ChildNo; }
490  virtual bool isContradictoryImpl(const Matcher *M) const;
491};
492
493
494/// CheckIntegerMatcher - This checks to see if the current node is a
495/// ConstantSDNode with the specified integer value, if not it fails to match.
496class CheckIntegerMatcher : public Matcher {
497  int64_t Value;
498public:
499  CheckIntegerMatcher(int64_t value)
500    : Matcher(CheckInteger), Value(value) {}
501
502  int64_t getValue() const { return Value; }
503
504  static inline bool classof(const Matcher *N) {
505    return N->getKind() == CheckInteger;
506  }
507
508  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
509
510private:
511  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
512  virtual bool isEqualImpl(const Matcher *M) const {
513    return cast<CheckIntegerMatcher>(M)->Value == Value;
514  }
515  virtual unsigned getHashImpl() const { return Value; }
516  virtual bool isContradictoryImpl(const Matcher *M) const;
517};
518
519/// CheckCondCodeMatcher - This checks to see if the current node is a
520/// CondCodeSDNode with the specified condition, if not it fails to match.
521class CheckCondCodeMatcher : public Matcher {
522  StringRef CondCodeName;
523public:
524  CheckCondCodeMatcher(StringRef condcodename)
525    : Matcher(CheckCondCode), CondCodeName(condcodename) {}
526
527  StringRef getCondCodeName() const { return CondCodeName; }
528
529  static inline bool classof(const Matcher *N) {
530    return N->getKind() == CheckCondCode;
531  }
532
533  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
534
535private:
536  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
537  virtual bool isEqualImpl(const Matcher *M) const {
538    return cast<CheckCondCodeMatcher>(M)->CondCodeName == CondCodeName;
539  }
540  virtual unsigned getHashImpl() const;
541};
542
543/// CheckValueTypeMatcher - This checks to see if the current node is a
544/// VTSDNode with the specified type, if not it fails to match.
545class CheckValueTypeMatcher : public Matcher {
546  StringRef TypeName;
547public:
548  CheckValueTypeMatcher(StringRef type_name)
549    : Matcher(CheckValueType), TypeName(type_name) {}
550
551  StringRef getTypeName() const { return TypeName; }
552
553  static inline bool classof(const Matcher *N) {
554    return N->getKind() == CheckValueType;
555  }
556
557  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
558
559private:
560  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
561  virtual bool isEqualImpl(const Matcher *M) const {
562    return cast<CheckValueTypeMatcher>(M)->TypeName == TypeName;
563  }
564  virtual unsigned getHashImpl() const;
565};
566
567
568
569/// CheckComplexPatMatcher - This node runs the specified ComplexPattern on
570/// the current node.
571class CheckComplexPatMatcher : public Matcher {
572  const ComplexPattern &Pattern;
573public:
574  CheckComplexPatMatcher(const ComplexPattern &pattern)
575    : Matcher(CheckComplexPat), Pattern(pattern) {}
576
577  const ComplexPattern &getPattern() const { return Pattern; }
578
579  static inline bool classof(const Matcher *N) {
580    return N->getKind() == CheckComplexPat;
581  }
582
583  // Not safe to move a pattern predicate past a complex pattern.
584  virtual bool isSafeToReorderWithPatternPredicate() const { return false; }
585
586private:
587  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
588  virtual bool isEqualImpl(const Matcher *M) const {
589    return &cast<CheckComplexPatMatcher>(M)->Pattern == &Pattern;
590  }
591  virtual unsigned getHashImpl() const {
592    return (unsigned)(intptr_t)&Pattern;
593  }
594};
595
596/// CheckAndImmMatcher - This checks to see if the current node is an 'and'
597/// with something equivalent to the specified immediate.
598class CheckAndImmMatcher : public Matcher {
599  int64_t Value;
600public:
601  CheckAndImmMatcher(int64_t value)
602    : Matcher(CheckAndImm), Value(value) {}
603
604  int64_t getValue() const { return Value; }
605
606  static inline bool classof(const Matcher *N) {
607    return N->getKind() == CheckAndImm;
608  }
609
610  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
611
612private:
613  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
614  virtual bool isEqualImpl(const Matcher *M) const {
615    return cast<CheckAndImmMatcher>(M)->Value == Value;
616  }
617  virtual unsigned getHashImpl() const { return Value; }
618};
619
620/// CheckOrImmMatcher - This checks to see if the current node is an 'and'
621/// with something equivalent to the specified immediate.
622class CheckOrImmMatcher : public Matcher {
623  int64_t Value;
624public:
625  CheckOrImmMatcher(int64_t value)
626    : Matcher(CheckOrImm), Value(value) {}
627
628  int64_t getValue() const { return Value; }
629
630  static inline bool classof(const Matcher *N) {
631    return N->getKind() == CheckOrImm;
632  }
633
634  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
635
636private:
637  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
638  virtual bool isEqualImpl(const Matcher *M) const {
639    return cast<CheckOrImmMatcher>(M)->Value == Value;
640  }
641  virtual unsigned getHashImpl() const { return Value; }
642};
643
644/// CheckFoldableChainNodeMatcher - This checks to see if the current node
645/// (which defines a chain operand) is safe to fold into a larger pattern.
646class CheckFoldableChainNodeMatcher : public Matcher {
647public:
648  CheckFoldableChainNodeMatcher()
649    : Matcher(CheckFoldableChainNode) {}
650
651  static inline bool classof(const Matcher *N) {
652    return N->getKind() == CheckFoldableChainNode;
653  }
654
655  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
656
657private:
658  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
659  virtual bool isEqualImpl(const Matcher *M) const { return true; }
660  virtual unsigned getHashImpl() const { return 0; }
661};
662
663/// CheckChainCompatibleMatcher - Verify that the current node's chain
664/// operand is 'compatible' with the specified recorded node's.
665class CheckChainCompatibleMatcher : public Matcher {
666  unsigned PreviousOp;
667public:
668  CheckChainCompatibleMatcher(unsigned previousop)
669    : Matcher(CheckChainCompatible), PreviousOp(previousop) {}
670
671  unsigned getPreviousOp() const { return PreviousOp; }
672
673  static inline bool classof(const Matcher *N) {
674    return N->getKind() == CheckChainCompatible;
675  }
676
677  virtual bool isSafeToReorderWithPatternPredicate() const { return true; }
678
679private:
680  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
681  virtual bool isEqualImpl(const Matcher *M) const {
682    return cast<CheckChainCompatibleMatcher>(M)->PreviousOp == PreviousOp;
683  }
684  virtual unsigned getHashImpl() const { return PreviousOp; }
685};
686
687/// EmitIntegerMatcher - This creates a new TargetConstant.
688class EmitIntegerMatcher : public Matcher {
689  int64_t Val;
690  MVT::SimpleValueType VT;
691public:
692  EmitIntegerMatcher(int64_t val, MVT::SimpleValueType vt)
693    : Matcher(EmitInteger), Val(val), VT(vt) {}
694
695  int64_t getValue() const { return Val; }
696  MVT::SimpleValueType getVT() const { return VT; }
697
698  static inline bool classof(const Matcher *N) {
699    return N->getKind() == EmitInteger;
700  }
701
702private:
703  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
704  virtual bool isEqualImpl(const Matcher *M) const {
705    return cast<EmitIntegerMatcher>(M)->Val == Val &&
706           cast<EmitIntegerMatcher>(M)->VT == VT;
707  }
708  virtual unsigned getHashImpl() const { return (Val << 4) | VT; }
709};
710
711/// EmitStringIntegerMatcher - A target constant whose value is represented
712/// by a string.
713class EmitStringIntegerMatcher : public Matcher {
714  std::string Val;
715  MVT::SimpleValueType VT;
716public:
717  EmitStringIntegerMatcher(const std::string &val, MVT::SimpleValueType vt)
718    : Matcher(EmitStringInteger), Val(val), VT(vt) {}
719
720  const std::string &getValue() const { return Val; }
721  MVT::SimpleValueType getVT() const { return VT; }
722
723  static inline bool classof(const Matcher *N) {
724    return N->getKind() == EmitStringInteger;
725  }
726
727private:
728  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
729  virtual bool isEqualImpl(const Matcher *M) const {
730    return cast<EmitStringIntegerMatcher>(M)->Val == Val &&
731           cast<EmitStringIntegerMatcher>(M)->VT == VT;
732  }
733  virtual unsigned getHashImpl() const;
734};
735
736/// EmitRegisterMatcher - This creates a new TargetConstant.
737class EmitRegisterMatcher : public Matcher {
738  /// Reg - The def for the register that we're emitting.  If this is null, then
739  /// this is a reference to zero_reg.
740  Record *Reg;
741  MVT::SimpleValueType VT;
742public:
743  EmitRegisterMatcher(Record *reg, MVT::SimpleValueType vt)
744    : Matcher(EmitRegister), Reg(reg), VT(vt) {}
745
746  Record *getReg() const { return Reg; }
747  MVT::SimpleValueType getVT() const { return VT; }
748
749  static inline bool classof(const Matcher *N) {
750    return N->getKind() == EmitRegister;
751  }
752
753private:
754  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
755  virtual bool isEqualImpl(const Matcher *M) const {
756    return cast<EmitRegisterMatcher>(M)->Reg == Reg &&
757           cast<EmitRegisterMatcher>(M)->VT == VT;
758  }
759  virtual unsigned getHashImpl() const {
760    return ((unsigned)(intptr_t)Reg) << 4 | VT;
761  }
762};
763
764/// EmitConvertToTargetMatcher - Emit an operation that reads a specified
765/// recorded node and converts it from being a ISD::Constant to
766/// ISD::TargetConstant, likewise for ConstantFP.
767class EmitConvertToTargetMatcher : public Matcher {
768  unsigned Slot;
769public:
770  EmitConvertToTargetMatcher(unsigned slot)
771    : Matcher(EmitConvertToTarget), Slot(slot) {}
772
773  unsigned getSlot() const { return Slot; }
774
775  static inline bool classof(const Matcher *N) {
776    return N->getKind() == EmitConvertToTarget;
777  }
778
779private:
780  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
781  virtual bool isEqualImpl(const Matcher *M) const {
782    return cast<EmitConvertToTargetMatcher>(M)->Slot == Slot;
783  }
784  virtual unsigned getHashImpl() const { return Slot; }
785};
786
787/// EmitMergeInputChainsMatcher - Emit a node that merges a list of input
788/// chains together with a token factor.  The list of nodes are the nodes in the
789/// matched pattern that have chain input/outputs.  This node adds all input
790/// chains of these nodes if they are not themselves a node in the pattern.
791class EmitMergeInputChainsMatcher : public Matcher {
792  SmallVector<unsigned, 3> ChainNodes;
793public:
794  EmitMergeInputChainsMatcher(const unsigned *nodes, unsigned NumNodes)
795    : Matcher(EmitMergeInputChains), ChainNodes(nodes, nodes+NumNodes) {}
796
797  unsigned getNumNodes() const { return ChainNodes.size(); }
798
799  unsigned getNode(unsigned i) const {
800    assert(i < ChainNodes.size());
801    return ChainNodes[i];
802  }
803
804  static inline bool classof(const Matcher *N) {
805    return N->getKind() == EmitMergeInputChains;
806  }
807
808private:
809  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
810  virtual bool isEqualImpl(const Matcher *M) const {
811    return cast<EmitMergeInputChainsMatcher>(M)->ChainNodes == ChainNodes;
812  }
813  virtual unsigned getHashImpl() const;
814};
815
816/// EmitCopyToRegMatcher - Emit a CopyToReg node from a value to a physreg,
817/// pushing the chain and flag results.
818///
819class EmitCopyToRegMatcher : public Matcher {
820  unsigned SrcSlot; // Value to copy into the physreg.
821  Record *DestPhysReg;
822public:
823  EmitCopyToRegMatcher(unsigned srcSlot, Record *destPhysReg)
824    : Matcher(EmitCopyToReg), SrcSlot(srcSlot), DestPhysReg(destPhysReg) {}
825
826  unsigned getSrcSlot() const { return SrcSlot; }
827  Record *getDestPhysReg() const { return DestPhysReg; }
828
829  static inline bool classof(const Matcher *N) {
830    return N->getKind() == EmitCopyToReg;
831  }
832
833private:
834  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
835  virtual bool isEqualImpl(const Matcher *M) const {
836    return cast<EmitCopyToRegMatcher>(M)->SrcSlot == SrcSlot &&
837           cast<EmitCopyToRegMatcher>(M)->DestPhysReg == DestPhysReg;
838  }
839  virtual unsigned getHashImpl() const {
840    return SrcSlot ^ ((unsigned)(intptr_t)DestPhysReg << 4);
841  }
842};
843
844
845
846/// EmitNodeXFormMatcher - Emit an operation that runs an SDNodeXForm on a
847/// recorded node and records the result.
848class EmitNodeXFormMatcher : public Matcher {
849  unsigned Slot;
850  Record *NodeXForm;
851public:
852  EmitNodeXFormMatcher(unsigned slot, Record *nodeXForm)
853    : Matcher(EmitNodeXForm), Slot(slot), NodeXForm(nodeXForm) {}
854
855  unsigned getSlot() const { return Slot; }
856  Record *getNodeXForm() const { return NodeXForm; }
857
858  static inline bool classof(const Matcher *N) {
859    return N->getKind() == EmitNodeXForm;
860  }
861
862private:
863  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
864  virtual bool isEqualImpl(const Matcher *M) const {
865    return cast<EmitNodeXFormMatcher>(M)->Slot == Slot &&
866           cast<EmitNodeXFormMatcher>(M)->NodeXForm == NodeXForm;
867  }
868  virtual unsigned getHashImpl() const {
869    return Slot ^ ((unsigned)(intptr_t)NodeXForm << 4);
870  }
871};
872
873/// EmitNodeMatcherCommon - Common class shared between EmitNode and
874/// MorphNodeTo.
875class EmitNodeMatcherCommon : public Matcher {
876  std::string OpcodeName;
877  const SmallVector<MVT::SimpleValueType, 3> VTs;
878  const SmallVector<unsigned, 6> Operands;
879  bool HasChain, HasInFlag, HasOutFlag, HasMemRefs;
880
881  /// NumFixedArityOperands - If this is a fixed arity node, this is set to -1.
882  /// If this is a varidic node, this is set to the number of fixed arity
883  /// operands in the root of the pattern.  The rest are appended to this node.
884  int NumFixedArityOperands;
885public:
886  EmitNodeMatcherCommon(const std::string &opcodeName,
887                        const MVT::SimpleValueType *vts, unsigned numvts,
888                        const unsigned *operands, unsigned numops,
889                        bool hasChain, bool hasInFlag, bool hasOutFlag,
890                        bool hasmemrefs,
891                        int numfixedarityoperands, bool isMorphNodeTo)
892    : Matcher(isMorphNodeTo ? MorphNodeTo : EmitNode), OpcodeName(opcodeName),
893      VTs(vts, vts+numvts), Operands(operands, operands+numops),
894      HasChain(hasChain), HasInFlag(hasInFlag), HasOutFlag(hasOutFlag),
895      HasMemRefs(hasmemrefs), NumFixedArityOperands(numfixedarityoperands) {}
896
897  const std::string &getOpcodeName() const { return OpcodeName; }
898
899  unsigned getNumVTs() const { return VTs.size(); }
900  MVT::SimpleValueType getVT(unsigned i) const {
901    assert(i < VTs.size());
902    return VTs[i];
903  }
904
905  /// getNumNonChainFlagVTs - Return the number of normal results that this node
906  /// will have, ignoring flag and chain results.
907  unsigned getNumNonChainFlagVTs() const {
908    for (unsigned i = 0, e = getNumVTs(); i != e; ++i)
909      if (VTs[i] == MVT::Flag || VTs[i] == MVT::Other)
910        return i;
911    return getNumVTs();
912  }
913
914  unsigned getNumOperands() const { return Operands.size(); }
915  unsigned getOperand(unsigned i) const {
916    assert(i < Operands.size());
917    return Operands[i];
918  }
919
920  const SmallVectorImpl<MVT::SimpleValueType> &getVTList() const { return VTs; }
921  const SmallVectorImpl<unsigned> &getOperandList() const { return Operands; }
922
923
924  bool hasChain() const { return HasChain; }
925  bool hasInFlag() const { return HasInFlag; }
926  bool hasOutFlag() const { return HasOutFlag; }
927  bool hasMemRefs() const { return HasMemRefs; }
928  int getNumFixedArityOperands() const { return NumFixedArityOperands; }
929
930  static inline bool classof(const Matcher *N) {
931    return N->getKind() == EmitNode || N->getKind() == MorphNodeTo;
932  }
933
934private:
935  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
936  virtual bool isEqualImpl(const Matcher *M) const;
937  virtual unsigned getHashImpl() const;
938};
939
940/// EmitNodeMatcher - This signals a successful match and generates a node.
941class EmitNodeMatcher : public EmitNodeMatcherCommon {
942  unsigned FirstResultSlot;
943public:
944  EmitNodeMatcher(const std::string &opcodeName,
945                  const MVT::SimpleValueType *vts, unsigned numvts,
946                  const unsigned *operands, unsigned numops,
947                  bool hasChain, bool hasInFlag, bool hasOutFlag,
948                  bool hasmemrefs,
949                  int numfixedarityoperands, unsigned firstresultslot)
950  : EmitNodeMatcherCommon(opcodeName, vts, numvts, operands, numops, hasChain,
951                          hasInFlag, hasOutFlag, hasmemrefs,
952                          numfixedarityoperands, false),
953    FirstResultSlot(firstresultslot) {}
954
955  unsigned getFirstResultSlot() const { return FirstResultSlot; }
956
957  static inline bool classof(const Matcher *N) {
958    return N->getKind() == EmitNode;
959  }
960
961};
962
963class MorphNodeToMatcher : public EmitNodeMatcherCommon {
964  const PatternToMatch &Pattern;
965public:
966  MorphNodeToMatcher(const std::string &opcodeName,
967                     const MVT::SimpleValueType *vts, unsigned numvts,
968                     const unsigned *operands, unsigned numops,
969                     bool hasChain, bool hasInFlag, bool hasOutFlag,
970                     bool hasmemrefs,
971                     int numfixedarityoperands, const PatternToMatch &pattern)
972    : EmitNodeMatcherCommon(opcodeName, vts, numvts, operands, numops, hasChain,
973                            hasInFlag, hasOutFlag, hasmemrefs,
974                            numfixedarityoperands, true),
975      Pattern(pattern) {
976  }
977
978  const PatternToMatch &getPattern() const { return Pattern; }
979
980  static inline bool classof(const Matcher *N) {
981    return N->getKind() == MorphNodeTo;
982  }
983};
984
985/// MarkFlagResultsMatcher - This node indicates which non-root nodes in the
986/// pattern produce flags.  This allows CompleteMatchMatcher to update them
987/// with the output flag of the resultant code.
988class MarkFlagResultsMatcher : public Matcher {
989  SmallVector<unsigned, 3> FlagResultNodes;
990public:
991  MarkFlagResultsMatcher(const unsigned *nodes, unsigned NumNodes)
992    : Matcher(MarkFlagResults), FlagResultNodes(nodes, nodes+NumNodes) {}
993
994  unsigned getNumNodes() const { return FlagResultNodes.size(); }
995
996  unsigned getNode(unsigned i) const {
997    assert(i < FlagResultNodes.size());
998    return FlagResultNodes[i];
999  }
1000
1001  static inline bool classof(const Matcher *N) {
1002    return N->getKind() == MarkFlagResults;
1003  }
1004
1005private:
1006  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
1007  virtual bool isEqualImpl(const Matcher *M) const {
1008    return cast<MarkFlagResultsMatcher>(M)->FlagResultNodes == FlagResultNodes;
1009  }
1010  virtual unsigned getHashImpl() const;
1011};
1012
1013/// CompleteMatchMatcher - Complete a match by replacing the results of the
1014/// pattern with the newly generated nodes.  This also prints a comment
1015/// indicating the source and dest patterns.
1016class CompleteMatchMatcher : public Matcher {
1017  SmallVector<unsigned, 2> Results;
1018  const PatternToMatch &Pattern;
1019public:
1020  CompleteMatchMatcher(const unsigned *results, unsigned numresults,
1021                       const PatternToMatch &pattern)
1022  : Matcher(CompleteMatch), Results(results, results+numresults),
1023    Pattern(pattern) {}
1024
1025  unsigned getNumResults() const { return Results.size(); }
1026  unsigned getResult(unsigned R) const { return Results[R]; }
1027  const PatternToMatch &getPattern() const { return Pattern; }
1028
1029  static inline bool classof(const Matcher *N) {
1030    return N->getKind() == CompleteMatch;
1031  }
1032
1033private:
1034  virtual void printImpl(raw_ostream &OS, unsigned indent) const;
1035  virtual bool isEqualImpl(const Matcher *M) const {
1036    return cast<CompleteMatchMatcher>(M)->Results == Results &&
1037          &cast<CompleteMatchMatcher>(M)->Pattern == &Pattern;
1038  }
1039  virtual unsigned getHashImpl() const;
1040};
1041
1042} // end namespace llvm
1043
1044#endif
1045