1*9880d681SAndroid Build Coastguard Worker //===- CodeGenDAGPatterns.h - Read DAG patterns from .td file ---*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // This file declares the CodeGenDAGPatterns class, which is used to read and 11*9880d681SAndroid Build Coastguard Worker // represent the patterns present in a .td file for instructions. 12*9880d681SAndroid Build Coastguard Worker // 13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_UTILS_TABLEGEN_CODEGENDAGPATTERNS_H 16*9880d681SAndroid Build Coastguard Worker #define LLVM_UTILS_TABLEGEN_CODEGENDAGPATTERNS_H 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker #include "CodeGenIntrinsics.h" 19*9880d681SAndroid Build Coastguard Worker #include "CodeGenTarget.h" 20*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallVector.h" 21*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/StringMap.h" 22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h" 23*9880d681SAndroid Build Coastguard Worker #include <algorithm> 24*9880d681SAndroid Build Coastguard Worker #include <map> 25*9880d681SAndroid Build Coastguard Worker #include <set> 26*9880d681SAndroid Build Coastguard Worker #include <vector> 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker namespace llvm { 29*9880d681SAndroid Build Coastguard Worker class Record; 30*9880d681SAndroid Build Coastguard Worker class Init; 31*9880d681SAndroid Build Coastguard Worker class ListInit; 32*9880d681SAndroid Build Coastguard Worker class DagInit; 33*9880d681SAndroid Build Coastguard Worker class SDNodeInfo; 34*9880d681SAndroid Build Coastguard Worker class TreePattern; 35*9880d681SAndroid Build Coastguard Worker class TreePatternNode; 36*9880d681SAndroid Build Coastguard Worker class CodeGenDAGPatterns; 37*9880d681SAndroid Build Coastguard Worker class ComplexPattern; 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Worker /// EEVT::DAGISelGenValueType - These are some extended forms of 40*9880d681SAndroid Build Coastguard Worker /// MVT::SimpleValueType that we use as lattice values during type inference. 41*9880d681SAndroid Build Coastguard Worker /// The existing MVT iAny, fAny and vAny types suffice to represent 42*9880d681SAndroid Build Coastguard Worker /// arbitrary integer, floating-point, and vector types, so only an unknown 43*9880d681SAndroid Build Coastguard Worker /// value is needed. 44*9880d681SAndroid Build Coastguard Worker namespace EEVT { 45*9880d681SAndroid Build Coastguard Worker /// TypeSet - This is either empty if it's completely unknown, or holds a set 46*9880d681SAndroid Build Coastguard Worker /// of types. It is used during type inference because register classes can 47*9880d681SAndroid Build Coastguard Worker /// have multiple possible types and we don't know which one they get until 48*9880d681SAndroid Build Coastguard Worker /// type inference is complete. 49*9880d681SAndroid Build Coastguard Worker /// 50*9880d681SAndroid Build Coastguard Worker /// TypeSet can have three states: 51*9880d681SAndroid Build Coastguard Worker /// Vector is empty: The type is completely unknown, it can be any valid 52*9880d681SAndroid Build Coastguard Worker /// target type. 53*9880d681SAndroid Build Coastguard Worker /// Vector has multiple constrained types: (e.g. v4i32 + v4f32) it is one 54*9880d681SAndroid Build Coastguard Worker /// of those types only. 55*9880d681SAndroid Build Coastguard Worker /// Vector has one concrete type: The type is completely known. 56*9880d681SAndroid Build Coastguard Worker /// 57*9880d681SAndroid Build Coastguard Worker class TypeSet { 58*9880d681SAndroid Build Coastguard Worker SmallVector<MVT::SimpleValueType, 4> TypeVec; 59*9880d681SAndroid Build Coastguard Worker public: TypeSet()60*9880d681SAndroid Build Coastguard Worker TypeSet() {} 61*9880d681SAndroid Build Coastguard Worker TypeSet(MVT::SimpleValueType VT, TreePattern &TP); 62*9880d681SAndroid Build Coastguard Worker TypeSet(ArrayRef<MVT::SimpleValueType> VTList); 63*9880d681SAndroid Build Coastguard Worker isCompletelyUnknown()64*9880d681SAndroid Build Coastguard Worker bool isCompletelyUnknown() const { return TypeVec.empty(); } 65*9880d681SAndroid Build Coastguard Worker isConcrete()66*9880d681SAndroid Build Coastguard Worker bool isConcrete() const { 67*9880d681SAndroid Build Coastguard Worker if (TypeVec.size() != 1) return false; 68*9880d681SAndroid Build Coastguard Worker unsigned char T = TypeVec[0]; (void)T; 69*9880d681SAndroid Build Coastguard Worker assert(T < MVT::LAST_VALUETYPE || T == MVT::iPTR || T == MVT::iPTRAny); 70*9880d681SAndroid Build Coastguard Worker return true; 71*9880d681SAndroid Build Coastguard Worker } 72*9880d681SAndroid Build Coastguard Worker getConcrete()73*9880d681SAndroid Build Coastguard Worker MVT::SimpleValueType getConcrete() const { 74*9880d681SAndroid Build Coastguard Worker assert(isConcrete() && "Type isn't concrete yet"); 75*9880d681SAndroid Build Coastguard Worker return (MVT::SimpleValueType)TypeVec[0]; 76*9880d681SAndroid Build Coastguard Worker } 77*9880d681SAndroid Build Coastguard Worker isDynamicallyResolved()78*9880d681SAndroid Build Coastguard Worker bool isDynamicallyResolved() const { 79*9880d681SAndroid Build Coastguard Worker return getConcrete() == MVT::iPTR || getConcrete() == MVT::iPTRAny; 80*9880d681SAndroid Build Coastguard Worker } 81*9880d681SAndroid Build Coastguard Worker getTypeList()82*9880d681SAndroid Build Coastguard Worker const SmallVectorImpl<MVT::SimpleValueType> &getTypeList() const { 83*9880d681SAndroid Build Coastguard Worker assert(!TypeVec.empty() && "Not a type list!"); 84*9880d681SAndroid Build Coastguard Worker return TypeVec; 85*9880d681SAndroid Build Coastguard Worker } 86*9880d681SAndroid Build Coastguard Worker isVoid()87*9880d681SAndroid Build Coastguard Worker bool isVoid() const { 88*9880d681SAndroid Build Coastguard Worker return TypeVec.size() == 1 && TypeVec[0] == MVT::isVoid; 89*9880d681SAndroid Build Coastguard Worker } 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker /// hasIntegerTypes - Return true if this TypeSet contains any integer value 92*9880d681SAndroid Build Coastguard Worker /// types. 93*9880d681SAndroid Build Coastguard Worker bool hasIntegerTypes() const; 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker /// hasFloatingPointTypes - Return true if this TypeSet contains an fAny or 96*9880d681SAndroid Build Coastguard Worker /// a floating point value type. 97*9880d681SAndroid Build Coastguard Worker bool hasFloatingPointTypes() const; 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker /// hasScalarTypes - Return true if this TypeSet contains a scalar value 100*9880d681SAndroid Build Coastguard Worker /// type. 101*9880d681SAndroid Build Coastguard Worker bool hasScalarTypes() const; 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker /// hasVectorTypes - Return true if this TypeSet contains a vector value 104*9880d681SAndroid Build Coastguard Worker /// type. 105*9880d681SAndroid Build Coastguard Worker bool hasVectorTypes() const; 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker /// getName() - Return this TypeSet as a string. 108*9880d681SAndroid Build Coastguard Worker std::string getName() const; 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker /// MergeInTypeInfo - This merges in type information from the specified 111*9880d681SAndroid Build Coastguard Worker /// argument. If 'this' changes, it returns true. If the two types are 112*9880d681SAndroid Build Coastguard Worker /// contradictory (e.g. merge f32 into i32) then this flags an error. 113*9880d681SAndroid Build Coastguard Worker bool MergeInTypeInfo(const EEVT::TypeSet &InVT, TreePattern &TP); 114*9880d681SAndroid Build Coastguard Worker MergeInTypeInfo(MVT::SimpleValueType InVT,TreePattern & TP)115*9880d681SAndroid Build Coastguard Worker bool MergeInTypeInfo(MVT::SimpleValueType InVT, TreePattern &TP) { 116*9880d681SAndroid Build Coastguard Worker return MergeInTypeInfo(EEVT::TypeSet(InVT, TP), TP); 117*9880d681SAndroid Build Coastguard Worker } 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker /// Force this type list to only contain integer types. 120*9880d681SAndroid Build Coastguard Worker bool EnforceInteger(TreePattern &TP); 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker /// Force this type list to only contain floating point types. 123*9880d681SAndroid Build Coastguard Worker bool EnforceFloatingPoint(TreePattern &TP); 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker /// EnforceScalar - Remove all vector types from this type list. 126*9880d681SAndroid Build Coastguard Worker bool EnforceScalar(TreePattern &TP); 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker /// EnforceVector - Remove all non-vector types from this type list. 129*9880d681SAndroid Build Coastguard Worker bool EnforceVector(TreePattern &TP); 130*9880d681SAndroid Build Coastguard Worker 131*9880d681SAndroid Build Coastguard Worker /// EnforceSmallerThan - 'this' must be a smaller VT than Other. Update 132*9880d681SAndroid Build Coastguard Worker /// this an other based on this information. 133*9880d681SAndroid Build Coastguard Worker bool EnforceSmallerThan(EEVT::TypeSet &Other, TreePattern &TP); 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Worker /// EnforceVectorEltTypeIs - 'this' is now constrained to be a vector type 136*9880d681SAndroid Build Coastguard Worker /// whose element is VT. 137*9880d681SAndroid Build Coastguard Worker bool EnforceVectorEltTypeIs(EEVT::TypeSet &VT, TreePattern &TP); 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker /// EnforceVectorEltTypeIs - 'this' is now constrained to be a vector type 140*9880d681SAndroid Build Coastguard Worker /// whose element is VT. 141*9880d681SAndroid Build Coastguard Worker bool EnforceVectorEltTypeIs(MVT::SimpleValueType VT, TreePattern &TP); 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker /// EnforceVectorSubVectorTypeIs - 'this' is now constrained to 144*9880d681SAndroid Build Coastguard Worker /// be a vector type VT. 145*9880d681SAndroid Build Coastguard Worker bool EnforceVectorSubVectorTypeIs(EEVT::TypeSet &VT, TreePattern &TP); 146*9880d681SAndroid Build Coastguard Worker 147*9880d681SAndroid Build Coastguard Worker /// EnforceVectorSameNumElts - 'this' is now constrained to 148*9880d681SAndroid Build Coastguard Worker /// be a vector with same num elements as VT. 149*9880d681SAndroid Build Coastguard Worker bool EnforceVectorSameNumElts(EEVT::TypeSet &VT, TreePattern &TP); 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker /// EnforceSameSize - 'this' is now constrained to be the same size as VT. 152*9880d681SAndroid Build Coastguard Worker bool EnforceSameSize(EEVT::TypeSet &VT, TreePattern &TP); 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Worker bool operator!=(const TypeSet &RHS) const { return TypeVec != RHS.TypeVec; } 155*9880d681SAndroid Build Coastguard Worker bool operator==(const TypeSet &RHS) const { return TypeVec == RHS.TypeVec; } 156*9880d681SAndroid Build Coastguard Worker 157*9880d681SAndroid Build Coastguard Worker private: 158*9880d681SAndroid Build Coastguard Worker /// FillWithPossibleTypes - Set to all legal types and return true, only 159*9880d681SAndroid Build Coastguard Worker /// valid on completely unknown type sets. If Pred is non-null, only MVTs 160*9880d681SAndroid Build Coastguard Worker /// that pass the predicate are added. 161*9880d681SAndroid Build Coastguard Worker bool FillWithPossibleTypes(TreePattern &TP, 162*9880d681SAndroid Build Coastguard Worker bool (*Pred)(MVT::SimpleValueType) = nullptr, 163*9880d681SAndroid Build Coastguard Worker const char *PredicateName = nullptr); 164*9880d681SAndroid Build Coastguard Worker }; 165*9880d681SAndroid Build Coastguard Worker } 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Worker /// Set type used to track multiply used variables in patterns 168*9880d681SAndroid Build Coastguard Worker typedef std::set<std::string> MultipleUseVarSet; 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Worker /// SDTypeConstraint - This is a discriminated union of constraints, 171*9880d681SAndroid Build Coastguard Worker /// corresponding to the SDTypeConstraint tablegen class in Target.td. 172*9880d681SAndroid Build Coastguard Worker struct SDTypeConstraint { 173*9880d681SAndroid Build Coastguard Worker SDTypeConstraint(Record *R); 174*9880d681SAndroid Build Coastguard Worker 175*9880d681SAndroid Build Coastguard Worker unsigned OperandNo; // The operand # this constraint applies to. 176*9880d681SAndroid Build Coastguard Worker enum { 177*9880d681SAndroid Build Coastguard Worker SDTCisVT, SDTCisPtrTy, SDTCisInt, SDTCisFP, SDTCisVec, SDTCisSameAs, 178*9880d681SAndroid Build Coastguard Worker SDTCisVTSmallerThanOp, SDTCisOpSmallerThanOp, SDTCisEltOfVec, 179*9880d681SAndroid Build Coastguard Worker SDTCisSubVecOfVec, SDTCVecEltisVT, SDTCisSameNumEltsAs, SDTCisSameSizeAs 180*9880d681SAndroid Build Coastguard Worker } ConstraintType; 181*9880d681SAndroid Build Coastguard Worker 182*9880d681SAndroid Build Coastguard Worker union { // The discriminated union. 183*9880d681SAndroid Build Coastguard Worker struct { 184*9880d681SAndroid Build Coastguard Worker MVT::SimpleValueType VT; 185*9880d681SAndroid Build Coastguard Worker } SDTCisVT_Info; 186*9880d681SAndroid Build Coastguard Worker struct { 187*9880d681SAndroid Build Coastguard Worker unsigned OtherOperandNum; 188*9880d681SAndroid Build Coastguard Worker } SDTCisSameAs_Info; 189*9880d681SAndroid Build Coastguard Worker struct { 190*9880d681SAndroid Build Coastguard Worker unsigned OtherOperandNum; 191*9880d681SAndroid Build Coastguard Worker } SDTCisVTSmallerThanOp_Info; 192*9880d681SAndroid Build Coastguard Worker struct { 193*9880d681SAndroid Build Coastguard Worker unsigned BigOperandNum; 194*9880d681SAndroid Build Coastguard Worker } SDTCisOpSmallerThanOp_Info; 195*9880d681SAndroid Build Coastguard Worker struct { 196*9880d681SAndroid Build Coastguard Worker unsigned OtherOperandNum; 197*9880d681SAndroid Build Coastguard Worker } SDTCisEltOfVec_Info; 198*9880d681SAndroid Build Coastguard Worker struct { 199*9880d681SAndroid Build Coastguard Worker unsigned OtherOperandNum; 200*9880d681SAndroid Build Coastguard Worker } SDTCisSubVecOfVec_Info; 201*9880d681SAndroid Build Coastguard Worker struct { 202*9880d681SAndroid Build Coastguard Worker MVT::SimpleValueType VT; 203*9880d681SAndroid Build Coastguard Worker } SDTCVecEltisVT_Info; 204*9880d681SAndroid Build Coastguard Worker struct { 205*9880d681SAndroid Build Coastguard Worker unsigned OtherOperandNum; 206*9880d681SAndroid Build Coastguard Worker } SDTCisSameNumEltsAs_Info; 207*9880d681SAndroid Build Coastguard Worker struct { 208*9880d681SAndroid Build Coastguard Worker unsigned OtherOperandNum; 209*9880d681SAndroid Build Coastguard Worker } SDTCisSameSizeAs_Info; 210*9880d681SAndroid Build Coastguard Worker } x; 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Worker /// ApplyTypeConstraint - Given a node in a pattern, apply this type 213*9880d681SAndroid Build Coastguard Worker /// constraint to the nodes operands. This returns true if it makes a 214*9880d681SAndroid Build Coastguard Worker /// change, false otherwise. If a type contradiction is found, an error 215*9880d681SAndroid Build Coastguard Worker /// is flagged. 216*9880d681SAndroid Build Coastguard Worker bool ApplyTypeConstraint(TreePatternNode *N, const SDNodeInfo &NodeInfo, 217*9880d681SAndroid Build Coastguard Worker TreePattern &TP) const; 218*9880d681SAndroid Build Coastguard Worker }; 219*9880d681SAndroid Build Coastguard Worker 220*9880d681SAndroid Build Coastguard Worker /// SDNodeInfo - One of these records is created for each SDNode instance in 221*9880d681SAndroid Build Coastguard Worker /// the target .td file. This represents the various dag nodes we will be 222*9880d681SAndroid Build Coastguard Worker /// processing. 223*9880d681SAndroid Build Coastguard Worker class SDNodeInfo { 224*9880d681SAndroid Build Coastguard Worker Record *Def; 225*9880d681SAndroid Build Coastguard Worker std::string EnumName; 226*9880d681SAndroid Build Coastguard Worker std::string SDClassName; 227*9880d681SAndroid Build Coastguard Worker unsigned Properties; 228*9880d681SAndroid Build Coastguard Worker unsigned NumResults; 229*9880d681SAndroid Build Coastguard Worker int NumOperands; 230*9880d681SAndroid Build Coastguard Worker std::vector<SDTypeConstraint> TypeConstraints; 231*9880d681SAndroid Build Coastguard Worker public: 232*9880d681SAndroid Build Coastguard Worker SDNodeInfo(Record *R); // Parse the specified record. 233*9880d681SAndroid Build Coastguard Worker getNumResults()234*9880d681SAndroid Build Coastguard Worker unsigned getNumResults() const { return NumResults; } 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker /// getNumOperands - This is the number of operands required or -1 if 237*9880d681SAndroid Build Coastguard Worker /// variadic. getNumOperands()238*9880d681SAndroid Build Coastguard Worker int getNumOperands() const { return NumOperands; } getRecord()239*9880d681SAndroid Build Coastguard Worker Record *getRecord() const { return Def; } getEnumName()240*9880d681SAndroid Build Coastguard Worker const std::string &getEnumName() const { return EnumName; } getSDClassName()241*9880d681SAndroid Build Coastguard Worker const std::string &getSDClassName() const { return SDClassName; } 242*9880d681SAndroid Build Coastguard Worker getTypeConstraints()243*9880d681SAndroid Build Coastguard Worker const std::vector<SDTypeConstraint> &getTypeConstraints() const { 244*9880d681SAndroid Build Coastguard Worker return TypeConstraints; 245*9880d681SAndroid Build Coastguard Worker } 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Worker /// getKnownType - If the type constraints on this node imply a fixed type 248*9880d681SAndroid Build Coastguard Worker /// (e.g. all stores return void, etc), then return it as an 249*9880d681SAndroid Build Coastguard Worker /// MVT::SimpleValueType. Otherwise, return MVT::Other. 250*9880d681SAndroid Build Coastguard Worker MVT::SimpleValueType getKnownType(unsigned ResNo) const; 251*9880d681SAndroid Build Coastguard Worker 252*9880d681SAndroid Build Coastguard Worker /// hasProperty - Return true if this node has the specified property. 253*9880d681SAndroid Build Coastguard Worker /// hasProperty(enum SDNP Prop)254*9880d681SAndroid Build Coastguard Worker bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); } 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker /// ApplyTypeConstraints - Given a node in a pattern, apply the type 257*9880d681SAndroid Build Coastguard Worker /// constraints for this node to the operands of the node. This returns 258*9880d681SAndroid Build Coastguard Worker /// true if it makes a change, false otherwise. If a type contradiction is 259*9880d681SAndroid Build Coastguard Worker /// found, an error is flagged. ApplyTypeConstraints(TreePatternNode * N,TreePattern & TP)260*9880d681SAndroid Build Coastguard Worker bool ApplyTypeConstraints(TreePatternNode *N, TreePattern &TP) const { 261*9880d681SAndroid Build Coastguard Worker bool MadeChange = false; 262*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = TypeConstraints.size(); i != e; ++i) 263*9880d681SAndroid Build Coastguard Worker MadeChange |= TypeConstraints[i].ApplyTypeConstraint(N, *this, TP); 264*9880d681SAndroid Build Coastguard Worker return MadeChange; 265*9880d681SAndroid Build Coastguard Worker } 266*9880d681SAndroid Build Coastguard Worker }; 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker /// TreePredicateFn - This is an abstraction that represents the predicates on 269*9880d681SAndroid Build Coastguard Worker /// a PatFrag node. This is a simple one-word wrapper around a pointer to 270*9880d681SAndroid Build Coastguard Worker /// provide nice accessors. 271*9880d681SAndroid Build Coastguard Worker class TreePredicateFn { 272*9880d681SAndroid Build Coastguard Worker /// PatFragRec - This is the TreePattern for the PatFrag that we 273*9880d681SAndroid Build Coastguard Worker /// originally came from. 274*9880d681SAndroid Build Coastguard Worker TreePattern *PatFragRec; 275*9880d681SAndroid Build Coastguard Worker public: 276*9880d681SAndroid Build Coastguard Worker /// TreePredicateFn constructor. Here 'N' is a subclass of PatFrag. 277*9880d681SAndroid Build Coastguard Worker TreePredicateFn(TreePattern *N); 278*9880d681SAndroid Build Coastguard Worker 279*9880d681SAndroid Build Coastguard Worker getOrigPatFragRecord()280*9880d681SAndroid Build Coastguard Worker TreePattern *getOrigPatFragRecord() const { return PatFragRec; } 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Worker /// isAlwaysTrue - Return true if this is a noop predicate. 283*9880d681SAndroid Build Coastguard Worker bool isAlwaysTrue() const; 284*9880d681SAndroid Build Coastguard Worker isImmediatePattern()285*9880d681SAndroid Build Coastguard Worker bool isImmediatePattern() const { return !getImmCode().empty(); } 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Worker /// getImmediatePredicateCode - Return the code that evaluates this pattern if 288*9880d681SAndroid Build Coastguard Worker /// this is an immediate predicate. It is an error to call this on a 289*9880d681SAndroid Build Coastguard Worker /// non-immediate pattern. getImmediatePredicateCode()290*9880d681SAndroid Build Coastguard Worker std::string getImmediatePredicateCode() const { 291*9880d681SAndroid Build Coastguard Worker std::string Result = getImmCode(); 292*9880d681SAndroid Build Coastguard Worker assert(!Result.empty() && "Isn't an immediate pattern!"); 293*9880d681SAndroid Build Coastguard Worker return Result; 294*9880d681SAndroid Build Coastguard Worker } 295*9880d681SAndroid Build Coastguard Worker 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker bool operator==(const TreePredicateFn &RHS) const { 298*9880d681SAndroid Build Coastguard Worker return PatFragRec == RHS.PatFragRec; 299*9880d681SAndroid Build Coastguard Worker } 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Worker bool operator!=(const TreePredicateFn &RHS) const { return !(*this == RHS); } 302*9880d681SAndroid Build Coastguard Worker 303*9880d681SAndroid Build Coastguard Worker /// Return the name to use in the generated code to reference this, this is 304*9880d681SAndroid Build Coastguard Worker /// "Predicate_foo" if from a pattern fragment "foo". 305*9880d681SAndroid Build Coastguard Worker std::string getFnName() const; 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Worker /// getCodeToRunOnSDNode - Return the code for the function body that 308*9880d681SAndroid Build Coastguard Worker /// evaluates this predicate. The argument is expected to be in "Node", 309*9880d681SAndroid Build Coastguard Worker /// not N. This handles casting and conversion to a concrete node type as 310*9880d681SAndroid Build Coastguard Worker /// appropriate. 311*9880d681SAndroid Build Coastguard Worker std::string getCodeToRunOnSDNode() const; 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Worker private: 314*9880d681SAndroid Build Coastguard Worker std::string getPredCode() const; 315*9880d681SAndroid Build Coastguard Worker std::string getImmCode() const; 316*9880d681SAndroid Build Coastguard Worker }; 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker /// FIXME: TreePatternNode's can be shared in some cases (due to dag-shaped 320*9880d681SAndroid Build Coastguard Worker /// patterns), and as such should be ref counted. We currently just leak all 321*9880d681SAndroid Build Coastguard Worker /// TreePatternNode objects! 322*9880d681SAndroid Build Coastguard Worker class TreePatternNode { 323*9880d681SAndroid Build Coastguard Worker /// The type of each node result. Before and during type inference, each 324*9880d681SAndroid Build Coastguard Worker /// result may be a set of possible types. After (successful) type inference, 325*9880d681SAndroid Build Coastguard Worker /// each is a single concrete type. 326*9880d681SAndroid Build Coastguard Worker SmallVector<EEVT::TypeSet, 1> Types; 327*9880d681SAndroid Build Coastguard Worker 328*9880d681SAndroid Build Coastguard Worker /// Operator - The Record for the operator if this is an interior node (not 329*9880d681SAndroid Build Coastguard Worker /// a leaf). 330*9880d681SAndroid Build Coastguard Worker Record *Operator; 331*9880d681SAndroid Build Coastguard Worker 332*9880d681SAndroid Build Coastguard Worker /// Val - The init value (e.g. the "GPRC" record, or "7") for a leaf. 333*9880d681SAndroid Build Coastguard Worker /// 334*9880d681SAndroid Build Coastguard Worker Init *Val; 335*9880d681SAndroid Build Coastguard Worker 336*9880d681SAndroid Build Coastguard Worker /// Name - The name given to this node with the :$foo notation. 337*9880d681SAndroid Build Coastguard Worker /// 338*9880d681SAndroid Build Coastguard Worker std::string Name; 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Worker /// PredicateFns - The predicate functions to execute on this node to check 341*9880d681SAndroid Build Coastguard Worker /// for a match. If this list is empty, no predicate is involved. 342*9880d681SAndroid Build Coastguard Worker std::vector<TreePredicateFn> PredicateFns; 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Worker /// TransformFn - The transformation function to execute on this node before 345*9880d681SAndroid Build Coastguard Worker /// it can be substituted into the resulting instruction on a pattern match. 346*9880d681SAndroid Build Coastguard Worker Record *TransformFn; 347*9880d681SAndroid Build Coastguard Worker 348*9880d681SAndroid Build Coastguard Worker std::vector<TreePatternNode*> Children; 349*9880d681SAndroid Build Coastguard Worker public: TreePatternNode(Record * Op,const std::vector<TreePatternNode * > & Ch,unsigned NumResults)350*9880d681SAndroid Build Coastguard Worker TreePatternNode(Record *Op, const std::vector<TreePatternNode*> &Ch, 351*9880d681SAndroid Build Coastguard Worker unsigned NumResults) 352*9880d681SAndroid Build Coastguard Worker : Operator(Op), Val(nullptr), TransformFn(nullptr), Children(Ch) { 353*9880d681SAndroid Build Coastguard Worker Types.resize(NumResults); 354*9880d681SAndroid Build Coastguard Worker } TreePatternNode(Init * val,unsigned NumResults)355*9880d681SAndroid Build Coastguard Worker TreePatternNode(Init *val, unsigned NumResults) // leaf ctor 356*9880d681SAndroid Build Coastguard Worker : Operator(nullptr), Val(val), TransformFn(nullptr) { 357*9880d681SAndroid Build Coastguard Worker Types.resize(NumResults); 358*9880d681SAndroid Build Coastguard Worker } 359*9880d681SAndroid Build Coastguard Worker ~TreePatternNode(); 360*9880d681SAndroid Build Coastguard Worker hasName()361*9880d681SAndroid Build Coastguard Worker bool hasName() const { return !Name.empty(); } getName()362*9880d681SAndroid Build Coastguard Worker const std::string &getName() const { return Name; } setName(StringRef N)363*9880d681SAndroid Build Coastguard Worker void setName(StringRef N) { Name.assign(N.begin(), N.end()); } 364*9880d681SAndroid Build Coastguard Worker isLeaf()365*9880d681SAndroid Build Coastguard Worker bool isLeaf() const { return Val != nullptr; } 366*9880d681SAndroid Build Coastguard Worker 367*9880d681SAndroid Build Coastguard Worker // Type accessors. getNumTypes()368*9880d681SAndroid Build Coastguard Worker unsigned getNumTypes() const { return Types.size(); } getType(unsigned ResNo)369*9880d681SAndroid Build Coastguard Worker MVT::SimpleValueType getType(unsigned ResNo) const { 370*9880d681SAndroid Build Coastguard Worker return Types[ResNo].getConcrete(); 371*9880d681SAndroid Build Coastguard Worker } getExtTypes()372*9880d681SAndroid Build Coastguard Worker const SmallVectorImpl<EEVT::TypeSet> &getExtTypes() const { return Types; } getExtType(unsigned ResNo)373*9880d681SAndroid Build Coastguard Worker const EEVT::TypeSet &getExtType(unsigned ResNo) const { return Types[ResNo]; } getExtType(unsigned ResNo)374*9880d681SAndroid Build Coastguard Worker EEVT::TypeSet &getExtType(unsigned ResNo) { return Types[ResNo]; } setType(unsigned ResNo,const EEVT::TypeSet & T)375*9880d681SAndroid Build Coastguard Worker void setType(unsigned ResNo, const EEVT::TypeSet &T) { Types[ResNo] = T; } 376*9880d681SAndroid Build Coastguard Worker hasTypeSet(unsigned ResNo)377*9880d681SAndroid Build Coastguard Worker bool hasTypeSet(unsigned ResNo) const { 378*9880d681SAndroid Build Coastguard Worker return Types[ResNo].isConcrete(); 379*9880d681SAndroid Build Coastguard Worker } isTypeCompletelyUnknown(unsigned ResNo)380*9880d681SAndroid Build Coastguard Worker bool isTypeCompletelyUnknown(unsigned ResNo) const { 381*9880d681SAndroid Build Coastguard Worker return Types[ResNo].isCompletelyUnknown(); 382*9880d681SAndroid Build Coastguard Worker } isTypeDynamicallyResolved(unsigned ResNo)383*9880d681SAndroid Build Coastguard Worker bool isTypeDynamicallyResolved(unsigned ResNo) const { 384*9880d681SAndroid Build Coastguard Worker return Types[ResNo].isDynamicallyResolved(); 385*9880d681SAndroid Build Coastguard Worker } 386*9880d681SAndroid Build Coastguard Worker getLeafValue()387*9880d681SAndroid Build Coastguard Worker Init *getLeafValue() const { assert(isLeaf()); return Val; } getOperator()388*9880d681SAndroid Build Coastguard Worker Record *getOperator() const { assert(!isLeaf()); return Operator; } 389*9880d681SAndroid Build Coastguard Worker getNumChildren()390*9880d681SAndroid Build Coastguard Worker unsigned getNumChildren() const { return Children.size(); } getChild(unsigned N)391*9880d681SAndroid Build Coastguard Worker TreePatternNode *getChild(unsigned N) const { return Children[N]; } setChild(unsigned i,TreePatternNode * N)392*9880d681SAndroid Build Coastguard Worker void setChild(unsigned i, TreePatternNode *N) { 393*9880d681SAndroid Build Coastguard Worker Children[i] = N; 394*9880d681SAndroid Build Coastguard Worker } 395*9880d681SAndroid Build Coastguard Worker 396*9880d681SAndroid Build Coastguard Worker /// hasChild - Return true if N is any of our children. hasChild(const TreePatternNode * N)397*9880d681SAndroid Build Coastguard Worker bool hasChild(const TreePatternNode *N) const { 398*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Children.size(); i != e; ++i) 399*9880d681SAndroid Build Coastguard Worker if (Children[i] == N) return true; 400*9880d681SAndroid Build Coastguard Worker return false; 401*9880d681SAndroid Build Coastguard Worker } 402*9880d681SAndroid Build Coastguard Worker hasAnyPredicate()403*9880d681SAndroid Build Coastguard Worker bool hasAnyPredicate() const { return !PredicateFns.empty(); } 404*9880d681SAndroid Build Coastguard Worker getPredicateFns()405*9880d681SAndroid Build Coastguard Worker const std::vector<TreePredicateFn> &getPredicateFns() const { 406*9880d681SAndroid Build Coastguard Worker return PredicateFns; 407*9880d681SAndroid Build Coastguard Worker } clearPredicateFns()408*9880d681SAndroid Build Coastguard Worker void clearPredicateFns() { PredicateFns.clear(); } setPredicateFns(const std::vector<TreePredicateFn> & Fns)409*9880d681SAndroid Build Coastguard Worker void setPredicateFns(const std::vector<TreePredicateFn> &Fns) { 410*9880d681SAndroid Build Coastguard Worker assert(PredicateFns.empty() && "Overwriting non-empty predicate list!"); 411*9880d681SAndroid Build Coastguard Worker PredicateFns = Fns; 412*9880d681SAndroid Build Coastguard Worker } addPredicateFn(const TreePredicateFn & Fn)413*9880d681SAndroid Build Coastguard Worker void addPredicateFn(const TreePredicateFn &Fn) { 414*9880d681SAndroid Build Coastguard Worker assert(!Fn.isAlwaysTrue() && "Empty predicate string!"); 415*9880d681SAndroid Build Coastguard Worker if (std::find(PredicateFns.begin(), PredicateFns.end(), Fn) == 416*9880d681SAndroid Build Coastguard Worker PredicateFns.end()) 417*9880d681SAndroid Build Coastguard Worker PredicateFns.push_back(Fn); 418*9880d681SAndroid Build Coastguard Worker } 419*9880d681SAndroid Build Coastguard Worker getTransformFn()420*9880d681SAndroid Build Coastguard Worker Record *getTransformFn() const { return TransformFn; } setTransformFn(Record * Fn)421*9880d681SAndroid Build Coastguard Worker void setTransformFn(Record *Fn) { TransformFn = Fn; } 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Worker /// getIntrinsicInfo - If this node corresponds to an intrinsic, return the 424*9880d681SAndroid Build Coastguard Worker /// CodeGenIntrinsic information for it, otherwise return a null pointer. 425*9880d681SAndroid Build Coastguard Worker const CodeGenIntrinsic *getIntrinsicInfo(const CodeGenDAGPatterns &CDP) const; 426*9880d681SAndroid Build Coastguard Worker 427*9880d681SAndroid Build Coastguard Worker /// getComplexPatternInfo - If this node corresponds to a ComplexPattern, 428*9880d681SAndroid Build Coastguard Worker /// return the ComplexPattern information, otherwise return null. 429*9880d681SAndroid Build Coastguard Worker const ComplexPattern * 430*9880d681SAndroid Build Coastguard Worker getComplexPatternInfo(const CodeGenDAGPatterns &CGP) const; 431*9880d681SAndroid Build Coastguard Worker 432*9880d681SAndroid Build Coastguard Worker /// Returns the number of MachineInstr operands that would be produced by this 433*9880d681SAndroid Build Coastguard Worker /// node if it mapped directly to an output Instruction's 434*9880d681SAndroid Build Coastguard Worker /// operand. ComplexPattern specifies this explicitly; MIOperandInfo gives it 435*9880d681SAndroid Build Coastguard Worker /// for Operands; otherwise 1. 436*9880d681SAndroid Build Coastguard Worker unsigned getNumMIResults(const CodeGenDAGPatterns &CGP) const; 437*9880d681SAndroid Build Coastguard Worker 438*9880d681SAndroid Build Coastguard Worker /// NodeHasProperty - Return true if this node has the specified property. 439*9880d681SAndroid Build Coastguard Worker bool NodeHasProperty(SDNP Property, const CodeGenDAGPatterns &CGP) const; 440*9880d681SAndroid Build Coastguard Worker 441*9880d681SAndroid Build Coastguard Worker /// TreeHasProperty - Return true if any node in this tree has the specified 442*9880d681SAndroid Build Coastguard Worker /// property. 443*9880d681SAndroid Build Coastguard Worker bool TreeHasProperty(SDNP Property, const CodeGenDAGPatterns &CGP) const; 444*9880d681SAndroid Build Coastguard Worker 445*9880d681SAndroid Build Coastguard Worker /// isCommutativeIntrinsic - Return true if the node is an intrinsic which is 446*9880d681SAndroid Build Coastguard Worker /// marked isCommutative. 447*9880d681SAndroid Build Coastguard Worker bool isCommutativeIntrinsic(const CodeGenDAGPatterns &CDP) const; 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Worker void print(raw_ostream &OS) const; 450*9880d681SAndroid Build Coastguard Worker void dump() const; 451*9880d681SAndroid Build Coastguard Worker 452*9880d681SAndroid Build Coastguard Worker public: // Higher level manipulation routines. 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Worker /// clone - Return a new copy of this tree. 455*9880d681SAndroid Build Coastguard Worker /// 456*9880d681SAndroid Build Coastguard Worker TreePatternNode *clone() const; 457*9880d681SAndroid Build Coastguard Worker 458*9880d681SAndroid Build Coastguard Worker /// RemoveAllTypes - Recursively strip all the types of this tree. 459*9880d681SAndroid Build Coastguard Worker void RemoveAllTypes(); 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Worker /// isIsomorphicTo - Return true if this node is recursively isomorphic to 462*9880d681SAndroid Build Coastguard Worker /// the specified node. For this comparison, all of the state of the node 463*9880d681SAndroid Build Coastguard Worker /// is considered, except for the assigned name. Nodes with differing names 464*9880d681SAndroid Build Coastguard Worker /// that are otherwise identical are considered isomorphic. 465*9880d681SAndroid Build Coastguard Worker bool isIsomorphicTo(const TreePatternNode *N, 466*9880d681SAndroid Build Coastguard Worker const MultipleUseVarSet &DepVars) const; 467*9880d681SAndroid Build Coastguard Worker 468*9880d681SAndroid Build Coastguard Worker /// SubstituteFormalArguments - Replace the formal arguments in this tree 469*9880d681SAndroid Build Coastguard Worker /// with actual values specified by ArgMap. 470*9880d681SAndroid Build Coastguard Worker void SubstituteFormalArguments(std::map<std::string, 471*9880d681SAndroid Build Coastguard Worker TreePatternNode*> &ArgMap); 472*9880d681SAndroid Build Coastguard Worker 473*9880d681SAndroid Build Coastguard Worker /// InlinePatternFragments - If this pattern refers to any pattern 474*9880d681SAndroid Build Coastguard Worker /// fragments, inline them into place, giving us a pattern without any 475*9880d681SAndroid Build Coastguard Worker /// PatFrag references. 476*9880d681SAndroid Build Coastguard Worker TreePatternNode *InlinePatternFragments(TreePattern &TP); 477*9880d681SAndroid Build Coastguard Worker 478*9880d681SAndroid Build Coastguard Worker /// ApplyTypeConstraints - Apply all of the type constraints relevant to 479*9880d681SAndroid Build Coastguard Worker /// this node and its children in the tree. This returns true if it makes a 480*9880d681SAndroid Build Coastguard Worker /// change, false otherwise. If a type contradiction is found, flag an error. 481*9880d681SAndroid Build Coastguard Worker bool ApplyTypeConstraints(TreePattern &TP, bool NotRegisters); 482*9880d681SAndroid Build Coastguard Worker 483*9880d681SAndroid Build Coastguard Worker /// UpdateNodeType - Set the node type of N to VT if VT contains 484*9880d681SAndroid Build Coastguard Worker /// information. If N already contains a conflicting type, then flag an 485*9880d681SAndroid Build Coastguard Worker /// error. This returns true if any information was updated. 486*9880d681SAndroid Build Coastguard Worker /// UpdateNodeType(unsigned ResNo,const EEVT::TypeSet & InTy,TreePattern & TP)487*9880d681SAndroid Build Coastguard Worker bool UpdateNodeType(unsigned ResNo, const EEVT::TypeSet &InTy, 488*9880d681SAndroid Build Coastguard Worker TreePattern &TP) { 489*9880d681SAndroid Build Coastguard Worker return Types[ResNo].MergeInTypeInfo(InTy, TP); 490*9880d681SAndroid Build Coastguard Worker } 491*9880d681SAndroid Build Coastguard Worker UpdateNodeType(unsigned ResNo,MVT::SimpleValueType InTy,TreePattern & TP)492*9880d681SAndroid Build Coastguard Worker bool UpdateNodeType(unsigned ResNo, MVT::SimpleValueType InTy, 493*9880d681SAndroid Build Coastguard Worker TreePattern &TP) { 494*9880d681SAndroid Build Coastguard Worker return Types[ResNo].MergeInTypeInfo(EEVT::TypeSet(InTy, TP), TP); 495*9880d681SAndroid Build Coastguard Worker } 496*9880d681SAndroid Build Coastguard Worker 497*9880d681SAndroid Build Coastguard Worker // Update node type with types inferred from an instruction operand or result 498*9880d681SAndroid Build Coastguard Worker // def from the ins/outs lists. 499*9880d681SAndroid Build Coastguard Worker // Return true if the type changed. 500*9880d681SAndroid Build Coastguard Worker bool UpdateNodeTypeFromInst(unsigned ResNo, Record *Operand, TreePattern &TP); 501*9880d681SAndroid Build Coastguard Worker 502*9880d681SAndroid Build Coastguard Worker /// ContainsUnresolvedType - Return true if this tree contains any 503*9880d681SAndroid Build Coastguard Worker /// unresolved types. ContainsUnresolvedType()504*9880d681SAndroid Build Coastguard Worker bool ContainsUnresolvedType() const { 505*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Types.size(); i != e; ++i) 506*9880d681SAndroid Build Coastguard Worker if (!Types[i].isConcrete()) return true; 507*9880d681SAndroid Build Coastguard Worker 508*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = getNumChildren(); i != e; ++i) 509*9880d681SAndroid Build Coastguard Worker if (getChild(i)->ContainsUnresolvedType()) return true; 510*9880d681SAndroid Build Coastguard Worker return false; 511*9880d681SAndroid Build Coastguard Worker } 512*9880d681SAndroid Build Coastguard Worker 513*9880d681SAndroid Build Coastguard Worker /// canPatternMatch - If it is impossible for this pattern to match on this 514*9880d681SAndroid Build Coastguard Worker /// target, fill in Reason and return false. Otherwise, return true. 515*9880d681SAndroid Build Coastguard Worker bool canPatternMatch(std::string &Reason, const CodeGenDAGPatterns &CDP); 516*9880d681SAndroid Build Coastguard Worker }; 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard Worker inline raw_ostream &operator<<(raw_ostream &OS, const TreePatternNode &TPN) { 519*9880d681SAndroid Build Coastguard Worker TPN.print(OS); 520*9880d681SAndroid Build Coastguard Worker return OS; 521*9880d681SAndroid Build Coastguard Worker } 522*9880d681SAndroid Build Coastguard Worker 523*9880d681SAndroid Build Coastguard Worker 524*9880d681SAndroid Build Coastguard Worker /// TreePattern - Represent a pattern, used for instructions, pattern 525*9880d681SAndroid Build Coastguard Worker /// fragments, etc. 526*9880d681SAndroid Build Coastguard Worker /// 527*9880d681SAndroid Build Coastguard Worker class TreePattern { 528*9880d681SAndroid Build Coastguard Worker /// Trees - The list of pattern trees which corresponds to this pattern. 529*9880d681SAndroid Build Coastguard Worker /// Note that PatFrag's only have a single tree. 530*9880d681SAndroid Build Coastguard Worker /// 531*9880d681SAndroid Build Coastguard Worker std::vector<TreePatternNode*> Trees; 532*9880d681SAndroid Build Coastguard Worker 533*9880d681SAndroid Build Coastguard Worker /// NamedNodes - This is all of the nodes that have names in the trees in this 534*9880d681SAndroid Build Coastguard Worker /// pattern. 535*9880d681SAndroid Build Coastguard Worker StringMap<SmallVector<TreePatternNode*,1> > NamedNodes; 536*9880d681SAndroid Build Coastguard Worker 537*9880d681SAndroid Build Coastguard Worker /// TheRecord - The actual TableGen record corresponding to this pattern. 538*9880d681SAndroid Build Coastguard Worker /// 539*9880d681SAndroid Build Coastguard Worker Record *TheRecord; 540*9880d681SAndroid Build Coastguard Worker 541*9880d681SAndroid Build Coastguard Worker /// Args - This is a list of all of the arguments to this pattern (for 542*9880d681SAndroid Build Coastguard Worker /// PatFrag patterns), which are the 'node' markers in this pattern. 543*9880d681SAndroid Build Coastguard Worker std::vector<std::string> Args; 544*9880d681SAndroid Build Coastguard Worker 545*9880d681SAndroid Build Coastguard Worker /// CDP - the top-level object coordinating this madness. 546*9880d681SAndroid Build Coastguard Worker /// 547*9880d681SAndroid Build Coastguard Worker CodeGenDAGPatterns &CDP; 548*9880d681SAndroid Build Coastguard Worker 549*9880d681SAndroid Build Coastguard Worker /// isInputPattern - True if this is an input pattern, something to match. 550*9880d681SAndroid Build Coastguard Worker /// False if this is an output pattern, something to emit. 551*9880d681SAndroid Build Coastguard Worker bool isInputPattern; 552*9880d681SAndroid Build Coastguard Worker 553*9880d681SAndroid Build Coastguard Worker /// hasError - True if the currently processed nodes have unresolvable types 554*9880d681SAndroid Build Coastguard Worker /// or other non-fatal errors 555*9880d681SAndroid Build Coastguard Worker bool HasError; 556*9880d681SAndroid Build Coastguard Worker 557*9880d681SAndroid Build Coastguard Worker /// It's important that the usage of operands in ComplexPatterns is 558*9880d681SAndroid Build Coastguard Worker /// consistent: each named operand can be defined by at most one 559*9880d681SAndroid Build Coastguard Worker /// ComplexPattern. This records the ComplexPattern instance and the operand 560*9880d681SAndroid Build Coastguard Worker /// number for each operand encountered in a ComplexPattern to aid in that 561*9880d681SAndroid Build Coastguard Worker /// check. 562*9880d681SAndroid Build Coastguard Worker StringMap<std::pair<Record *, unsigned>> ComplexPatternOperands; 563*9880d681SAndroid Build Coastguard Worker public: 564*9880d681SAndroid Build Coastguard Worker 565*9880d681SAndroid Build Coastguard Worker /// TreePattern constructor - Parse the specified DagInits into the 566*9880d681SAndroid Build Coastguard Worker /// current record. 567*9880d681SAndroid Build Coastguard Worker TreePattern(Record *TheRec, ListInit *RawPat, bool isInput, 568*9880d681SAndroid Build Coastguard Worker CodeGenDAGPatterns &ise); 569*9880d681SAndroid Build Coastguard Worker TreePattern(Record *TheRec, DagInit *Pat, bool isInput, 570*9880d681SAndroid Build Coastguard Worker CodeGenDAGPatterns &ise); 571*9880d681SAndroid Build Coastguard Worker TreePattern(Record *TheRec, TreePatternNode *Pat, bool isInput, 572*9880d681SAndroid Build Coastguard Worker CodeGenDAGPatterns &ise); 573*9880d681SAndroid Build Coastguard Worker 574*9880d681SAndroid Build Coastguard Worker /// getTrees - Return the tree patterns which corresponds to this pattern. 575*9880d681SAndroid Build Coastguard Worker /// getTrees()576*9880d681SAndroid Build Coastguard Worker const std::vector<TreePatternNode*> &getTrees() const { return Trees; } getNumTrees()577*9880d681SAndroid Build Coastguard Worker unsigned getNumTrees() const { return Trees.size(); } getTree(unsigned i)578*9880d681SAndroid Build Coastguard Worker TreePatternNode *getTree(unsigned i) const { return Trees[i]; } getOnlyTree()579*9880d681SAndroid Build Coastguard Worker TreePatternNode *getOnlyTree() const { 580*9880d681SAndroid Build Coastguard Worker assert(Trees.size() == 1 && "Doesn't have exactly one pattern!"); 581*9880d681SAndroid Build Coastguard Worker return Trees[0]; 582*9880d681SAndroid Build Coastguard Worker } 583*9880d681SAndroid Build Coastguard Worker getNamedNodesMap()584*9880d681SAndroid Build Coastguard Worker const StringMap<SmallVector<TreePatternNode*,1> > &getNamedNodesMap() { 585*9880d681SAndroid Build Coastguard Worker if (NamedNodes.empty()) 586*9880d681SAndroid Build Coastguard Worker ComputeNamedNodes(); 587*9880d681SAndroid Build Coastguard Worker return NamedNodes; 588*9880d681SAndroid Build Coastguard Worker } 589*9880d681SAndroid Build Coastguard Worker 590*9880d681SAndroid Build Coastguard Worker /// getRecord - Return the actual TableGen record corresponding to this 591*9880d681SAndroid Build Coastguard Worker /// pattern. 592*9880d681SAndroid Build Coastguard Worker /// getRecord()593*9880d681SAndroid Build Coastguard Worker Record *getRecord() const { return TheRecord; } 594*9880d681SAndroid Build Coastguard Worker getNumArgs()595*9880d681SAndroid Build Coastguard Worker unsigned getNumArgs() const { return Args.size(); } getArgName(unsigned i)596*9880d681SAndroid Build Coastguard Worker const std::string &getArgName(unsigned i) const { 597*9880d681SAndroid Build Coastguard Worker assert(i < Args.size() && "Argument reference out of range!"); 598*9880d681SAndroid Build Coastguard Worker return Args[i]; 599*9880d681SAndroid Build Coastguard Worker } getArgList()600*9880d681SAndroid Build Coastguard Worker std::vector<std::string> &getArgList() { return Args; } 601*9880d681SAndroid Build Coastguard Worker getDAGPatterns()602*9880d681SAndroid Build Coastguard Worker CodeGenDAGPatterns &getDAGPatterns() const { return CDP; } 603*9880d681SAndroid Build Coastguard Worker 604*9880d681SAndroid Build Coastguard Worker /// InlinePatternFragments - If this pattern refers to any pattern 605*9880d681SAndroid Build Coastguard Worker /// fragments, inline them into place, giving us a pattern without any 606*9880d681SAndroid Build Coastguard Worker /// PatFrag references. InlinePatternFragments()607*9880d681SAndroid Build Coastguard Worker void InlinePatternFragments() { 608*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Trees.size(); i != e; ++i) 609*9880d681SAndroid Build Coastguard Worker Trees[i] = Trees[i]->InlinePatternFragments(*this); 610*9880d681SAndroid Build Coastguard Worker } 611*9880d681SAndroid Build Coastguard Worker 612*9880d681SAndroid Build Coastguard Worker /// InferAllTypes - Infer/propagate as many types throughout the expression 613*9880d681SAndroid Build Coastguard Worker /// patterns as possible. Return true if all types are inferred, false 614*9880d681SAndroid Build Coastguard Worker /// otherwise. Bail out if a type contradiction is found. 615*9880d681SAndroid Build Coastguard Worker bool InferAllTypes(const StringMap<SmallVector<TreePatternNode*,1> > 616*9880d681SAndroid Build Coastguard Worker *NamedTypes=nullptr); 617*9880d681SAndroid Build Coastguard Worker 618*9880d681SAndroid Build Coastguard Worker /// error - If this is the first error in the current resolution step, 619*9880d681SAndroid Build Coastguard Worker /// print it and set the error flag. Otherwise, continue silently. 620*9880d681SAndroid Build Coastguard Worker void error(const Twine &Msg); hasError()621*9880d681SAndroid Build Coastguard Worker bool hasError() const { 622*9880d681SAndroid Build Coastguard Worker return HasError; 623*9880d681SAndroid Build Coastguard Worker } resetError()624*9880d681SAndroid Build Coastguard Worker void resetError() { 625*9880d681SAndroid Build Coastguard Worker HasError = false; 626*9880d681SAndroid Build Coastguard Worker } 627*9880d681SAndroid Build Coastguard Worker 628*9880d681SAndroid Build Coastguard Worker void print(raw_ostream &OS) const; 629*9880d681SAndroid Build Coastguard Worker void dump() const; 630*9880d681SAndroid Build Coastguard Worker 631*9880d681SAndroid Build Coastguard Worker private: 632*9880d681SAndroid Build Coastguard Worker TreePatternNode *ParseTreePattern(Init *DI, StringRef OpName); 633*9880d681SAndroid Build Coastguard Worker void ComputeNamedNodes(); 634*9880d681SAndroid Build Coastguard Worker void ComputeNamedNodes(TreePatternNode *N); 635*9880d681SAndroid Build Coastguard Worker }; 636*9880d681SAndroid Build Coastguard Worker 637*9880d681SAndroid Build Coastguard Worker /// DAGDefaultOperand - One of these is created for each OperandWithDefaultOps 638*9880d681SAndroid Build Coastguard Worker /// that has a set ExecuteAlways / DefaultOps field. 639*9880d681SAndroid Build Coastguard Worker struct DAGDefaultOperand { 640*9880d681SAndroid Build Coastguard Worker std::vector<TreePatternNode*> DefaultOps; 641*9880d681SAndroid Build Coastguard Worker }; 642*9880d681SAndroid Build Coastguard Worker 643*9880d681SAndroid Build Coastguard Worker class DAGInstruction { 644*9880d681SAndroid Build Coastguard Worker TreePattern *Pattern; 645*9880d681SAndroid Build Coastguard Worker std::vector<Record*> Results; 646*9880d681SAndroid Build Coastguard Worker std::vector<Record*> Operands; 647*9880d681SAndroid Build Coastguard Worker std::vector<Record*> ImpResults; 648*9880d681SAndroid Build Coastguard Worker TreePatternNode *ResultPattern; 649*9880d681SAndroid Build Coastguard Worker public: DAGInstruction(TreePattern * TP,const std::vector<Record * > & results,const std::vector<Record * > & operands,const std::vector<Record * > & impresults)650*9880d681SAndroid Build Coastguard Worker DAGInstruction(TreePattern *TP, 651*9880d681SAndroid Build Coastguard Worker const std::vector<Record*> &results, 652*9880d681SAndroid Build Coastguard Worker const std::vector<Record*> &operands, 653*9880d681SAndroid Build Coastguard Worker const std::vector<Record*> &impresults) 654*9880d681SAndroid Build Coastguard Worker : Pattern(TP), Results(results), Operands(operands), 655*9880d681SAndroid Build Coastguard Worker ImpResults(impresults), ResultPattern(nullptr) {} 656*9880d681SAndroid Build Coastguard Worker getPattern()657*9880d681SAndroid Build Coastguard Worker TreePattern *getPattern() const { return Pattern; } getNumResults()658*9880d681SAndroid Build Coastguard Worker unsigned getNumResults() const { return Results.size(); } getNumOperands()659*9880d681SAndroid Build Coastguard Worker unsigned getNumOperands() const { return Operands.size(); } getNumImpResults()660*9880d681SAndroid Build Coastguard Worker unsigned getNumImpResults() const { return ImpResults.size(); } getImpResults()661*9880d681SAndroid Build Coastguard Worker const std::vector<Record*>& getImpResults() const { return ImpResults; } 662*9880d681SAndroid Build Coastguard Worker setResultPattern(TreePatternNode * R)663*9880d681SAndroid Build Coastguard Worker void setResultPattern(TreePatternNode *R) { ResultPattern = R; } 664*9880d681SAndroid Build Coastguard Worker getResult(unsigned RN)665*9880d681SAndroid Build Coastguard Worker Record *getResult(unsigned RN) const { 666*9880d681SAndroid Build Coastguard Worker assert(RN < Results.size()); 667*9880d681SAndroid Build Coastguard Worker return Results[RN]; 668*9880d681SAndroid Build Coastguard Worker } 669*9880d681SAndroid Build Coastguard Worker getOperand(unsigned ON)670*9880d681SAndroid Build Coastguard Worker Record *getOperand(unsigned ON) const { 671*9880d681SAndroid Build Coastguard Worker assert(ON < Operands.size()); 672*9880d681SAndroid Build Coastguard Worker return Operands[ON]; 673*9880d681SAndroid Build Coastguard Worker } 674*9880d681SAndroid Build Coastguard Worker getImpResult(unsigned RN)675*9880d681SAndroid Build Coastguard Worker Record *getImpResult(unsigned RN) const { 676*9880d681SAndroid Build Coastguard Worker assert(RN < ImpResults.size()); 677*9880d681SAndroid Build Coastguard Worker return ImpResults[RN]; 678*9880d681SAndroid Build Coastguard Worker } 679*9880d681SAndroid Build Coastguard Worker getResultPattern()680*9880d681SAndroid Build Coastguard Worker TreePatternNode *getResultPattern() const { return ResultPattern; } 681*9880d681SAndroid Build Coastguard Worker }; 682*9880d681SAndroid Build Coastguard Worker 683*9880d681SAndroid Build Coastguard Worker /// PatternToMatch - Used by CodeGenDAGPatterns to keep tab of patterns 684*9880d681SAndroid Build Coastguard Worker /// processed to produce isel. 685*9880d681SAndroid Build Coastguard Worker class PatternToMatch { 686*9880d681SAndroid Build Coastguard Worker public: PatternToMatch(Record * srcrecord,ListInit * preds,TreePatternNode * src,TreePatternNode * dst,const std::vector<Record * > & dstregs,int complexity,unsigned uid)687*9880d681SAndroid Build Coastguard Worker PatternToMatch(Record *srcrecord, ListInit *preds, 688*9880d681SAndroid Build Coastguard Worker TreePatternNode *src, TreePatternNode *dst, 689*9880d681SAndroid Build Coastguard Worker const std::vector<Record*> &dstregs, 690*9880d681SAndroid Build Coastguard Worker int complexity, unsigned uid) 691*9880d681SAndroid Build Coastguard Worker : SrcRecord(srcrecord), Predicates(preds), SrcPattern(src), DstPattern(dst), 692*9880d681SAndroid Build Coastguard Worker Dstregs(dstregs), AddedComplexity(complexity), ID(uid) {} 693*9880d681SAndroid Build Coastguard Worker 694*9880d681SAndroid Build Coastguard Worker Record *SrcRecord; // Originating Record for the pattern. 695*9880d681SAndroid Build Coastguard Worker ListInit *Predicates; // Top level predicate conditions to match. 696*9880d681SAndroid Build Coastguard Worker TreePatternNode *SrcPattern; // Source pattern to match. 697*9880d681SAndroid Build Coastguard Worker TreePatternNode *DstPattern; // Resulting pattern. 698*9880d681SAndroid Build Coastguard Worker std::vector<Record*> Dstregs; // Physical register defs being matched. 699*9880d681SAndroid Build Coastguard Worker int AddedComplexity; // Add to matching pattern complexity. 700*9880d681SAndroid Build Coastguard Worker unsigned ID; // Unique ID for the record. 701*9880d681SAndroid Build Coastguard Worker getSrcRecord()702*9880d681SAndroid Build Coastguard Worker Record *getSrcRecord() const { return SrcRecord; } getPredicates()703*9880d681SAndroid Build Coastguard Worker ListInit *getPredicates() const { return Predicates; } getSrcPattern()704*9880d681SAndroid Build Coastguard Worker TreePatternNode *getSrcPattern() const { return SrcPattern; } getDstPattern()705*9880d681SAndroid Build Coastguard Worker TreePatternNode *getDstPattern() const { return DstPattern; } getDstRegs()706*9880d681SAndroid Build Coastguard Worker const std::vector<Record*> &getDstRegs() const { return Dstregs; } getAddedComplexity()707*9880d681SAndroid Build Coastguard Worker int getAddedComplexity() const { return AddedComplexity; } 708*9880d681SAndroid Build Coastguard Worker 709*9880d681SAndroid Build Coastguard Worker std::string getPredicateCheck() const; 710*9880d681SAndroid Build Coastguard Worker 711*9880d681SAndroid Build Coastguard Worker /// Compute the complexity metric for the input pattern. This roughly 712*9880d681SAndroid Build Coastguard Worker /// corresponds to the number of nodes that are covered. 713*9880d681SAndroid Build Coastguard Worker int getPatternComplexity(const CodeGenDAGPatterns &CGP) const; 714*9880d681SAndroid Build Coastguard Worker }; 715*9880d681SAndroid Build Coastguard Worker 716*9880d681SAndroid Build Coastguard Worker class CodeGenDAGPatterns { 717*9880d681SAndroid Build Coastguard Worker RecordKeeper &Records; 718*9880d681SAndroid Build Coastguard Worker CodeGenTarget Target; 719*9880d681SAndroid Build Coastguard Worker std::vector<CodeGenIntrinsic> Intrinsics; 720*9880d681SAndroid Build Coastguard Worker std::vector<CodeGenIntrinsic> TgtIntrinsics; 721*9880d681SAndroid Build Coastguard Worker 722*9880d681SAndroid Build Coastguard Worker std::map<Record*, SDNodeInfo, LessRecordByID> SDNodes; 723*9880d681SAndroid Build Coastguard Worker std::map<Record*, std::pair<Record*, std::string>, LessRecordByID> SDNodeXForms; 724*9880d681SAndroid Build Coastguard Worker std::map<Record*, ComplexPattern, LessRecordByID> ComplexPatterns; 725*9880d681SAndroid Build Coastguard Worker std::map<Record *, std::unique_ptr<TreePattern>, LessRecordByID> 726*9880d681SAndroid Build Coastguard Worker PatternFragments; 727*9880d681SAndroid Build Coastguard Worker std::map<Record*, DAGDefaultOperand, LessRecordByID> DefaultOperands; 728*9880d681SAndroid Build Coastguard Worker std::map<Record*, DAGInstruction, LessRecordByID> Instructions; 729*9880d681SAndroid Build Coastguard Worker 730*9880d681SAndroid Build Coastguard Worker // Specific SDNode definitions: 731*9880d681SAndroid Build Coastguard Worker Record *intrinsic_void_sdnode; 732*9880d681SAndroid Build Coastguard Worker Record *intrinsic_w_chain_sdnode, *intrinsic_wo_chain_sdnode; 733*9880d681SAndroid Build Coastguard Worker 734*9880d681SAndroid Build Coastguard Worker /// PatternsToMatch - All of the things we are matching on the DAG. The first 735*9880d681SAndroid Build Coastguard Worker /// value is the pattern to match, the second pattern is the result to 736*9880d681SAndroid Build Coastguard Worker /// emit. 737*9880d681SAndroid Build Coastguard Worker std::vector<PatternToMatch> PatternsToMatch; 738*9880d681SAndroid Build Coastguard Worker public: 739*9880d681SAndroid Build Coastguard Worker CodeGenDAGPatterns(RecordKeeper &R); 740*9880d681SAndroid Build Coastguard Worker getTargetInfo()741*9880d681SAndroid Build Coastguard Worker CodeGenTarget &getTargetInfo() { return Target; } getTargetInfo()742*9880d681SAndroid Build Coastguard Worker const CodeGenTarget &getTargetInfo() const { return Target; } 743*9880d681SAndroid Build Coastguard Worker 744*9880d681SAndroid Build Coastguard Worker Record *getSDNodeNamed(const std::string &Name) const; 745*9880d681SAndroid Build Coastguard Worker getSDNodeInfo(Record * R)746*9880d681SAndroid Build Coastguard Worker const SDNodeInfo &getSDNodeInfo(Record *R) const { 747*9880d681SAndroid Build Coastguard Worker assert(SDNodes.count(R) && "Unknown node!"); 748*9880d681SAndroid Build Coastguard Worker return SDNodes.find(R)->second; 749*9880d681SAndroid Build Coastguard Worker } 750*9880d681SAndroid Build Coastguard Worker 751*9880d681SAndroid Build Coastguard Worker // Node transformation lookups. 752*9880d681SAndroid Build Coastguard Worker typedef std::pair<Record*, std::string> NodeXForm; getSDNodeTransform(Record * R)753*9880d681SAndroid Build Coastguard Worker const NodeXForm &getSDNodeTransform(Record *R) const { 754*9880d681SAndroid Build Coastguard Worker assert(SDNodeXForms.count(R) && "Invalid transform!"); 755*9880d681SAndroid Build Coastguard Worker return SDNodeXForms.find(R)->second; 756*9880d681SAndroid Build Coastguard Worker } 757*9880d681SAndroid Build Coastguard Worker 758*9880d681SAndroid Build Coastguard Worker typedef std::map<Record*, NodeXForm, LessRecordByID>::const_iterator 759*9880d681SAndroid Build Coastguard Worker nx_iterator; nx_begin()760*9880d681SAndroid Build Coastguard Worker nx_iterator nx_begin() const { return SDNodeXForms.begin(); } nx_end()761*9880d681SAndroid Build Coastguard Worker nx_iterator nx_end() const { return SDNodeXForms.end(); } 762*9880d681SAndroid Build Coastguard Worker 763*9880d681SAndroid Build Coastguard Worker getComplexPattern(Record * R)764*9880d681SAndroid Build Coastguard Worker const ComplexPattern &getComplexPattern(Record *R) const { 765*9880d681SAndroid Build Coastguard Worker assert(ComplexPatterns.count(R) && "Unknown addressing mode!"); 766*9880d681SAndroid Build Coastguard Worker return ComplexPatterns.find(R)->second; 767*9880d681SAndroid Build Coastguard Worker } 768*9880d681SAndroid Build Coastguard Worker getIntrinsic(Record * R)769*9880d681SAndroid Build Coastguard Worker const CodeGenIntrinsic &getIntrinsic(Record *R) const { 770*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Intrinsics.size(); i != e; ++i) 771*9880d681SAndroid Build Coastguard Worker if (Intrinsics[i].TheDef == R) return Intrinsics[i]; 772*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = TgtIntrinsics.size(); i != e; ++i) 773*9880d681SAndroid Build Coastguard Worker if (TgtIntrinsics[i].TheDef == R) return TgtIntrinsics[i]; 774*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unknown intrinsic!"); 775*9880d681SAndroid Build Coastguard Worker } 776*9880d681SAndroid Build Coastguard Worker getIntrinsicInfo(unsigned IID)777*9880d681SAndroid Build Coastguard Worker const CodeGenIntrinsic &getIntrinsicInfo(unsigned IID) const { 778*9880d681SAndroid Build Coastguard Worker if (IID-1 < Intrinsics.size()) 779*9880d681SAndroid Build Coastguard Worker return Intrinsics[IID-1]; 780*9880d681SAndroid Build Coastguard Worker if (IID-Intrinsics.size()-1 < TgtIntrinsics.size()) 781*9880d681SAndroid Build Coastguard Worker return TgtIntrinsics[IID-Intrinsics.size()-1]; 782*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Bad intrinsic ID!"); 783*9880d681SAndroid Build Coastguard Worker } 784*9880d681SAndroid Build Coastguard Worker getIntrinsicID(Record * R)785*9880d681SAndroid Build Coastguard Worker unsigned getIntrinsicID(Record *R) const { 786*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = Intrinsics.size(); i != e; ++i) 787*9880d681SAndroid Build Coastguard Worker if (Intrinsics[i].TheDef == R) return i; 788*9880d681SAndroid Build Coastguard Worker for (unsigned i = 0, e = TgtIntrinsics.size(); i != e; ++i) 789*9880d681SAndroid Build Coastguard Worker if (TgtIntrinsics[i].TheDef == R) return i + Intrinsics.size(); 790*9880d681SAndroid Build Coastguard Worker llvm_unreachable("Unknown intrinsic!"); 791*9880d681SAndroid Build Coastguard Worker } 792*9880d681SAndroid Build Coastguard Worker getDefaultOperand(Record * R)793*9880d681SAndroid Build Coastguard Worker const DAGDefaultOperand &getDefaultOperand(Record *R) const { 794*9880d681SAndroid Build Coastguard Worker assert(DefaultOperands.count(R) &&"Isn't an analyzed default operand!"); 795*9880d681SAndroid Build Coastguard Worker return DefaultOperands.find(R)->second; 796*9880d681SAndroid Build Coastguard Worker } 797*9880d681SAndroid Build Coastguard Worker 798*9880d681SAndroid Build Coastguard Worker // Pattern Fragment information. getPatternFragment(Record * R)799*9880d681SAndroid Build Coastguard Worker TreePattern *getPatternFragment(Record *R) const { 800*9880d681SAndroid Build Coastguard Worker assert(PatternFragments.count(R) && "Invalid pattern fragment request!"); 801*9880d681SAndroid Build Coastguard Worker return PatternFragments.find(R)->second.get(); 802*9880d681SAndroid Build Coastguard Worker } getPatternFragmentIfRead(Record * R)803*9880d681SAndroid Build Coastguard Worker TreePattern *getPatternFragmentIfRead(Record *R) const { 804*9880d681SAndroid Build Coastguard Worker if (!PatternFragments.count(R)) 805*9880d681SAndroid Build Coastguard Worker return nullptr; 806*9880d681SAndroid Build Coastguard Worker return PatternFragments.find(R)->second.get(); 807*9880d681SAndroid Build Coastguard Worker } 808*9880d681SAndroid Build Coastguard Worker 809*9880d681SAndroid Build Coastguard Worker typedef std::map<Record *, std::unique_ptr<TreePattern>, 810*9880d681SAndroid Build Coastguard Worker LessRecordByID>::const_iterator pf_iterator; pf_begin()811*9880d681SAndroid Build Coastguard Worker pf_iterator pf_begin() const { return PatternFragments.begin(); } pf_end()812*9880d681SAndroid Build Coastguard Worker pf_iterator pf_end() const { return PatternFragments.end(); } 813*9880d681SAndroid Build Coastguard Worker 814*9880d681SAndroid Build Coastguard Worker // Patterns to match information. 815*9880d681SAndroid Build Coastguard Worker typedef std::vector<PatternToMatch>::const_iterator ptm_iterator; ptm_begin()816*9880d681SAndroid Build Coastguard Worker ptm_iterator ptm_begin() const { return PatternsToMatch.begin(); } ptm_end()817*9880d681SAndroid Build Coastguard Worker ptm_iterator ptm_end() const { return PatternsToMatch.end(); } 818*9880d681SAndroid Build Coastguard Worker 819*9880d681SAndroid Build Coastguard Worker /// Parse the Pattern for an instruction, and insert the result in DAGInsts. 820*9880d681SAndroid Build Coastguard Worker typedef std::map<Record*, DAGInstruction, LessRecordByID> DAGInstMap; 821*9880d681SAndroid Build Coastguard Worker const DAGInstruction &parseInstructionPattern( 822*9880d681SAndroid Build Coastguard Worker CodeGenInstruction &CGI, ListInit *Pattern, 823*9880d681SAndroid Build Coastguard Worker DAGInstMap &DAGInsts); 824*9880d681SAndroid Build Coastguard Worker getInstruction(Record * R)825*9880d681SAndroid Build Coastguard Worker const DAGInstruction &getInstruction(Record *R) const { 826*9880d681SAndroid Build Coastguard Worker assert(Instructions.count(R) && "Unknown instruction!"); 827*9880d681SAndroid Build Coastguard Worker return Instructions.find(R)->second; 828*9880d681SAndroid Build Coastguard Worker } 829*9880d681SAndroid Build Coastguard Worker get_intrinsic_void_sdnode()830*9880d681SAndroid Build Coastguard Worker Record *get_intrinsic_void_sdnode() const { 831*9880d681SAndroid Build Coastguard Worker return intrinsic_void_sdnode; 832*9880d681SAndroid Build Coastguard Worker } get_intrinsic_w_chain_sdnode()833*9880d681SAndroid Build Coastguard Worker Record *get_intrinsic_w_chain_sdnode() const { 834*9880d681SAndroid Build Coastguard Worker return intrinsic_w_chain_sdnode; 835*9880d681SAndroid Build Coastguard Worker } get_intrinsic_wo_chain_sdnode()836*9880d681SAndroid Build Coastguard Worker Record *get_intrinsic_wo_chain_sdnode() const { 837*9880d681SAndroid Build Coastguard Worker return intrinsic_wo_chain_sdnode; 838*9880d681SAndroid Build Coastguard Worker } 839*9880d681SAndroid Build Coastguard Worker hasTargetIntrinsics()840*9880d681SAndroid Build Coastguard Worker bool hasTargetIntrinsics() { return !TgtIntrinsics.empty(); } 841*9880d681SAndroid Build Coastguard Worker 842*9880d681SAndroid Build Coastguard Worker private: 843*9880d681SAndroid Build Coastguard Worker void ParseNodeInfo(); 844*9880d681SAndroid Build Coastguard Worker void ParseNodeTransforms(); 845*9880d681SAndroid Build Coastguard Worker void ParseComplexPatterns(); 846*9880d681SAndroid Build Coastguard Worker void ParsePatternFragments(bool OutFrags = false); 847*9880d681SAndroid Build Coastguard Worker void ParseDefaultOperands(); 848*9880d681SAndroid Build Coastguard Worker void ParseInstructions(); 849*9880d681SAndroid Build Coastguard Worker void ParsePatterns(); 850*9880d681SAndroid Build Coastguard Worker void InferInstructionFlags(); 851*9880d681SAndroid Build Coastguard Worker void GenerateVariants(); 852*9880d681SAndroid Build Coastguard Worker void VerifyInstructionFlags(); 853*9880d681SAndroid Build Coastguard Worker 854*9880d681SAndroid Build Coastguard Worker void AddPatternToMatch(TreePattern *Pattern, const PatternToMatch &PTM); 855*9880d681SAndroid Build Coastguard Worker void FindPatternInputsAndOutputs(TreePattern *I, TreePatternNode *Pat, 856*9880d681SAndroid Build Coastguard Worker std::map<std::string, 857*9880d681SAndroid Build Coastguard Worker TreePatternNode*> &InstInputs, 858*9880d681SAndroid Build Coastguard Worker std::map<std::string, 859*9880d681SAndroid Build Coastguard Worker TreePatternNode*> &InstResults, 860*9880d681SAndroid Build Coastguard Worker std::vector<Record*> &InstImpResults); 861*9880d681SAndroid Build Coastguard Worker }; 862*9880d681SAndroid Build Coastguard Worker } // end namespace llvm 863*9880d681SAndroid Build Coastguard Worker 864*9880d681SAndroid Build Coastguard Worker #endif 865