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