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 { 204a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach struct CodeGenRegister; 21da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner class CodeGenDAGPatterns; 22b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner class Matcher; 23da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner class PatternToMatch; 24da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner class raw_ostream; 25da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner class ComplexPattern; 26845c04273461b2a10754a1455b02916a19ea72aaChris Lattner class Record; 27a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner class SDNodeInfo; 28543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner class TreePredicateFn; 29543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner class TreePattern; 30da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 31fa342faef9d1c89de356ed83a6c6529ed3e87610Chris LattnerMatcher *ConvertPatternToMatcher(const PatternToMatch &Pattern,unsigned Variant, 32b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner const CodeGenDAGPatterns &CGP); 33c78f2a39945339752a163949a2d7c27f28635d99Chris LattnerMatcher *OptimizeMatcher(Matcher *Matcher, const CodeGenDAGPatterns &CGP); 344d0c931ba7758a98864dc7e968a10df7fed7ab70Chris Lattnervoid EmitMatcherTable(const Matcher *Matcher, const CodeGenDAGPatterns &CGP, 354a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach raw_ostream &OS); 36da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 37fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 38b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// Matcher - Base class for all the the DAG ISel Matcher representation 39da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// nodes. 40b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass Matcher { 41bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner // The next matcher node that is executed after this one. Null if this is the 42bd8227f5298f0ab7b96203a6d3875e5d26573376Chris Lattner // last stage of a match. 43b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner OwningPtr<Matcher> Next; 442d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 45da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 46da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner enum KindTy { 478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner // Matcher state manipulation. 4860df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner Scope, // Push a checking scope. 498e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner RecordNode, // Record the current node. 5019b5a7590b784f19875b9880ea8838c393431656Chris Lattner RecordChild, // Record a child of the current node. 518e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner RecordMemRef, // Record the memref in the current node. 528950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner CaptureGlueInput, // If the current node has an input glue, save it. 538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner MoveChild, // Move current node to specified child. 548e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner MoveParent, // Move current node to parent. 55fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 56845c04273461b2a10754a1455b02916a19ea72aaChris Lattner // Predicate checking. 578e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner CheckSame, // Fail if not same as prev match. 58da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner CheckPatternPredicate, 598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner CheckPredicate, // Fail if node predicate fails. 608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner CheckOpcode, // Fail if not opcode. 61eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner SwitchOpcode, // Dispatch based on opcode. 628e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner CheckType, // Fail if not correct type. 63cfe2eab7446dedc471592fe702fefef783383171Chris Lattner SwitchType, // Dispatch based on type. 6423cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner CheckChildType, // Fail if child has wrong type. 658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner CheckInteger, // Fail if wrong val. 668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner CheckCondCode, // Fail if not condcode. 67da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner CheckValueType, 68da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner CheckComplexPat, 69da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner CheckAndImm, 70e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner CheckOrImm, 719a747f1305e76025df2323a03b805a284f2cde77Chris Lattner CheckFoldableChainNode, 72fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 73845c04273461b2a10754a1455b02916a19ea72aaChris Lattner // Node creation/emisssion. 748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner EmitInteger, // Create a TargetConstant 758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner EmitStringInteger, // Create a TargetConstant from a string. 768e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner EmitRegister, // Create a register. 778e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner EmitConvertToTarget, // Convert a imm/fpimm to target imm/fpimm 788e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner EmitMergeInputChains, // Merge together a chains for an input. 798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner EmitCopyToReg, // Emit a copytoreg into a physreg. 808e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner EmitNode, // Create a DAG node 818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner EmitNodeXForm, // Run a SDNodeXForm 828950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner MarkGlueResults, // Indicate which interior nodes have glue results. 83e86097af5598e44727875f00e492d43c978239beChris Lattner CompleteMatch, // Finish a match and update the results. 849a21500edc485a2c383a03fba429943f031c1398Chris Lattner MorphNodeTo // Build a node, finish a match and update results. 85da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner }; 86da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner const KindTy Kind; 878ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner 88da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerprotected: 89b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner Matcher(KindTy K) : Kind(K) {} 90da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 91b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner virtual ~Matcher() {} 92fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 93da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner KindTy getKind() const { return Kind; } 948ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattner 95b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner Matcher *getNext() { return Next.get(); } 96b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner const Matcher *getNext() const { return Next.get(); } 97b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner void setNext(Matcher *C) { Next.reset(C); } 98b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner Matcher *takeNext() { return Next.take(); } 9919b5a7590b784f19875b9880ea8838c393431656Chris Lattner 100b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner OwningPtr<Matcher> &getNextPtr() { return Next; } 101fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 102b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *) { return true; } 103fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 10458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner bool isEqual(const Matcher *M) const { 10558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner if (getKind() != M->getKind()) return false; 10658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return isEqualImpl(M); 10758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 108fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 10958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner unsigned getHash() const { 110ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner // Clear the high bit so we don't conflict with tombstones etc. 111ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner return ((getHashImpl() << 4) ^ getKind()) & (~0U>>1); 11258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 113fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 114d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner /// isSafeToReorderWithPatternPredicate - Return true if it is safe to sink a 115d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner /// PatternPredicate node past this one. 116d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { 117d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner return false; 118d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner } 119fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 12048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// isSimplePredicateNode - Return true if this is a simple predicate that 12148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// operates on the node or its children without potential side effects or a 12248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// change of the current node. 12348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner bool isSimplePredicateNode() const { 12448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner switch (getKind()) { 12548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner default: return false; 12648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckSame: 12748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckPatternPredicate: 12848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckPredicate: 12948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckOpcode: 13048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckType: 13148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckChildType: 13248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckInteger: 13348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckCondCode: 13448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckValueType: 13548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckAndImm: 13648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckOrImm: 13748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner case CheckFoldableChainNode: 13848aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner return true; 13948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner } 14048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner } 141fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 14248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// isSimplePredicateOrRecordNode - Return true if this is a record node or 14348aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// a simple predicate. 14448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner bool isSimplePredicateOrRecordNode() const { 14548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner return isSimplePredicateNode() || 14648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner getKind() == RecordNode || getKind() == RecordChild; 14748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner } 148fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 14948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// unlinkNode - Unlink the specified node from this chain. If Other == this, 15048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// we unlink the next pointer and return it. Otherwise we unlink Other from 15148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// the list and return this. 15248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner Matcher *unlinkNode(Matcher *Other); 153fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 15448aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// canMoveBefore - Return true if this matcher is the same as Other, or if 15548aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// we can move this matcher past all of the nodes in-between Other and this 15648aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// node. Other must be equal to or before this. 15748aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner bool canMoveBefore(const Matcher *Other) const; 158fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 15948aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// canMoveBefore - Return true if it is safe to move the current matcher 16048aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner /// across the specified one. 16148aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner bool canMoveBeforeNode(const Matcher *Other) const; 162fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 16382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner /// isContradictory - Return true of these two matchers could never match on 16482781b938af4057df90b5fa4035781ddc4aa681aChris Lattner /// the same node. 16582781b938af4057df90b5fa4035781ddc4aa681aChris Lattner bool isContradictory(const Matcher *Other) const { 16682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // Since this predicate is reflexive, we canonicalize the ordering so that 16782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // we always match a node against nodes with kinds that are greater or equal 16882781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // to them. For example, we'll pass in a CheckType node as an argument to 16982781b938af4057df90b5fa4035781ddc4aa681aChris Lattner // the CheckOpcode method, not the other way around. 17082781b938af4057df90b5fa4035781ddc4aa681aChris Lattner if (getKind() < Other->getKind()) 17182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return isContradictoryImpl(Other); 17282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner return Other->isContradictoryImpl(this); 17382781b938af4057df90b5fa4035781ddc4aa681aChris Lattner } 174fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 175a5028a64634f995630e93390c5c23374a09a450fChris Lattner void print(raw_ostream &OS, unsigned indent = 0) const; 17682781b938af4057df90b5fa4035781ddc4aa681aChris Lattner void printOne(raw_ostream &OS) const; 177da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner void dump() const; 1788ef9c7958ad7a23ad15d7ff59e1377aec10ca42aChris Lattnerprotected: 179a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const = 0; 18058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const = 0; 18158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const = 0; 18282781b938af4057df90b5fa4035781ddc4aa681aChris Lattner virtual bool isContradictoryImpl(const Matcher *M) const { return false; } 183da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 184fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 185d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner/// ScopeMatcher - This attempts to match each of its children to find the first 186d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner/// one that successfully matches. If one child fails, it tries the next child. 187d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner/// If none of the children match then this check fails. It never has a 'next'. 188b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass ScopeMatcher : public Matcher { 189d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner SmallVector<Matcher*, 4> Children; 190da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 191d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner ScopeMatcher(Matcher *const *children, unsigned numchildren) 192d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner : Matcher(Scope), Children(children, children+numchildren) { 193da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 194d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner virtual ~ScopeMatcher(); 195fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 196d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner unsigned getNumChildren() const { return Children.size(); } 197fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 198d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner Matcher *getChild(unsigned i) { return Children[i]; } 199d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner const Matcher *getChild(unsigned i) const { return Children[i]; } 200fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 201d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner void resetChild(unsigned i, Matcher *N) { 202d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner delete Children[i]; 203d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner Children[i] = N; 204d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner } 205d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner 206d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner Matcher *takeChild(unsigned i) { 207d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner Matcher *Res = Children[i]; 208d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner Children[i] = 0; 209d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner return Res; 210d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner } 211fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 212ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner void setNumChildren(unsigned NC) { 213ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner if (NC < Children.size()) { 214ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner // delete any children we're about to lose pointers to. 215ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner for (unsigned i = NC, e = Children.size(); i != e; ++i) 216ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner delete Children[i]; 217ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner } 218ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner Children.resize(NC); 219ca56feaf381db61ad1f07873235185ef33f6426fChris Lattner } 220da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 221b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 22260df53e30a7e39c884f4ca4eb03346bea5825109Chris Lattner return N->getKind() == Scope; 223da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 224fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 22558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 226a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 22758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { return false; } 228d6c84720df0b63e34081e0c7890f3074d8b110b9Chris Lattner virtual unsigned getHashImpl() const { return 12312; } 229da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 230da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 231b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// RecordMatcher - Save the current node in the operand list. 232b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass RecordMatcher : public Matcher { 233c96087b3433582f1c2bdb4f0ad3dad7f0b350339Chris Lattner /// WhatFor - This is a string indicating why we're recording this. This 234c96087b3433582f1c2bdb4f0ad3dad7f0b350339Chris Lattner /// should only be used for comment generation not anything semantic. 235c96087b3433582f1c2bdb4f0ad3dad7f0b350339Chris Lattner std::string WhatFor; 236fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 2370cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner /// ResultNo - The slot number in the RecordedNodes vector that this will be, 2380cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner /// just printed as a comment. 2390cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner unsigned ResultNo; 240da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 2410cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner RecordMatcher(const std::string &whatfor, unsigned resultNo) 2420cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner : Matcher(RecordNode), WhatFor(whatfor), ResultNo(resultNo) {} 243fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 244c642b84fb866c3a6f1e61d39d6eda89563267b53Chris Lattner const std::string &getWhatFor() const { return WhatFor; } 2450cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner unsigned getResultNo() const { return ResultNo; } 246fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 247b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 248845c04273461b2a10754a1455b02916a19ea72aaChris Lattner return N->getKind() == RecordNode; 249da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 250fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 251d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 25258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 253a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 25458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { return true; } 25558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return 0; } 256da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 257fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 258b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// RecordChildMatcher - Save a numbered child of the current node, or fail 25919b5a7590b784f19875b9880ea8838c393431656Chris Lattner/// the match if it doesn't exist. This is logically equivalent to: 26019b5a7590b784f19875b9880ea8838c393431656Chris Lattner/// MoveChild N + RecordNode + MoveParent. 261b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass RecordChildMatcher : public Matcher { 26219b5a7590b784f19875b9880ea8838c393431656Chris Lattner unsigned ChildNo; 263fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 26419b5a7590b784f19875b9880ea8838c393431656Chris Lattner /// WhatFor - This is a string indicating why we're recording this. This 26519b5a7590b784f19875b9880ea8838c393431656Chris Lattner /// should only be used for comment generation not anything semantic. 26619b5a7590b784f19875b9880ea8838c393431656Chris Lattner std::string WhatFor; 267fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 2680cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner /// ResultNo - The slot number in the RecordedNodes vector that this will be, 2690cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner /// just printed as a comment. 2700cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner unsigned ResultNo; 27119b5a7590b784f19875b9880ea8838c393431656Chris Lattnerpublic: 2720cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner RecordChildMatcher(unsigned childno, const std::string &whatfor, 2730cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner unsigned resultNo) 2740cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner : Matcher(RecordChild), ChildNo(childno), WhatFor(whatfor), 2750cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner ResultNo(resultNo) {} 276fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 27719b5a7590b784f19875b9880ea8838c393431656Chris Lattner unsigned getChildNo() const { return ChildNo; } 27819b5a7590b784f19875b9880ea8838c393431656Chris Lattner const std::string &getWhatFor() const { return WhatFor; } 2790cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner unsigned getResultNo() const { return ResultNo; } 2800cebe6181af8a2cf5e6cf9497cda4c47b426a0f8Chris Lattner 281b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 28219b5a7590b784f19875b9880ea8838c393431656Chris Lattner return N->getKind() == RecordChild; 28319b5a7590b784f19875b9880ea8838c393431656Chris Lattner } 284fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 285d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 286d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 28758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 288a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 28958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 29058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<RecordChildMatcher>(M)->getChildNo() == getChildNo(); 29158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 29258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return getChildNo(); } 29319b5a7590b784f19875b9880ea8838c393431656Chris Lattner}; 294fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 295b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// RecordMemRefMatcher - Save the current node's memref. 296b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass RecordMemRefMatcher : public Matcher { 2978e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic: 298b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner RecordMemRefMatcher() : Matcher(RecordMemRef) {} 299fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 300b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 3018e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return N->getKind() == RecordMemRef; 3028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 303fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 304d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 305d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 30658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 307a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 30858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { return true; } 30958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return 0; } 3108e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}; 3118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 312fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 3138950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner/// CaptureGlueInputMatcher - If the current record has a glue input, record 3148e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// it so that it is used as an input to the generated code. 3158950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnerclass CaptureGlueInputMatcher : public Matcher { 3168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic: 3178950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner CaptureGlueInputMatcher() : Matcher(CaptureGlueInput) {} 318fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 319b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 3208950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner return N->getKind() == CaptureGlueInput; 3218e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 322fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 323d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 324d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 32558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 326a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 32758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { return true; } 32858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return 0; } 3298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}; 330fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 331b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// MoveChildMatcher - This tells the interpreter to move into the 332da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// specified child node. 333b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass MoveChildMatcher : public Matcher { 334da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned ChildNo; 335da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 336b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner MoveChildMatcher(unsigned childNo) : Matcher(MoveChild), ChildNo(childNo) {} 337fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 338da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned getChildNo() const { return ChildNo; } 339fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 340b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 341da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == MoveChild; 342da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 343fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 344d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 345d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 34658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 347a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 34858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 34958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<MoveChildMatcher>(M)->getChildNo() == getChildNo(); 35058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 35158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return getChildNo(); } 352da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 353fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 354b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// MoveParentMatcher - This tells the interpreter to move to the parent 355da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// of the current node. 356b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass MoveParentMatcher : public Matcher { 357da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 358b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner MoveParentMatcher() : Matcher(MoveParent) {} 359fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 360b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 361da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == MoveParent; 362da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 363fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 364d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 365d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 36658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 367a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 36858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { return true; } 36958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return 0; } 370da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 371da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 372b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckSameMatcher - This checks to see if this node is exactly the same 373da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// node as the specified match that was recorded with 'Record'. This is used 374da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// when patterns have the same name in them, like '(mul GPR:$in, GPR:$in)'. 375b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckSameMatcher : public Matcher { 376da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned MatchNumber; 377da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 378b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner CheckSameMatcher(unsigned matchnumber) 37958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner : Matcher(CheckSame), MatchNumber(matchnumber) {} 380fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 381da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner unsigned getMatchNumber() const { return MatchNumber; } 382fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 383b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 384da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckSame; 385da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 386fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 387d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 388d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 38958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 390a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 39158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 39258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<CheckSameMatcher>(M)->getMatchNumber() == getMatchNumber(); 39358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 39458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return getMatchNumber(); } 395da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 396fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 397b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckPatternPredicateMatcher - This checks the target-specific predicate 398da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// to see if the entire pattern is capable of matching. This predicate does 399da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// not take a node as input. This is used for subtarget feature checks etc. 400b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckPatternPredicateMatcher : public Matcher { 401da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner std::string Predicate; 402da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 403b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner CheckPatternPredicateMatcher(StringRef predicate) 40458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner : Matcher(CheckPatternPredicate), Predicate(predicate) {} 405fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 406da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner StringRef getPredicate() const { return Predicate; } 407fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 408b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 409da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckPatternPredicate; 410da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 411fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 412d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 413d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 41458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 415a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 41658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 41758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<CheckPatternPredicateMatcher>(M)->getPredicate() == Predicate; 41858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 41958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const; 420da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 421fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 422b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckPredicateMatcher - This checks the target-specific predicate to 423da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// see if the node is acceptable. 424b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckPredicateMatcher : public Matcher { 425543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner TreePattern *Pred; 426da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 427543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner CheckPredicateMatcher(const TreePredicateFn &pred); 428fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 429543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner TreePredicateFn getPredicate() const; 430da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 431b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 432da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckPredicate; 433da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 434fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 435d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner // TODO: Ok? 436d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner //virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 437d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 43858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 439a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 44058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 441543790673c747ab2793fc657e239ce5f78419dc0Chris Lattner return cast<CheckPredicateMatcher>(M)->Pred == Pred; 44258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 44358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const; 444da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 445fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 446fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 447b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckOpcodeMatcher - This checks to see if the current node has the 448da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// specified opcode, if not it fails to match. 449b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckOpcodeMatcher : public Matcher { 450a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner const SDNodeInfo &Opcode; 451da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 452a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner CheckOpcodeMatcher(const SDNodeInfo &opcode) 453a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner : Matcher(CheckOpcode), Opcode(opcode) {} 454fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 455a230f9623d864450d432bb76c397b0cb35a3437eChris Lattner const SDNodeInfo &getOpcode() const { return Opcode; } 456fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 457b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 458da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckOpcode; 459da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 460fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 461d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 462d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 46358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 464a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 465eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner virtual bool isEqualImpl(const Matcher *M) const; 46658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const; 46782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner virtual bool isContradictoryImpl(const Matcher *M) const; 468da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 469eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 470eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner/// SwitchOpcodeMatcher - Switch based on the current node's opcode, dispatching 471eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner/// to one matcher per opcode. If the opcode doesn't match any of the cases, 472eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner/// then the match fails. This is semantically equivalent to a Scope node where 473eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner/// every child does a CheckOpcode, but is much faster. 474eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerclass SwitchOpcodeMatcher : public Matcher { 475eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner SmallVector<std::pair<const SDNodeInfo*, Matcher*>, 8> Cases; 476eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerpublic: 477eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner SwitchOpcodeMatcher(const std::pair<const SDNodeInfo*, Matcher*> *cases, 478eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner unsigned numcases) 479eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner : Matcher(SwitchOpcode), Cases(cases, cases+numcases) {} 480eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner 481eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner static inline bool classof(const Matcher *N) { 482eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner return N->getKind() == SwitchOpcode; 483eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner } 484fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 485eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner unsigned getNumCases() const { return Cases.size(); } 486fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 487eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner const SDNodeInfo &getCaseOpcode(unsigned i) const { return *Cases[i].first; } 488eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner Matcher *getCaseMatcher(unsigned i) { return Cases[i].second; } 489eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner const Matcher *getCaseMatcher(unsigned i) const { return Cases[i].second; } 490fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 491eb66921adb943ea841e72c8eee4777607c48b70eChris Lattnerprivate: 492eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 493eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner virtual bool isEqualImpl(const Matcher *M) const { return false; } 494eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner virtual unsigned getHashImpl() const { return 4123; } 495eb66921adb943ea841e72c8eee4777607c48b70eChris Lattner}; 496fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 497b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckTypeMatcher - This checks to see if the current node has the 498084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner/// specified type at the specified result, if not it fails to match. 499b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckTypeMatcher : public Matcher { 500da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner MVT::SimpleValueType Type; 501084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner unsigned ResNo; 502da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 503084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner CheckTypeMatcher(MVT::SimpleValueType type, unsigned resno) 504084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner : Matcher(CheckType), Type(type), ResNo(resno) {} 505fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 506da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner MVT::SimpleValueType getType() const { return Type; } 507084df627c82fdf4e1829723edf0a833b5bc31f89Chris Lattner unsigned getResNo() const { return ResNo; } 508fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 509b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 510da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckType; 511da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 512fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 513d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 514d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 51558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 516a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 51758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 51838717f6ccfaa926ffa614f4232d744d4b50f5798Chris Lattner return cast<CheckTypeMatcher>(M)->Type == Type; 51958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 52058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return Type; } 52182781b938af4057df90b5fa4035781ddc4aa681aChris Lattner virtual bool isContradictoryImpl(const Matcher *M) const; 522da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 523fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 524cfe2eab7446dedc471592fe702fefef783383171Chris Lattner/// SwitchTypeMatcher - Switch based on the current node's type, dispatching 525cfe2eab7446dedc471592fe702fefef783383171Chris Lattner/// to one matcher per case. If the type doesn't match any of the cases, 526cfe2eab7446dedc471592fe702fefef783383171Chris Lattner/// then the match fails. This is semantically equivalent to a Scope node where 527cfe2eab7446dedc471592fe702fefef783383171Chris Lattner/// every child does a CheckType, but is much faster. 528cfe2eab7446dedc471592fe702fefef783383171Chris Lattnerclass SwitchTypeMatcher : public Matcher { 529cfe2eab7446dedc471592fe702fefef783383171Chris Lattner SmallVector<std::pair<MVT::SimpleValueType, Matcher*>, 8> Cases; 530cfe2eab7446dedc471592fe702fefef783383171Chris Lattnerpublic: 531cfe2eab7446dedc471592fe702fefef783383171Chris Lattner SwitchTypeMatcher(const std::pair<MVT::SimpleValueType, Matcher*> *cases, 532cfe2eab7446dedc471592fe702fefef783383171Chris Lattner unsigned numcases) 533cfe2eab7446dedc471592fe702fefef783383171Chris Lattner : Matcher(SwitchType), Cases(cases, cases+numcases) {} 534fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 535cfe2eab7446dedc471592fe702fefef783383171Chris Lattner static inline bool classof(const Matcher *N) { 536cfe2eab7446dedc471592fe702fefef783383171Chris Lattner return N->getKind() == SwitchType; 537cfe2eab7446dedc471592fe702fefef783383171Chris Lattner } 538fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 539cfe2eab7446dedc471592fe702fefef783383171Chris Lattner unsigned getNumCases() const { return Cases.size(); } 540fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 541cfe2eab7446dedc471592fe702fefef783383171Chris Lattner MVT::SimpleValueType getCaseType(unsigned i) const { return Cases[i].first; } 542cfe2eab7446dedc471592fe702fefef783383171Chris Lattner Matcher *getCaseMatcher(unsigned i) { return Cases[i].second; } 543cfe2eab7446dedc471592fe702fefef783383171Chris Lattner const Matcher *getCaseMatcher(unsigned i) const { return Cases[i].second; } 544fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 545cfe2eab7446dedc471592fe702fefef783383171Chris Lattnerprivate: 546cfe2eab7446dedc471592fe702fefef783383171Chris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 547cfe2eab7446dedc471592fe702fefef783383171Chris Lattner virtual bool isEqualImpl(const Matcher *M) const { return false; } 548cfe2eab7446dedc471592fe702fefef783383171Chris Lattner virtual unsigned getHashImpl() const { return 4123; } 549cfe2eab7446dedc471592fe702fefef783383171Chris Lattner}; 550fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 551fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 552b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckChildTypeMatcher - This checks to see if a child node has the 55323cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner/// specified type, if not it fails to match. 554b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckChildTypeMatcher : public Matcher { 55523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner unsigned ChildNo; 55623cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner MVT::SimpleValueType Type; 55723cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattnerpublic: 558b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner CheckChildTypeMatcher(unsigned childno, MVT::SimpleValueType type) 559b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(CheckChildType), ChildNo(childno), Type(type) {} 560fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 56123cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner unsigned getChildNo() const { return ChildNo; } 56223cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner MVT::SimpleValueType getType() const { return Type; } 563fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 564b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 56523cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner return N->getKind() == CheckChildType; 56623cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner } 567fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 568d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 569d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 57058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 571a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 57258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 57358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<CheckChildTypeMatcher>(M)->ChildNo == ChildNo && 57458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner cast<CheckChildTypeMatcher>(M)->Type == Type; 57558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 57658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return (Type << 3) | ChildNo; } 57782781b938af4057df90b5fa4035781ddc4aa681aChris Lattner virtual bool isContradictoryImpl(const Matcher *M) const; 57823cfda719e059ce7d761b08fbfb89e676d6c9737Chris Lattner}; 579fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 580da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 581b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckIntegerMatcher - This checks to see if the current node is a 582da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// ConstantSDNode with the specified integer value, if not it fails to match. 583b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckIntegerMatcher : public Matcher { 584da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner int64_t Value; 585da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 586b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner CheckIntegerMatcher(int64_t value) 587b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(CheckInteger), Value(value) {} 588fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 589da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner int64_t getValue() const { return Value; } 590fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 591b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 592da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckInteger; 593da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 594fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 595d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 596d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 59758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 598a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 59958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 60058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<CheckIntegerMatcher>(M)->Value == Value; 60158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 60258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return Value; } 603247896272a8b812900b27ee85c8b1d347b4752d8Chris Lattner virtual bool isContradictoryImpl(const Matcher *M) const; 604da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 605fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 606b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckCondCodeMatcher - This checks to see if the current node is a 607da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// CondCodeSDNode with the specified condition, if not it fails to match. 608b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckCondCodeMatcher : public Matcher { 609da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner StringRef CondCodeName; 610da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 611b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner CheckCondCodeMatcher(StringRef condcodename) 612b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(CheckCondCode), CondCodeName(condcodename) {} 613fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 614da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner StringRef getCondCodeName() const { return CondCodeName; } 615fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 616b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 617da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckCondCode; 618da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 619fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 620d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 621d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 62258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 623a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 62458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 62558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<CheckCondCodeMatcher>(M)->CondCodeName == CondCodeName; 62658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 62758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const; 628da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 629fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 630b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckValueTypeMatcher - This checks to see if the current node is a 631da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// VTSDNode with the specified type, if not it fails to match. 632b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckValueTypeMatcher : public Matcher { 633da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner StringRef TypeName; 634da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 635b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner CheckValueTypeMatcher(StringRef type_name) 636b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(CheckValueType), TypeName(type_name) {} 637fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 638da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner StringRef getTypeName() const { return TypeName; } 639da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 640b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 641da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckValueType; 642da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 643fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 644d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 645d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 64658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 647a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 64858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 64958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<CheckValueTypeMatcher>(M)->TypeName == TypeName; 65058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 65158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const; 65248aa5756a29a7b96850ac646d1edd806c9df4643Chris Lattner bool isContradictoryImpl(const Matcher *M) const; 653da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 654fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 655fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 656fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 657b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckComplexPatMatcher - This node runs the specified ComplexPattern on 658da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// the current node. 659b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckComplexPatMatcher : public Matcher { 660da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner const ComplexPattern &Pattern; 661fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 662fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach /// MatchNumber - This is the recorded nodes slot that contains the node we 663fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach /// want to match against. 66457bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner unsigned MatchNumber; 665fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 66657bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner /// Name - The name of the node we're matching, for comment emission. 66757bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner std::string Name; 668fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 669d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner /// FirstResult - This is the first slot in the RecordedNodes list that the 670d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner /// result of the match populates. 671d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner unsigned FirstResult; 672da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 67357bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner CheckComplexPatMatcher(const ComplexPattern &pattern, unsigned matchnumber, 67457bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner const std::string &name, unsigned firstresult) 67557bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner : Matcher(CheckComplexPat), Pattern(pattern), MatchNumber(matchnumber), 67657bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner Name(name), FirstResult(firstresult) {} 677fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 678e609a513f3c072bba28412c681465332a2822d9aChris Lattner const ComplexPattern &getPattern() const { return Pattern; } 67957bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner unsigned getMatchNumber() const { return MatchNumber; } 680fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 68157bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner const std::string getName() const { return Name; } 682d1aca7c8b4ea45fbee18fc18a21ed963175dd7bcChris Lattner unsigned getFirstResult() const { return FirstResult; } 683fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 684b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 685da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckComplexPat; 686da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 687fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 688d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner // Not safe to move a pattern predicate past a complex pattern. 689d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return false; } 690d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 69158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 692a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 69358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 69457bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner return &cast<CheckComplexPatMatcher>(M)->Pattern == &Pattern && 69557bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner cast<CheckComplexPatMatcher>(M)->MatchNumber == MatchNumber; 69658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 69758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { 69857bf8a483edf97589c3e6085721e72fc187677a8Chris Lattner return (unsigned)(intptr_t)&Pattern ^ MatchNumber; 69958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 700da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 701fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 702b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckAndImmMatcher - This checks to see if the current node is an 'and' 703da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// with something equivalent to the specified immediate. 704b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckAndImmMatcher : public Matcher { 705da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner int64_t Value; 706da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 707b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner CheckAndImmMatcher(int64_t value) 708b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(CheckAndImm), Value(value) {} 709fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 710da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner int64_t getValue() const { return Value; } 711fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 712b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 713da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckAndImm; 714da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 715fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 716d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 717d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 71858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 719a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 72058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 72158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<CheckAndImmMatcher>(M)->Value == Value; 72258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 72358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return Value; } 724da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 725da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 726b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckOrImmMatcher - This checks to see if the current node is an 'and' 727da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner/// with something equivalent to the specified immediate. 728b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckOrImmMatcher : public Matcher { 729da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner int64_t Value; 730da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattnerpublic: 731b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner CheckOrImmMatcher(int64_t value) 732b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(CheckOrImm), Value(value) {} 733fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 734da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner int64_t getValue() const { return Value; } 735da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 736b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 737da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner return N->getKind() == CheckOrImm; 738da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner } 739fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 740d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 741d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 74258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 743a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 74458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 74558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<CheckOrImmMatcher>(M)->Value == Value; 74658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 74758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return Value; } 748da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner}; 749e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner 750b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CheckFoldableChainNodeMatcher - This checks to see if the current node 75121390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner/// (which defines a chain operand) is safe to fold into a larger pattern. 752b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CheckFoldableChainNodeMatcher : public Matcher { 753e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattnerpublic: 754b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner CheckFoldableChainNodeMatcher() 755b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(CheckFoldableChainNode) {} 756fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 757b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 75821390d79843050ae8b3226860cadc16ff51d0dcfChris Lattner return N->getKind() == CheckFoldableChainNode; 759e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner } 760fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 761d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner virtual bool isSafeToReorderWithPatternPredicate() const { return true; } 762d323fd45e3eb5254a423e1ae14250854816a141fChris Lattner 76358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 764a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 76558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { return true; } 76658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return 0; } 767e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner}; 768e39650a805425ffdbd79692c7d1bad80f7332daeChris Lattner 769b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitIntegerMatcher - This creates a new TargetConstant. 770b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitIntegerMatcher : public Matcher { 771845c04273461b2a10754a1455b02916a19ea72aaChris Lattner int64_t Val; 772845c04273461b2a10754a1455b02916a19ea72aaChris Lattner MVT::SimpleValueType VT; 773845c04273461b2a10754a1455b02916a19ea72aaChris Lattnerpublic: 774b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner EmitIntegerMatcher(int64_t val, MVT::SimpleValueType vt) 775b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(EmitInteger), Val(val), VT(vt) {} 776fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 777906b4995eeab9e6b6fd11a492498c95bba1ce0afChris Lattner int64_t getValue() const { return Val; } 778845c04273461b2a10754a1455b02916a19ea72aaChris Lattner MVT::SimpleValueType getVT() const { return VT; } 779fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 780b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 781845c04273461b2a10754a1455b02916a19ea72aaChris Lattner return N->getKind() == EmitInteger; 782845c04273461b2a10754a1455b02916a19ea72aaChris Lattner } 783fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 78458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 785a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 78658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 78758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<EmitIntegerMatcher>(M)->Val == Val && 78858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner cast<EmitIntegerMatcher>(M)->VT == VT; 78958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 79058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return (Val << 4) | VT; } 791845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}; 7928e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 793b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitStringIntegerMatcher - A target constant whose value is represented 7948e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// by a string. 795b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitStringIntegerMatcher : public Matcher { 7968e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner std::string Val; 7978e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner MVT::SimpleValueType VT; 7988e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic: 799b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner EmitStringIntegerMatcher(const std::string &val, MVT::SimpleValueType vt) 800b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(EmitStringInteger), Val(val), VT(vt) {} 801fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 8028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner const std::string &getValue() const { return Val; } 8038e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner MVT::SimpleValueType getVT() const { return VT; } 804fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 805b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 8068e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return N->getKind() == EmitStringInteger; 8078e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 808fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 80958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 810a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 81158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 81258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<EmitStringIntegerMatcher>(M)->Val == Val && 81358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner cast<EmitStringIntegerMatcher>(M)->VT == VT; 81458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 81558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const; 8168e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}; 817fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 818b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitRegisterMatcher - This creates a new TargetConstant. 819b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitRegisterMatcher : public Matcher { 820845c04273461b2a10754a1455b02916a19ea72aaChris Lattner /// Reg - The def for the register that we're emitting. If this is null, then 821845c04273461b2a10754a1455b02916a19ea72aaChris Lattner /// this is a reference to zero_reg. 8224a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach const CodeGenRegister *Reg; 823845c04273461b2a10754a1455b02916a19ea72aaChris Lattner MVT::SimpleValueType VT; 824845c04273461b2a10754a1455b02916a19ea72aaChris Lattnerpublic: 8254a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach EmitRegisterMatcher(const CodeGenRegister *reg, MVT::SimpleValueType vt) 826b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(EmitRegister), Reg(reg), VT(vt) {} 827fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 8284a6d735105ffac5f58499ef5a5de8713b458b233Jim Grosbach const CodeGenRegister *getReg() const { return Reg; } 829845c04273461b2a10754a1455b02916a19ea72aaChris Lattner MVT::SimpleValueType getVT() const { return VT; } 830fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 831b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 832845c04273461b2a10754a1455b02916a19ea72aaChris Lattner return N->getKind() == EmitRegister; 833845c04273461b2a10754a1455b02916a19ea72aaChris Lattner } 834fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 83558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 836a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 83758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 83858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<EmitRegisterMatcher>(M)->Reg == Reg && 83958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner cast<EmitRegisterMatcher>(M)->VT == VT; 84058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 84158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { 84258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return ((unsigned)(intptr_t)Reg) << 4 | VT; 84358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 844845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}; 8458e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner 846b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitConvertToTargetMatcher - Emit an operation that reads a specified 8478e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// recorded node and converts it from being a ISD::Constant to 8488e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// ISD::TargetConstant, likewise for ConstantFP. 849b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitConvertToTargetMatcher : public Matcher { 8508e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned Slot; 8518e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic: 852b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner EmitConvertToTargetMatcher(unsigned slot) 853b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(EmitConvertToTarget), Slot(slot) {} 854fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 8558e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned getSlot() const { return Slot; } 856fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 857b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 8588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return N->getKind() == EmitConvertToTarget; 8598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 860fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 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<EmitConvertToTargetMatcher>(M)->Slot == Slot; 86558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 86658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { return Slot; } 8678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}; 868fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 869b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitMergeInputChainsMatcher - Emit a node that merges a list of input 8708e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// chains together with a token factor. The list of nodes are the nodes in the 8718e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// matched pattern that have chain input/outputs. This node adds all input 8728e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// chains of these nodes if they are not themselves a node in the pattern. 873b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitMergeInputChainsMatcher : public Matcher { 8748e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner SmallVector<unsigned, 3> ChainNodes; 8758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic: 876b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner EmitMergeInputChainsMatcher(const unsigned *nodes, unsigned NumNodes) 877b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(EmitMergeInputChains), ChainNodes(nodes, nodes+NumNodes) {} 878fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 8798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned getNumNodes() const { return ChainNodes.size(); } 880fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 8818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned getNode(unsigned i) const { 8828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner assert(i < ChainNodes.size()); 8838e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return ChainNodes[i]; 884fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach } 885fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 886b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 8878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return N->getKind() == EmitMergeInputChains; 8888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 889fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 89058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 891a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 89258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 89358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<EmitMergeInputChainsMatcher>(M)->ChainNodes == ChainNodes; 89458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 89558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const; 8968e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}; 897fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 898b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitCopyToRegMatcher - Emit a CopyToReg node from a value to a physreg, 8998950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner/// pushing the chain and glue results. 9008e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// 901b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitCopyToRegMatcher : public Matcher { 9028e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned SrcSlot; // Value to copy into the physreg. 9038e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner Record *DestPhysReg; 9048e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic: 905b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner EmitCopyToRegMatcher(unsigned srcSlot, Record *destPhysReg) 906b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(EmitCopyToReg), SrcSlot(srcSlot), DestPhysReg(destPhysReg) {} 907fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 9088e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned getSrcSlot() const { return SrcSlot; } 9098e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner Record *getDestPhysReg() const { return DestPhysReg; } 910fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 911b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 9128e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return N->getKind() == EmitCopyToReg; 9138e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 914fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 91558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 916a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 91758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 91858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<EmitCopyToRegMatcher>(M)->SrcSlot == SrcSlot && 919fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach cast<EmitCopyToRegMatcher>(M)->DestPhysReg == DestPhysReg; 92058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 92158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { 92258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return SrcSlot ^ ((unsigned)(intptr_t)DestPhysReg << 4); 92358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 9248e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}; 925fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 926fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 927fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 928b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// EmitNodeXFormMatcher - Emit an operation that runs an SDNodeXForm on a 9298e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner/// recorded node and records the result. 930b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass EmitNodeXFormMatcher : public Matcher { 9318e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned Slot; 9328e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner Record *NodeXForm; 9338e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic: 934b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner EmitNodeXFormMatcher(unsigned slot, Record *nodeXForm) 935b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(EmitNodeXForm), Slot(slot), NodeXForm(nodeXForm) {} 936fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 9378e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned getSlot() const { return Slot; } 9388e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner Record *getNodeXForm() const { return NodeXForm; } 939fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 940b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 9418e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return N->getKind() == EmitNodeXForm; 9428e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 943fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 94458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 945a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 94658aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 94758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<EmitNodeXFormMatcher>(M)->Slot == Slot && 948fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach cast<EmitNodeXFormMatcher>(M)->NodeXForm == NodeXForm; 94958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 95058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const { 95158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return Slot ^ ((unsigned)(intptr_t)NodeXForm << 4); 95258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 9538e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}; 954fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 955e86097af5598e44727875f00e492d43c978239beChris Lattner/// EmitNodeMatcherCommon - Common class shared between EmitNode and 9569a21500edc485a2c383a03fba429943f031c1398Chris Lattner/// MorphNodeTo. 957e86097af5598e44727875f00e492d43c978239beChris Lattnerclass EmitNodeMatcherCommon : public Matcher { 9588e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner std::string OpcodeName; 9598e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner const SmallVector<MVT::SimpleValueType, 3> VTs; 9608e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner const SmallVector<unsigned, 6> Operands; 961036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner bool HasChain, HasInGlue, HasOutGlue, HasMemRefs; 962fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 9638e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner /// NumFixedArityOperands - If this is a fixed arity node, this is set to -1. 9648e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner /// If this is a varidic node, this is set to the number of fixed arity 9658e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner /// operands in the root of the pattern. The rest are appended to this node. 9668e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner int NumFixedArityOperands; 9678e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattnerpublic: 968e86097af5598e44727875f00e492d43c978239beChris Lattner EmitNodeMatcherCommon(const std::string &opcodeName, 969e86097af5598e44727875f00e492d43c978239beChris Lattner const MVT::SimpleValueType *vts, unsigned numvts, 970e86097af5598e44727875f00e492d43c978239beChris Lattner const unsigned *operands, unsigned numops, 9718950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner bool hasChain, bool hasInGlue, bool hasOutGlue, 972ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner bool hasmemrefs, 9739a21500edc485a2c383a03fba429943f031c1398Chris Lattner int numfixedarityoperands, bool isMorphNodeTo) 9749a21500edc485a2c383a03fba429943f031c1398Chris Lattner : Matcher(isMorphNodeTo ? MorphNodeTo : EmitNode), OpcodeName(opcodeName), 9758e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner VTs(vts, vts+numvts), Operands(operands, operands+numops), 976036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner HasChain(hasChain), HasInGlue(hasInGlue), HasOutGlue(hasOutGlue), 977ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner HasMemRefs(hasmemrefs), NumFixedArityOperands(numfixedarityoperands) {} 978fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 9798e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner const std::string &getOpcodeName() const { return OpcodeName; } 980fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 9818e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned getNumVTs() const { return VTs.size(); } 9828e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner MVT::SimpleValueType getVT(unsigned i) const { 9838e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner assert(i < VTs.size()); 9848e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return VTs[i]; 9858e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 986c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner 9878e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned getNumOperands() const { return Operands.size(); } 9888e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner unsigned getOperand(unsigned i) const { 9898e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner assert(i < Operands.size()); 9908e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner return Operands[i]; 991c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner } 992fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 993c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner const SmallVectorImpl<MVT::SimpleValueType> &getVTList() const { return VTs; } 994c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner const SmallVectorImpl<unsigned> &getOperandList() const { return Operands; } 995c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner 996fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 9978e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner bool hasChain() const { return HasChain; } 998036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner bool hasInFlag() const { return HasInGlue; } 999036609bd7d42ed1f57865969e059eb7d1eb6c392Chris Lattner bool hasOutFlag() const { return HasOutGlue; } 10008e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner bool hasMemRefs() const { return HasMemRefs; } 10018e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner int getNumFixedArityOperands() const { return NumFixedArityOperands; } 1002fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 1003b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 10049a21500edc485a2c383a03fba429943f031c1398Chris Lattner return N->getKind() == EmitNode || N->getKind() == MorphNodeTo; 10058e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner } 1006fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 100758aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 1008a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 100958aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const; 101058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const; 10118e946bea146c15333ce5f9f1b7a9efe5e75fd892Chris Lattner}; 1012fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 1013e86097af5598e44727875f00e492d43c978239beChris Lattner/// EmitNodeMatcher - This signals a successful match and generates a node. 1014e86097af5598e44727875f00e492d43c978239beChris Lattnerclass EmitNodeMatcher : public EmitNodeMatcherCommon { 10152d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 10166281cda6737bcda0e924318ddcce28392001691eChris Lattner unsigned FirstResultSlot; 1017e86097af5598e44727875f00e492d43c978239beChris Lattnerpublic: 1018e86097af5598e44727875f00e492d43c978239beChris Lattner EmitNodeMatcher(const std::string &opcodeName, 1019e86097af5598e44727875f00e492d43c978239beChris Lattner const MVT::SimpleValueType *vts, unsigned numvts, 1020e86097af5598e44727875f00e492d43c978239beChris Lattner const unsigned *operands, unsigned numops, 1021ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner bool hasChain, bool hasInFlag, bool hasOutFlag, 1022ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner bool hasmemrefs, 10236281cda6737bcda0e924318ddcce28392001691eChris Lattner int numfixedarityoperands, unsigned firstresultslot) 1024e86097af5598e44727875f00e492d43c978239beChris Lattner : EmitNodeMatcherCommon(opcodeName, vts, numvts, operands, numops, hasChain, 1025ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner hasInFlag, hasOutFlag, hasmemrefs, 1026ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner numfixedarityoperands, false), 10276281cda6737bcda0e924318ddcce28392001691eChris Lattner FirstResultSlot(firstresultslot) {} 1028fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 10296281cda6737bcda0e924318ddcce28392001691eChris Lattner unsigned getFirstResultSlot() const { return FirstResultSlot; } 1030fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 1031e86097af5598e44727875f00e492d43c978239beChris Lattner static inline bool classof(const Matcher *N) { 1032e86097af5598e44727875f00e492d43c978239beChris Lattner return N->getKind() == EmitNode; 1033e86097af5598e44727875f00e492d43c978239beChris Lattner } 1034fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 1035e86097af5598e44727875f00e492d43c978239beChris Lattner}; 1036fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 10379a21500edc485a2c383a03fba429943f031c1398Chris Lattnerclass MorphNodeToMatcher : public EmitNodeMatcherCommon { 10382d24e2a396a1d211baaeedf32148a3b657240170David Blaikie virtual void anchor(); 1039e86097af5598e44727875f00e492d43c978239beChris Lattner const PatternToMatch &Pattern; 1040e86097af5598e44727875f00e492d43c978239beChris Lattnerpublic: 10419a21500edc485a2c383a03fba429943f031c1398Chris Lattner MorphNodeToMatcher(const std::string &opcodeName, 10429a21500edc485a2c383a03fba429943f031c1398Chris Lattner const MVT::SimpleValueType *vts, unsigned numvts, 10439a21500edc485a2c383a03fba429943f031c1398Chris Lattner const unsigned *operands, unsigned numops, 1044ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner bool hasChain, bool hasInFlag, bool hasOutFlag, 1045ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner bool hasmemrefs, 10469a21500edc485a2c383a03fba429943f031c1398Chris Lattner int numfixedarityoperands, const PatternToMatch &pattern) 1047e86097af5598e44727875f00e492d43c978239beChris Lattner : EmitNodeMatcherCommon(opcodeName, vts, numvts, operands, numops, hasChain, 1048ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner hasInFlag, hasOutFlag, hasmemrefs, 1049ff7fb60f2a7e2f3efd54df6480aadcb4adf5cab7Chris Lattner numfixedarityoperands, true), 1050e86097af5598e44727875f00e492d43c978239beChris Lattner Pattern(pattern) { 1051e86097af5598e44727875f00e492d43c978239beChris Lattner } 1052fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 1053e86097af5598e44727875f00e492d43c978239beChris Lattner const PatternToMatch &getPattern() const { return Pattern; } 1054e86097af5598e44727875f00e492d43c978239beChris Lattner 1055e86097af5598e44727875f00e492d43c978239beChris Lattner static inline bool classof(const Matcher *N) { 10569a21500edc485a2c383a03fba429943f031c1398Chris Lattner return N->getKind() == MorphNodeTo; 1057e86097af5598e44727875f00e492d43c978239beChris Lattner } 1058e86097af5598e44727875f00e492d43c978239beChris Lattner}; 1059fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 10608950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner/// MarkGlueResultsMatcher - This node indicates which non-root nodes in the 10618950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner/// pattern produce glue. This allows CompleteMatchMatcher to update them 10628950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner/// with the output glue of the resultant code. 10638950bcaa5aec9364bf4e7947d195c32433850816Chris Lattnerclass MarkGlueResultsMatcher : public Matcher { 10648950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner SmallVector<unsigned, 3> GlueResultNodes; 106502f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattnerpublic: 10668950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner MarkGlueResultsMatcher(const unsigned *nodes, unsigned NumNodes) 10678950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner : Matcher(MarkGlueResults), GlueResultNodes(nodes, nodes+NumNodes) {} 1068fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 10698950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner unsigned getNumNodes() const { return GlueResultNodes.size(); } 1070fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 107102f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner unsigned getNode(unsigned i) const { 10728950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner assert(i < GlueResultNodes.size()); 10738950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner return GlueResultNodes[i]; 1074fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach } 1075fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 1076b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 10778950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner return N->getKind() == MarkGlueResults; 107802f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner } 1079fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 108058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 1081a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 108258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 10838950bcaa5aec9364bf4e7947d195c32433850816Chris Lattner return cast<MarkGlueResultsMatcher>(M)->GlueResultNodes == GlueResultNodes; 108458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 108558aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const; 108602f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner}; 108702f73585f7d018ea3ddcda88c8273ee4e5ea4de3Chris Lattner 1088b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner/// CompleteMatchMatcher - Complete a match by replacing the results of the 108977f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner/// pattern with the newly generated nodes. This also prints a comment 109077f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner/// indicating the source and dest patterns. 1091b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattnerclass CompleteMatchMatcher : public Matcher { 109277f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner SmallVector<unsigned, 2> Results; 1093845c04273461b2a10754a1455b02916a19ea72aaChris Lattner const PatternToMatch &Pattern; 1094845c04273461b2a10754a1455b02916a19ea72aaChris Lattnerpublic: 1095b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner CompleteMatchMatcher(const unsigned *results, unsigned numresults, 1096c78f2a39945339752a163949a2d7c27f28635d99Chris Lattner const PatternToMatch &pattern) 1097b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner : Matcher(CompleteMatch), Results(results, results+numresults), 109877f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner Pattern(pattern) {} 109977f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner 110077f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner unsigned getNumResults() const { return Results.size(); } 110177f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner unsigned getResult(unsigned R) const { return Results[R]; } 1102845c04273461b2a10754a1455b02916a19ea72aaChris Lattner const PatternToMatch &getPattern() const { return Pattern; } 1103fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 1104b21ba71045420b4c0dc5f30e85b9b01c9165eb57Chris Lattner static inline bool classof(const Matcher *N) { 110577f2e2724dc488bbf032e87f8f25f333730a0fb5Chris Lattner return N->getKind() == CompleteMatch; 1106845c04273461b2a10754a1455b02916a19ea72aaChris Lattner } 1107fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 110858aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattnerprivate: 1109a5028a64634f995630e93390c5c23374a09a450fChris Lattner virtual void printImpl(raw_ostream &OS, unsigned indent) const; 111058aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual bool isEqualImpl(const Matcher *M) const { 111158aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner return cast<CompleteMatchMatcher>(M)->Results == Results && 111258aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner &cast<CompleteMatchMatcher>(M)->Pattern == &Pattern; 111358aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner } 111458aa834d31c2c0f378c8de5ec0450c2ab5568a2aChris Lattner virtual unsigned getHashImpl() const; 1115845c04273461b2a10754a1455b02916a19ea72aaChris Lattner}; 1116fbadcd0826c2e69ed21c2d535310ba958acb4359Jim Grosbach 1117da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner} // end namespace llvm 1118da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner 1119da272d1a704bd564272e88cbdbcf14712e3abbdcChris Lattner#endif 1120