| Chris Lattner | fce9603 | 2004-08-01 04:04:35 +0000 | [diff] [blame] | 1 | //===- CodeGenTarget.h - Target Class Wrapper -------------------*- C++ -*-===// | 
| Misha Brukman | 650ba8e | 2005-04-22 00:00:37 +0000 | [diff] [blame] | 2 | // | 
| John Criswell | d303203 | 2003-10-20 20:20:30 +0000 | [diff] [blame] | 3 | //                     The LLVM Compiler Infrastructure | 
|  | 4 | // | 
| Chris Lattner | 8adcd9f | 2007-12-29 20:37:13 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
|  | 6 | // License. See LICENSE.TXT for details. | 
| Misha Brukman | 650ba8e | 2005-04-22 00:00:37 +0000 | [diff] [blame] | 7 | // | 
| John Criswell | d303203 | 2003-10-20 20:20:30 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 9 | // | 
| Chris Lattner | fce9603 | 2004-08-01 04:04:35 +0000 | [diff] [blame] | 10 | // This file defines wrappers for the Target class and related global | 
|  | 11 | // functionality.  This makes it easier to access the data and provides a single | 
| Joerg Sonnenberger | 635debe | 2012-10-25 20:33:17 +0000 | [diff] [blame] | 12 | // place that needs to check it for validity.  All of these classes abort | 
|  | 13 | // on error conditions. | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 14 | // | 
|  | 15 | //===----------------------------------------------------------------------===// | 
|  | 16 |  | 
| Benjamin Kramer | a7c40ef | 2014-08-13 16:26:38 +0000 | [diff] [blame] | 17 | #ifndef LLVM_UTILS_TABLEGEN_CODEGENTARGET_H | 
|  | 18 | #define LLVM_UTILS_TABLEGEN_CODEGENTARGET_H | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 19 |  | 
| Chris Lattner | c860eca | 2004-08-01 05:04:00 +0000 | [diff] [blame] | 20 | #include "CodeGenInstruction.h" | 
| Chandler Carruth | 91d19d8 | 2012-12-04 10:37:14 +0000 | [diff] [blame] | 21 | #include "CodeGenRegisters.h" | 
| Chris Lattner | 1802b17 | 2010-03-19 01:07:44 +0000 | [diff] [blame] | 22 | #include "llvm/Support/raw_ostream.h" | 
| Chandler Carruth | 91d19d8 | 2012-12-04 10:37:14 +0000 | [diff] [blame] | 23 | #include "llvm/TableGen/Record.h" | 
| Dan Gohman | e14b8d9 | 2009-04-13 15:24:11 +0000 | [diff] [blame] | 24 | #include <algorithm> | 
| Brian Gaeke | 960707c | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 25 |  | 
|  | 26 | namespace llvm { | 
|  | 27 |  | 
| Chris Lattner | 7dfc2d2 | 2004-10-27 16:14:51 +0000 | [diff] [blame] | 28 | struct CodeGenRegister; | 
| Andrew Trick | 87255e3 | 2012-07-07 04:00:00 +0000 | [diff] [blame] | 29 | class CodeGenSchedModels; | 
| Chris Lattner | c92f688 | 2006-03-27 22:48:18 +0000 | [diff] [blame] | 30 | class CodeGenTarget; | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 31 |  | 
| Evan Cheng | 2022c79 | 2006-10-11 21:02:01 +0000 | [diff] [blame] | 32 | // SelectionDAG node properties. | 
| Mon P Wang | 6a49037 | 2008-06-25 08:15:39 +0000 | [diff] [blame] | 33 | //  SDNPMemOperand: indicates that a node touches memory and therefore must | 
|  | 34 | //                  have an associated memory operand that describes the access. | 
| Chris Lattner | a348f55 | 2008-01-06 06:44:58 +0000 | [diff] [blame] | 35 | enum SDNP { | 
| Jim Grosbach | f910bf2 | 2011-03-11 01:27:24 +0000 | [diff] [blame] | 36 | SDNPCommutative, | 
|  | 37 | SDNPAssociative, | 
| Chris Lattner | a348f55 | 2008-01-06 06:44:58 +0000 | [diff] [blame] | 38 | SDNPHasChain, | 
| Chris Lattner | 2a0a3b4 | 2010-12-23 18:28:41 +0000 | [diff] [blame] | 39 | SDNPOutGlue, | 
|  | 40 | SDNPInGlue, | 
|  | 41 | SDNPOptInGlue, | 
| Chris Lattner | 1ca2068 | 2008-01-10 04:38:57 +0000 | [diff] [blame] | 42 | SDNPMayLoad, | 
| Chris Lattner | 42c63ef | 2008-01-10 05:39:30 +0000 | [diff] [blame] | 43 | SDNPMayStore, | 
| Mon P Wang | 6a49037 | 2008-06-25 08:15:39 +0000 | [diff] [blame] | 44 | SDNPSideEffect, | 
| Chris Lattner | 83aeaab | 2010-03-19 05:07:09 +0000 | [diff] [blame] | 45 | SDNPMemOperand, | 
| Chris Lattner | 0e023ea | 2010-09-21 20:31:19 +0000 | [diff] [blame] | 46 | SDNPVariadic, | 
|  | 47 | SDNPWantRoot, | 
|  | 48 | SDNPWantParent | 
| Chris Lattner | a348f55 | 2008-01-06 06:44:58 +0000 | [diff] [blame] | 49 | }; | 
| Evan Cheng | 2022c79 | 2006-10-11 21:02:01 +0000 | [diff] [blame] | 50 |  | 
| Owen Anderson | 9f94459 | 2009-08-11 20:47:22 +0000 | [diff] [blame] | 51 | /// getValueType - Return the MVT::SimpleValueType that the specified TableGen | 
| Duncan Sands | 13237ac | 2008-06-06 12:08:01 +0000 | [diff] [blame] | 52 | /// record corresponds to. | 
| Owen Anderson | 9f94459 | 2009-08-11 20:47:22 +0000 | [diff] [blame] | 53 | MVT::SimpleValueType getValueType(Record *Rec); | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 54 |  | 
| Matt Arsenault | 4fb996e | 2016-05-25 18:07:40 +0000 | [diff] [blame] | 55 | StringRef getName(MVT::SimpleValueType T); | 
|  | 56 | StringRef getEnumName(MVT::SimpleValueType T); | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 57 |  | 
| Chris Lattner | 8cab021 | 2008-01-05 22:25:12 +0000 | [diff] [blame] | 58 | /// getQualifiedName - Return the name of the specified record, with a | 
|  | 59 | /// namespace qualifier if the record contains one. | 
|  | 60 | std::string getQualifiedName(const Record *R); | 
| Jim Grosbach | f910bf2 | 2011-03-11 01:27:24 +0000 | [diff] [blame] | 61 |  | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 62 | /// CodeGenTarget - This class corresponds to the Target class in the .td files. | 
|  | 63 | /// | 
|  | 64 | class CodeGenTarget { | 
| Chris Lattner | 77d369c | 2010-12-13 00:23:57 +0000 | [diff] [blame] | 65 | RecordKeeper &Records; | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 66 | Record *TargetRec; | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 67 |  | 
| Craig Topper | 48a8e64 | 2014-12-10 06:18:57 +0000 | [diff] [blame] | 68 | mutable DenseMap<const Record*, | 
|  | 69 | std::unique_ptr<CodeGenInstruction>> Instructions; | 
| Craig Topper | 313a96f | 2014-11-28 20:30:37 +0000 | [diff] [blame] | 70 | mutable std::unique_ptr<CodeGenRegBank> RegBank; | 
| Owen Anderson | a84be6c | 2011-06-27 21:06:21 +0000 | [diff] [blame] | 71 | mutable std::vector<Record*> RegAltNameIndices; | 
| Jakob Stoklund Olesen | 13d4a07 | 2013-03-17 17:26:09 +0000 | [diff] [blame] | 72 | mutable SmallVector<MVT::SimpleValueType, 8> LegalValueTypes; | 
| Owen Anderson | a84be6c | 2011-06-27 21:06:21 +0000 | [diff] [blame] | 73 | void ReadRegAltNameIndices() const; | 
| Chris Lattner | 2a86fab | 2004-08-21 04:05:00 +0000 | [diff] [blame] | 74 | void ReadInstructions() const; | 
| Chris Lattner | cee994b | 2005-09-08 21:43:21 +0000 | [diff] [blame] | 75 | void ReadLegalValueTypes() const; | 
| Jim Grosbach | f910bf2 | 2011-03-11 01:27:24 +0000 | [diff] [blame] | 76 |  | 
| Craig Topper | 313a96f | 2014-11-28 20:30:37 +0000 | [diff] [blame] | 77 | mutable std::unique_ptr<CodeGenSchedModels> SchedModels; | 
| Andrew Trick | 87255e3 | 2012-07-07 04:00:00 +0000 | [diff] [blame] | 78 |  | 
| Chris Lattner | 4763dbe | 2010-03-19 01:00:55 +0000 | [diff] [blame] | 79 | mutable std::vector<const CodeGenInstruction*> InstrsByEnum; | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 80 | public: | 
| Chris Lattner | 77d369c | 2010-12-13 00:23:57 +0000 | [diff] [blame] | 81 | CodeGenTarget(RecordKeeper &Records); | 
| Andrew Trick | 87255e3 | 2012-07-07 04:00:00 +0000 | [diff] [blame] | 82 | ~CodeGenTarget(); | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 83 |  | 
|  | 84 | Record *getTargetRecord() const { return TargetRec; } | 
| Matthias Braun | 4a86d45 | 2016-12-04 05:48:16 +0000 | [diff] [blame] | 85 | const StringRef getName() const; | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 86 |  | 
| Dan Gohman | 3e2225d | 2008-08-20 21:45:57 +0000 | [diff] [blame] | 87 | /// getInstNamespace - Return the target-specific instruction namespace. | 
|  | 88 | /// | 
|  | 89 | std::string getInstNamespace() const; | 
|  | 90 |  | 
| Chris Lattner | 6ffa501 | 2004-08-14 22:50:53 +0000 | [diff] [blame] | 91 | /// getInstructionSet - Return the InstructionSet object. | 
| Chris Lattner | c860eca | 2004-08-01 05:04:00 +0000 | [diff] [blame] | 92 | /// | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 93 | Record *getInstructionSet() const; | 
|  | 94 |  | 
| Daniel Dunbar | 0033199 | 2009-07-29 00:02:19 +0000 | [diff] [blame] | 95 | /// getAsmParser - Return the AssemblyParser definition for this target. | 
|  | 96 | /// | 
|  | 97 | Record *getAsmParser() const; | 
|  | 98 |  | 
| Devang Patel | 85d684a | 2012-01-09 19:13:28 +0000 | [diff] [blame] | 99 | /// getAsmParserVariant - Return the AssmblyParserVariant definition for | 
|  | 100 | /// this target. | 
|  | 101 | /// | 
|  | 102 | Record *getAsmParserVariant(unsigned i) const; | 
|  | 103 |  | 
| Andrew Trick | 87255e3 | 2012-07-07 04:00:00 +0000 | [diff] [blame] | 104 | /// getAsmParserVariantCount - Return the AssmblyParserVariant definition | 
| Devang Patel | 85d684a | 2012-01-09 19:13:28 +0000 | [diff] [blame] | 105 | /// available for this target. | 
|  | 106 | /// | 
|  | 107 | unsigned getAsmParserVariantCount() const; | 
|  | 108 |  | 
| Chris Lattner | 6ffa501 | 2004-08-14 22:50:53 +0000 | [diff] [blame] | 109 | /// getAsmWriter - Return the AssemblyWriter definition for this target. | 
|  | 110 | /// | 
|  | 111 | Record *getAsmWriter() const; | 
|  | 112 |  | 
| Jakob Stoklund Olesen | 76a5a71 | 2011-06-10 18:40:00 +0000 | [diff] [blame] | 113 | /// getRegBank - Return the register bank description. | 
|  | 114 | CodeGenRegBank &getRegBank() const; | 
|  | 115 |  | 
| Chris Lattner | 77d3ead | 2010-11-02 18:10:06 +0000 | [diff] [blame] | 116 | /// getRegisterByName - If there is a register with the specific AsmName, | 
|  | 117 | /// return it. | 
|  | 118 | const CodeGenRegister *getRegisterByName(StringRef Name) const; | 
| Chris Lattner | c860eca | 2004-08-01 05:04:00 +0000 | [diff] [blame] | 119 |  | 
| Owen Anderson | a84be6c | 2011-06-27 21:06:21 +0000 | [diff] [blame] | 120 | const std::vector<Record*> &getRegAltNameIndices() const { | 
|  | 121 | if (RegAltNameIndices.empty()) ReadRegAltNameIndices(); | 
|  | 122 | return RegAltNameIndices; | 
|  | 123 | } | 
|  | 124 |  | 
| Nate Begeman | cdf2c67 | 2005-12-01 00:06:14 +0000 | [diff] [blame] | 125 | const CodeGenRegisterClass &getRegisterClass(Record *R) const { | 
| Jakob Stoklund Olesen | 22ea424 | 2011-06-15 00:20:40 +0000 | [diff] [blame] | 126 | return *getRegBank().getRegClass(R); | 
| Chris Lattner | 3717b4c | 2005-12-05 02:35:08 +0000 | [diff] [blame] | 127 | } | 
| Evan Cheng | d985d66 | 2006-05-16 07:05:30 +0000 | [diff] [blame] | 128 |  | 
| Duncan Sands | 13237ac | 2008-06-06 12:08:01 +0000 | [diff] [blame] | 129 | /// getRegisterVTs - Find the union of all possible SimpleValueTypes for the | 
| Evan Cheng | d985d66 | 2006-05-16 07:05:30 +0000 | [diff] [blame] | 130 | /// specified physical register. | 
| Chris Lattner | cabe037 | 2010-03-15 06:00:16 +0000 | [diff] [blame] | 131 | std::vector<MVT::SimpleValueType> getRegisterVTs(Record *R) const; | 
| Jim Grosbach | f910bf2 | 2011-03-11 01:27:24 +0000 | [diff] [blame] | 132 |  | 
| Jakob Stoklund Olesen | 13d4a07 | 2013-03-17 17:26:09 +0000 | [diff] [blame] | 133 | ArrayRef<MVT::SimpleValueType> getLegalValueTypes() const { | 
| Chris Lattner | cee994b | 2005-09-08 21:43:21 +0000 | [diff] [blame] | 134 | if (LegalValueTypes.empty()) ReadLegalValueTypes(); | 
|  | 135 | return LegalValueTypes; | 
|  | 136 | } | 
| Jim Grosbach | f910bf2 | 2011-03-11 01:27:24 +0000 | [diff] [blame] | 137 |  | 
| Chris Lattner | cee994b | 2005-09-08 21:43:21 +0000 | [diff] [blame] | 138 | /// isLegalValueType - Return true if the specified value type is natively | 
|  | 139 | /// supported by the target (i.e. there are registers that directly hold it). | 
| Owen Anderson | 9f94459 | 2009-08-11 20:47:22 +0000 | [diff] [blame] | 140 | bool isLegalValueType(MVT::SimpleValueType VT) const { | 
| Jakob Stoklund Olesen | 13d4a07 | 2013-03-17 17:26:09 +0000 | [diff] [blame] | 141 | ArrayRef<MVT::SimpleValueType> LegalVTs = getLegalValueTypes(); | 
| David Majnemer | 0d955d0 | 2016-08-11 22:21:41 +0000 | [diff] [blame] | 142 | return is_contained(LegalVTs, VT); | 
| Chris Lattner | cee994b | 2005-09-08 21:43:21 +0000 | [diff] [blame] | 143 | } | 
| Chris Lattner | 2a86fab | 2004-08-21 04:05:00 +0000 | [diff] [blame] | 144 |  | 
| Andrew Trick | 87255e3 | 2012-07-07 04:00:00 +0000 | [diff] [blame] | 145 | CodeGenSchedModels &getSchedModels() const; | 
|  | 146 |  | 
| Chris Lattner | 70eb897 | 2010-03-19 00:18:23 +0000 | [diff] [blame] | 147 | private: | 
| Craig Topper | 48a8e64 | 2014-12-10 06:18:57 +0000 | [diff] [blame] | 148 | DenseMap<const Record*, std::unique_ptr<CodeGenInstruction>> & | 
|  | 149 | getInstructions() const { | 
| Chris Lattner | c860eca | 2004-08-01 05:04:00 +0000 | [diff] [blame] | 150 | if (Instructions.empty()) ReadInstructions(); | 
|  | 151 | return Instructions; | 
|  | 152 | } | 
| Chris Lattner | 9aec14b | 2010-03-19 00:07:20 +0000 | [diff] [blame] | 153 | public: | 
| Jim Grosbach | f910bf2 | 2011-03-11 01:27:24 +0000 | [diff] [blame] | 154 |  | 
| Chris Lattner | 1802b17 | 2010-03-19 01:07:44 +0000 | [diff] [blame] | 155 | CodeGenInstruction &getInstruction(const Record *InstRec) const { | 
|  | 156 | if (Instructions.empty()) ReadInstructions(); | 
| Craig Topper | 48a8e64 | 2014-12-10 06:18:57 +0000 | [diff] [blame] | 157 | auto I = Instructions.find(InstRec); | 
| Chris Lattner | 1802b17 | 2010-03-19 01:07:44 +0000 | [diff] [blame] | 158 | assert(I != Instructions.end() && "Not an instruction"); | 
|  | 159 | return *I->second; | 
|  | 160 | } | 
| Chris Lattner | fcffc98 | 2005-09-14 18:02:53 +0000 | [diff] [blame] | 161 |  | 
| Chris Lattner | 945e865 | 2005-01-22 18:58:51 +0000 | [diff] [blame] | 162 | /// getInstructionsByEnumValue - Return all of the instructions defined by the | 
|  | 163 | /// target, ordered by their enum value. | 
| Craig Topper | f926532 | 2016-01-17 20:38:14 +0000 | [diff] [blame] | 164 | ArrayRef<const CodeGenInstruction *> | 
| Chris Lattner | 4763dbe | 2010-03-19 01:00:55 +0000 | [diff] [blame] | 165 | getInstructionsByEnumValue() const { | 
| Chris Lattner | 918be52 | 2010-03-19 00:34:35 +0000 | [diff] [blame] | 166 | if (InstrsByEnum.empty()) ComputeInstrsByEnum(); | 
|  | 167 | return InstrsByEnum; | 
|  | 168 | } | 
| Chris Lattner | 945e865 | 2005-01-22 18:58:51 +0000 | [diff] [blame] | 169 |  | 
| Craig Topper | f926532 | 2016-01-17 20:38:14 +0000 | [diff] [blame] | 170 | typedef ArrayRef<const CodeGenInstruction *>::const_iterator inst_iterator; | 
| Chris Lattner | 4763dbe | 2010-03-19 01:00:55 +0000 | [diff] [blame] | 171 | inst_iterator inst_begin() const{return getInstructionsByEnumValue().begin();} | 
|  | 172 | inst_iterator inst_end() const { return getInstructionsByEnumValue().end(); } | 
| Jim Grosbach | f910bf2 | 2011-03-11 01:27:24 +0000 | [diff] [blame] | 173 |  | 
|  | 174 |  | 
| Misha Brukman | 243ded5 | 2004-10-14 05:50:43 +0000 | [diff] [blame] | 175 | /// isLittleEndianEncoding - are instruction bit patterns defined as  [0..n]? | 
|  | 176 | /// | 
|  | 177 | bool isLittleEndianEncoding() const; | 
| Jim Grosbach | f910bf2 | 2011-03-11 01:27:24 +0000 | [diff] [blame] | 178 |  | 
| Hal Finkel | 81e6fcc | 2013-12-17 22:37:50 +0000 | [diff] [blame] | 179 | /// reverseBitsForLittleEndianEncoding - For little-endian instruction bit | 
|  | 180 | /// encodings, reverse the bit order of all instructions. | 
|  | 181 | void reverseBitsForLittleEndianEncoding(); | 
|  | 182 |  | 
| Jakob Stoklund Olesen | 9dc03bb | 2012-08-23 19:34:41 +0000 | [diff] [blame] | 183 | /// guessInstructionProperties - should we just guess unset instruction | 
|  | 184 | /// properties? | 
|  | 185 | bool guessInstructionProperties() const; | 
|  | 186 |  | 
| Chris Lattner | 918be52 | 2010-03-19 00:34:35 +0000 | [diff] [blame] | 187 | private: | 
| Chris Lattner | 4763dbe | 2010-03-19 01:00:55 +0000 | [diff] [blame] | 188 | void ComputeInstrsByEnum() const; | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 189 | }; | 
|  | 190 |  | 
| Evan Cheng | 9b9567b | 2005-12-08 02:00:36 +0000 | [diff] [blame] | 191 | /// ComplexPattern - ComplexPattern info, corresponding to the ComplexPattern | 
|  | 192 | /// tablegen class in TargetSelectionDAG.td | 
|  | 193 | class ComplexPattern { | 
| Owen Anderson | 9f94459 | 2009-08-11 20:47:22 +0000 | [diff] [blame] | 194 | MVT::SimpleValueType Ty; | 
| Evan Cheng | 9b9567b | 2005-12-08 02:00:36 +0000 | [diff] [blame] | 195 | unsigned NumOperands; | 
|  | 196 | std::string SelectFunc; | 
| Evan Cheng | c9a6200 | 2005-12-08 02:14:08 +0000 | [diff] [blame] | 197 | std::vector<Record*> RootNodes; | 
| Christopher Lamb | 0592cf7 | 2008-01-31 07:27:46 +0000 | [diff] [blame] | 198 | unsigned Properties; // Node properties | 
| Peter Collingbourne | 32ab3a8 | 2016-11-09 23:53:43 +0000 | [diff] [blame] | 199 | unsigned Complexity; | 
| Evan Cheng | 9b9567b | 2005-12-08 02:00:36 +0000 | [diff] [blame] | 200 | public: | 
| Evan Cheng | 9b9567b | 2005-12-08 02:00:36 +0000 | [diff] [blame] | 201 | ComplexPattern(Record *R); | 
|  | 202 |  | 
| Owen Anderson | 9f94459 | 2009-08-11 20:47:22 +0000 | [diff] [blame] | 203 | MVT::SimpleValueType getValueType() const { return Ty; } | 
| Evan Cheng | 9b9567b | 2005-12-08 02:00:36 +0000 | [diff] [blame] | 204 | unsigned getNumOperands() const { return NumOperands; } | 
|  | 205 | const std::string &getSelectFunc() const { return SelectFunc; } | 
| Evan Cheng | c9a6200 | 2005-12-08 02:14:08 +0000 | [diff] [blame] | 206 | const std::vector<Record*> &getRootNodes() const { | 
|  | 207 | return RootNodes; | 
| Evan Cheng | 9b9567b | 2005-12-08 02:00:36 +0000 | [diff] [blame] | 208 | } | 
| Evan Cheng | 2022c79 | 2006-10-11 21:02:01 +0000 | [diff] [blame] | 209 | bool hasProperty(enum SDNP Prop) const { return Properties & (1 << Prop); } | 
| Peter Collingbourne | 32ab3a8 | 2016-11-09 23:53:43 +0000 | [diff] [blame] | 210 | unsigned getComplexity() const { return Complexity; } | 
| Evan Cheng | 9b9567b | 2005-12-08 02:00:36 +0000 | [diff] [blame] | 211 | }; | 
|  | 212 |  | 
| Brian Gaeke | 960707c | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 213 | } // End llvm namespace | 
|  | 214 |  | 
| Chris Lattner | f5bd1b7 | 2003-10-05 19:27:59 +0000 | [diff] [blame] | 215 | #endif |