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