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