Details | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line | 
|---|---|---|---|
| 14 | pmbaty | 1 | //===-- llvm/MC/MCInstrDesc.h - Instruction Descriptors -*- C++ -*-===// | 
| 2 | // | ||
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| 4 | // See https://llvm.org/LICENSE.txt for license information. | ||
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| 6 | // | ||
| 7 | //===----------------------------------------------------------------------===// | ||
| 8 | // | ||
| 9 | // This file defines the MCOperandInfo and MCInstrDesc classes, which | ||
| 10 | // are used to describe target instructions and their operands. | ||
| 11 | // | ||
| 12 | //===----------------------------------------------------------------------===// | ||
| 13 | |||
| 14 | #ifndef LLVM_MC_MCINSTRDESC_H | ||
| 15 | #define LLVM_MC_MCINSTRDESC_H | ||
| 16 | |||
| 17 | #include "llvm/ADT/ArrayRef.h" | ||
| 18 | #include "llvm/ADT/iterator_range.h" | ||
| 19 | #include "llvm/MC/MCRegister.h" | ||
| 20 | |||
| 21 | namespace llvm { | ||
| 22 | class MCRegisterInfo; | ||
| 23 | |||
| 24 | class MCInst; | ||
| 25 | |||
| 26 | //===----------------------------------------------------------------------===// | ||
| 27 | // Machine Operand Flags and Description | ||
| 28 | //===----------------------------------------------------------------------===// | ||
| 29 | |||
| 30 | namespace MCOI { | ||
| 31 | /// Operand constraints. These are encoded in 16 bits with one of the | ||
| 32 | /// low-order 3 bits specifying that a constraint is present and the | ||
| 33 | /// corresponding high-order hex digit specifying the constraint value. | ||
| 34 | /// This allows for a maximum of 3 constraints. | ||
| 35 | enum OperandConstraint { | ||
| 36 | TIED_TO = 0, // Must be allocated the same register as specified value. | ||
| 37 |   EARLY_CLOBBER // If present, operand is an early clobber register. | ||
| 38 | }; | ||
| 39 | |||
| 40 | // Define a macro to produce each constraint value. | ||
| 41 | #define MCOI_TIED_TO(op) \ | ||
| 42 |   ((1 << MCOI::TIED_TO) | ((op) << (4 + MCOI::TIED_TO * 4))) | ||
| 43 | |||
| 44 | #define MCOI_EARLY_CLOBBER \ | ||
| 45 |   (1 << MCOI::EARLY_CLOBBER) | ||
| 46 | |||
| 47 | /// These are flags set on operands, but should be considered | ||
| 48 | /// private, all access should go through the MCOperandInfo accessors. | ||
| 49 | /// See the accessors for a description of what these are. | ||
| 50 | enum OperandFlags { | ||
| 51 | LookupPtrRegClass = 0, | ||
| 52 | Predicate, | ||
| 53 | OptionalDef, | ||
| 54 | BranchTarget | ||
| 55 | }; | ||
| 56 | |||
| 57 | /// Operands are tagged with one of the values of this enum. | ||
| 58 | enum OperandType { | ||
| 59 | OPERAND_UNKNOWN = 0, | ||
| 60 | OPERAND_IMMEDIATE = 1, | ||
| 61 | OPERAND_REGISTER = 2, | ||
| 62 | OPERAND_MEMORY = 3, | ||
| 63 | OPERAND_PCREL = 4, | ||
| 64 | |||
| 65 | OPERAND_FIRST_GENERIC = 6, | ||
| 66 | OPERAND_GENERIC_0 = 6, | ||
| 67 | OPERAND_GENERIC_1 = 7, | ||
| 68 | OPERAND_GENERIC_2 = 8, | ||
| 69 | OPERAND_GENERIC_3 = 9, | ||
| 70 | OPERAND_GENERIC_4 = 10, | ||
| 71 | OPERAND_GENERIC_5 = 11, | ||
| 72 | OPERAND_LAST_GENERIC = 11, | ||
| 73 | |||
| 74 | OPERAND_FIRST_GENERIC_IMM = 12, | ||
| 75 | OPERAND_GENERIC_IMM_0 = 12, | ||
| 76 | OPERAND_LAST_GENERIC_IMM = 12, | ||
| 77 | |||
| 78 | OPERAND_FIRST_TARGET = 13, | ||
| 79 | }; | ||
| 80 | |||
| 81 | } // namespace MCOI | ||
| 82 | |||
| 83 | /// This holds information about one operand of a machine instruction, | ||
| 84 | /// indicating the register class for register operands, etc. | ||
| 85 | class MCOperandInfo { | ||
| 86 | public: | ||
| 87 |   /// This specifies the register class enumeration of the operand | ||
| 88 |   /// if the operand is a register.  If isLookupPtrRegClass is set, then this is | ||
| 89 |   /// an index that is passed to TargetRegisterInfo::getPointerRegClass(x) to | ||
| 90 |   /// get a dynamic register class. | ||
| 91 | int16_t RegClass; | ||
| 92 | |||
| 93 |   /// These are flags from the MCOI::OperandFlags enum. | ||
| 94 | uint8_t Flags; | ||
| 95 | |||
| 96 |   /// Information about the type of the operand. | ||
| 97 | uint8_t OperandType; | ||
| 98 | |||
| 99 |   /// Operand constraints (see OperandConstraint enum). | ||
| 100 | uint16_t Constraints; | ||
| 101 | |||
| 102 |   /// Set if this operand is a pointer value and it requires a callback | ||
| 103 |   /// to look up its register class. | ||
| 104 | bool isLookupPtrRegClass() const { | ||
| 105 | return Flags & (1 << MCOI::LookupPtrRegClass); | ||
| 106 |   } | ||
| 107 | |||
| 108 |   /// Set if this is one of the operands that made up of the predicate | ||
| 109 |   /// operand that controls an isPredicable() instruction. | ||
| 110 | bool isPredicate() const { return Flags & (1 << MCOI::Predicate); } | ||
| 111 | |||
| 112 |   /// Set if this operand is a optional def. | ||
| 113 | bool isOptionalDef() const { return Flags & (1 << MCOI::OptionalDef); } | ||
| 114 | |||
| 115 |   /// Set if this operand is a branch target. | ||
| 116 | bool isBranchTarget() const { return Flags & (1 << MCOI::BranchTarget); } | ||
| 117 | |||
| 118 | bool isGenericType() const { | ||
| 119 | return OperandType >= MCOI::OPERAND_FIRST_GENERIC && | ||
| 120 | OperandType <= MCOI::OPERAND_LAST_GENERIC; | ||
| 121 |   } | ||
| 122 | |||
| 123 | unsigned getGenericTypeIndex() const { | ||
| 124 | assert(isGenericType() && "non-generic types don't have an index"); | ||
| 125 | return OperandType - MCOI::OPERAND_FIRST_GENERIC; | ||
| 126 |   } | ||
| 127 | |||
| 128 | bool isGenericImm() const { | ||
| 129 | return OperandType >= MCOI::OPERAND_FIRST_GENERIC_IMM && | ||
| 130 | OperandType <= MCOI::OPERAND_LAST_GENERIC_IMM; | ||
| 131 |   } | ||
| 132 | |||
| 133 | unsigned getGenericImmIndex() const { | ||
| 134 | assert(isGenericImm() && "non-generic immediates don't have an index"); | ||
| 135 | return OperandType - MCOI::OPERAND_FIRST_GENERIC_IMM; | ||
| 136 |   } | ||
| 137 | }; | ||
| 138 | |||
| 139 | //===----------------------------------------------------------------------===// | ||
| 140 | // Machine Instruction Flags and Description | ||
| 141 | //===----------------------------------------------------------------------===// | ||
| 142 | |||
| 143 | namespace MCID { | ||
| 144 | /// These should be considered private to the implementation of the | ||
| 145 | /// MCInstrDesc class.  Clients should use the predicate methods on MCInstrDesc, | ||
| 146 | /// not use these directly.  These all correspond to bitfields in the | ||
| 147 | /// MCInstrDesc::Flags field. | ||
| 148 | enum Flag { | ||
| 149 | PreISelOpcode = 0, | ||
| 150 | Variadic, | ||
| 151 | HasOptionalDef, | ||
| 152 | Pseudo, | ||
| 153 | Meta, | ||
| 154 | Return, | ||
| 155 | EHScopeReturn, | ||
| 156 | Call, | ||
| 157 | Barrier, | ||
| 158 | Terminator, | ||
| 159 | Branch, | ||
| 160 | IndirectBranch, | ||
| 161 | Compare, | ||
| 162 | MoveImm, | ||
| 163 | MoveReg, | ||
| 164 | Bitcast, | ||
| 165 | Select, | ||
| 166 | DelaySlot, | ||
| 167 | FoldableAsLoad, | ||
| 168 | MayLoad, | ||
| 169 | MayStore, | ||
| 170 | MayRaiseFPException, | ||
| 171 | Predicable, | ||
| 172 | NotDuplicable, | ||
| 173 | UnmodeledSideEffects, | ||
| 174 | Commutable, | ||
| 175 | ConvertibleTo3Addr, | ||
| 176 | UsesCustomInserter, | ||
| 177 | HasPostISelHook, | ||
| 178 | Rematerializable, | ||
| 179 | CheapAsAMove, | ||
| 180 | ExtraSrcRegAllocReq, | ||
| 181 | ExtraDefRegAllocReq, | ||
| 182 | RegSequence, | ||
| 183 | ExtractSubreg, | ||
| 184 | InsertSubreg, | ||
| 185 | Convergent, | ||
| 186 | Add, | ||
| 187 | Trap, | ||
| 188 | VariadicOpsAreDefs, | ||
| 189 | Authenticated, | ||
| 190 | }; | ||
| 191 | } // namespace MCID | ||
| 192 | |||
| 193 | /// Describe properties that are true of each instruction in the target | ||
| 194 | /// description file.  This captures information about side effects, register | ||
| 195 | /// use and many other things.  There is one instance of this struct for each | ||
| 196 | /// target instruction class, and the MachineInstr class points to this struct | ||
| 197 | /// directly to describe itself. | ||
| 198 | class MCInstrDesc { | ||
| 199 | public: | ||
| 200 |   // FIXME: Disable copies and moves. | ||
| 201 |   // Do not allow MCInstrDescs to be copied or moved. They should only exist in | ||
| 202 |   // the <Target>Insts table because they rely on knowing their own address to | ||
| 203 |   // find other information elsewhere in the same table. | ||
| 204 | |||
| 205 | unsigned short Opcode; // The opcode number | ||
| 206 | unsigned short NumOperands; // Num of args (may be more if variable_ops) | ||
| 207 | unsigned char NumDefs; // Num of args that are definitions | ||
| 208 | unsigned char Size; // Number of bytes in encoding. | ||
| 209 | unsigned short SchedClass; // enum identifying instr sched class | ||
| 210 | unsigned char NumImplicitUses; // Num of regs implicitly used | ||
| 211 | unsigned char NumImplicitDefs; // Num of regs implicitly defined | ||
| 212 | uint64_t Flags; // Flags identifying machine instr class | ||
| 213 | uint64_t TSFlags; // Target Specific Flag values | ||
| 214 | const MCPhysReg *ImplicitOps; // List of implicit uses followed by defs | ||
| 215 | const MCOperandInfo *OpInfo; // 'NumOperands' entries about operands | ||
| 216 | |||
| 217 |   /// Returns the value of the specified operand constraint if | ||
| 218 |   /// it is present. Returns -1 if it is not present. | ||
| 219 | int getOperandConstraint(unsigned OpNum, | ||
| 220 | MCOI::OperandConstraint Constraint) const { | ||
| 221 | if (OpNum < NumOperands && | ||
| 222 | (operands()[OpNum].Constraints & (1 << Constraint))) { | ||
| 223 | unsigned ValuePos = 4 + Constraint * 4; | ||
| 224 | return (int)(operands()[OpNum].Constraints >> ValuePos) & 0x0f; | ||
| 225 |     } | ||
| 226 | return -1; | ||
| 227 |   } | ||
| 228 | |||
| 229 |   /// Return the opcode number for this descriptor. | ||
| 230 | unsigned getOpcode() const { return Opcode; } | ||
| 231 | |||
| 232 |   /// Return the number of declared MachineOperands for this | ||
| 233 |   /// MachineInstruction.  Note that variadic (isVariadic() returns true) | ||
| 234 |   /// instructions may have additional operands at the end of the list, and note | ||
| 235 |   /// that the machine instruction may include implicit register def/uses as | ||
| 236 |   /// well. | ||
| 237 | unsigned getNumOperands() const { return NumOperands; } | ||
| 238 | |||
| 239 | using const_opInfo_iterator = const MCOperandInfo *; | ||
| 240 | |||
| 241 | const_opInfo_iterator opInfo_begin() const { return OpInfo; } | ||
| 242 | const_opInfo_iterator opInfo_end() const { return OpInfo + NumOperands; } | ||
| 243 | |||
| 244 | ArrayRef<MCOperandInfo> operands() const { | ||
| 245 | return ArrayRef(OpInfo, NumOperands); | ||
| 246 |   } | ||
| 247 | |||
| 248 |   /// Return the number of MachineOperands that are register | ||
| 249 |   /// definitions.  Register definitions always occur at the start of the | ||
| 250 |   /// machine operand list.  This is the number of "outs" in the .td file, | ||
| 251 |   /// and does not include implicit defs. | ||
| 252 | unsigned getNumDefs() const { return NumDefs; } | ||
| 253 | |||
| 254 |   /// Return flags of this instruction. | ||
| 255 | uint64_t getFlags() const { return Flags; } | ||
| 256 | |||
| 257 |   /// \returns true if this instruction is emitted before instruction selection | ||
| 258 |   /// and should be legalized/regbankselected/selected. | ||
| 259 | bool isPreISelOpcode() const { return Flags & (1ULL << MCID::PreISelOpcode); } | ||
| 260 | |||
| 261 |   /// Return true if this instruction can have a variable number of | ||
| 262 |   /// operands.  In this case, the variable operands will be after the normal | ||
| 263 |   /// operands but before the implicit definitions and uses (if any are | ||
| 264 |   /// present). | ||
| 265 | bool isVariadic() const { return Flags & (1ULL << MCID::Variadic); } | ||
| 266 | |||
| 267 |   /// Set if this instruction has an optional definition, e.g. | ||
| 268 |   /// ARM instructions which can set condition code if 's' bit is set. | ||
| 269 | bool hasOptionalDef() const { return Flags & (1ULL << MCID::HasOptionalDef); } | ||
| 270 | |||
| 271 |   /// Return true if this is a pseudo instruction that doesn't | ||
| 272 |   /// correspond to a real machine instruction. | ||
| 273 | bool isPseudo() const { return Flags & (1ULL << MCID::Pseudo); } | ||
| 274 | |||
| 275 |   /// Return true if this is a meta instruction that doesn't | ||
| 276 |   /// produce any output in the form of executable instructions. | ||
| 277 | bool isMetaInstruction() const { return Flags & (1ULL << MCID::Meta); } | ||
| 278 | |||
| 279 |   /// Return true if the instruction is a return. | ||
| 280 | bool isReturn() const { return Flags & (1ULL << MCID::Return); } | ||
| 281 | |||
| 282 |   /// Return true if the instruction is an add instruction. | ||
| 283 | bool isAdd() const { return Flags & (1ULL << MCID::Add); } | ||
| 284 | |||
| 285 |   /// Return true if this instruction is a trap. | ||
| 286 | bool isTrap() const { return Flags & (1ULL << MCID::Trap); } | ||
| 287 | |||
| 288 |   /// Return true if the instruction is a register to register move. | ||
| 289 | bool isMoveReg() const { return Flags & (1ULL << MCID::MoveReg); } | ||
| 290 | |||
| 291 |   ///  Return true if the instruction is a call. | ||
| 292 | bool isCall() const { return Flags & (1ULL << MCID::Call); } | ||
| 293 | |||
| 294 |   /// Returns true if the specified instruction stops control flow | ||
| 295 |   /// from executing the instruction immediately following it.  Examples include | ||
| 296 |   /// unconditional branches and return instructions. | ||
| 297 | bool isBarrier() const { return Flags & (1ULL << MCID::Barrier); } | ||
| 298 | |||
| 299 |   /// Returns true if this instruction part of the terminator for | ||
| 300 |   /// a basic block.  Typically this is things like return and branch | ||
| 301 |   /// instructions. | ||
| 302 |   /// | ||
| 303 |   /// Various passes use this to insert code into the bottom of a basic block, | ||
| 304 |   /// but before control flow occurs. | ||
| 305 | bool isTerminator() const { return Flags & (1ULL << MCID::Terminator); } | ||
| 306 | |||
| 307 |   /// Returns true if this is a conditional, unconditional, or | ||
| 308 |   /// indirect branch.  Predicates below can be used to discriminate between | ||
| 309 |   /// these cases, and the TargetInstrInfo::analyzeBranch method can be used to | ||
| 310 |   /// get more information. | ||
| 311 | bool isBranch() const { return Flags & (1ULL << MCID::Branch); } | ||
| 312 | |||
| 313 |   /// Return true if this is an indirect branch, such as a | ||
| 314 |   /// branch through a register. | ||
| 315 | bool isIndirectBranch() const { return Flags & (1ULL << MCID::IndirectBranch); } | ||
| 316 | |||
| 317 |   /// Return true if this is a branch which may fall | ||
| 318 |   /// through to the next instruction or may transfer control flow to some other | ||
| 319 |   /// block.  The TargetInstrInfo::analyzeBranch method can be used to get more | ||
| 320 |   /// information about this branch. | ||
| 321 | bool isConditionalBranch() const { | ||
| 322 | return isBranch() && !isBarrier() && !isIndirectBranch(); | ||
| 323 |   } | ||
| 324 | |||
| 325 |   /// Return true if this is a branch which always | ||
| 326 |   /// transfers control flow to some other block.  The | ||
| 327 |   /// TargetInstrInfo::analyzeBranch method can be used to get more information | ||
| 328 |   /// about this branch. | ||
| 329 | bool isUnconditionalBranch() const { | ||
| 330 | return isBranch() && isBarrier() && !isIndirectBranch(); | ||
| 331 |   } | ||
| 332 | |||
| 333 |   /// Return true if this is a branch or an instruction which directly | ||
| 334 |   /// writes to the program counter. Considered 'may' affect rather than | ||
| 335 |   /// 'does' affect as things like predication are not taken into account. | ||
| 336 | bool mayAffectControlFlow(const MCInst &MI, const MCRegisterInfo &RI) const; | ||
| 337 | |||
| 338 |   /// Return true if this instruction has a predicate operand | ||
| 339 |   /// that controls execution. It may be set to 'always', or may be set to other | ||
| 340 |   /// values. There are various methods in TargetInstrInfo that can be used to | ||
| 341 |   /// control and modify the predicate in this instruction. | ||
| 342 | bool isPredicable() const { return Flags & (1ULL << MCID::Predicable); } | ||
| 343 | |||
| 344 |   /// Return true if this instruction is a comparison. | ||
| 345 | bool isCompare() const { return Flags & (1ULL << MCID::Compare); } | ||
| 346 | |||
| 347 |   /// Return true if this instruction is a move immediate | ||
| 348 |   /// (including conditional moves) instruction. | ||
| 349 | bool isMoveImmediate() const { return Flags & (1ULL << MCID::MoveImm); } | ||
| 350 | |||
| 351 |   /// Return true if this instruction is a bitcast instruction. | ||
| 352 | bool isBitcast() const { return Flags & (1ULL << MCID::Bitcast); } | ||
| 353 | |||
| 354 |   /// Return true if this is a select instruction. | ||
| 355 | bool isSelect() const { return Flags & (1ULL << MCID::Select); } | ||
| 356 | |||
| 357 |   /// Return true if this instruction cannot be safely | ||
| 358 |   /// duplicated.  For example, if the instruction has a unique labels attached | ||
| 359 |   /// to it, duplicating it would cause multiple definition errors. | ||
| 360 | bool isNotDuplicable() const { return Flags & (1ULL << MCID::NotDuplicable); } | ||
| 361 | |||
| 362 |   /// Returns true if the specified instruction has a delay slot which | ||
| 363 |   /// must be filled by the code generator. | ||
| 364 | bool hasDelaySlot() const { return Flags & (1ULL << MCID::DelaySlot); } | ||
| 365 | |||
| 366 |   /// Return true for instructions that can be folded as memory operands | ||
| 367 |   /// in other instructions. The most common use for this is instructions that | ||
| 368 |   /// are simple loads from memory that don't modify the loaded value in any | ||
| 369 |   /// way, but it can also be used for instructions that can be expressed as | ||
| 370 |   /// constant-pool loads, such as V_SETALLONES on x86, to allow them to be | ||
| 371 |   /// folded when it is beneficial.  This should only be set on instructions | ||
| 372 |   /// that return a value in their only virtual register definition. | ||
| 373 | bool canFoldAsLoad() const { return Flags & (1ULL << MCID::FoldableAsLoad); } | ||
| 374 | |||
| 375 |   /// Return true if this instruction behaves | ||
| 376 |   /// the same way as the generic REG_SEQUENCE instructions. | ||
| 377 |   /// E.g., on ARM, | ||
| 378 |   /// dX VMOVDRR rY, rZ | ||
| 379 |   /// is equivalent to | ||
| 380 |   /// dX = REG_SEQUENCE rY, ssub_0, rZ, ssub_1. | ||
| 381 |   /// | ||
| 382 |   /// Note that for the optimizers to be able to take advantage of | ||
| 383 |   /// this property, TargetInstrInfo::getRegSequenceLikeInputs has to be | ||
| 384 |   /// override accordingly. | ||
| 385 | bool isRegSequenceLike() const { return Flags & (1ULL << MCID::RegSequence); } | ||
| 386 | |||
| 387 |   /// Return true if this instruction behaves | ||
| 388 |   /// the same way as the generic EXTRACT_SUBREG instructions. | ||
| 389 |   /// E.g., on ARM, | ||
| 390 |   /// rX, rY VMOVRRD dZ | ||
| 391 |   /// is equivalent to two EXTRACT_SUBREG: | ||
| 392 |   /// rX = EXTRACT_SUBREG dZ, ssub_0 | ||
| 393 |   /// rY = EXTRACT_SUBREG dZ, ssub_1 | ||
| 394 |   /// | ||
| 395 |   /// Note that for the optimizers to be able to take advantage of | ||
| 396 |   /// this property, TargetInstrInfo::getExtractSubregLikeInputs has to be | ||
| 397 |   /// override accordingly. | ||
| 398 | bool isExtractSubregLike() const { | ||
| 399 | return Flags & (1ULL << MCID::ExtractSubreg); | ||
| 400 |   } | ||
| 401 | |||
| 402 |   /// Return true if this instruction behaves | ||
| 403 |   /// the same way as the generic INSERT_SUBREG instructions. | ||
| 404 |   /// E.g., on ARM, | ||
| 405 |   /// dX = VSETLNi32 dY, rZ, Imm | ||
| 406 |   /// is equivalent to a INSERT_SUBREG: | ||
| 407 |   /// dX = INSERT_SUBREG dY, rZ, translateImmToSubIdx(Imm) | ||
| 408 |   /// | ||
| 409 |   /// Note that for the optimizers to be able to take advantage of | ||
| 410 |   /// this property, TargetInstrInfo::getInsertSubregLikeInputs has to be | ||
| 411 |   /// override accordingly. | ||
| 412 | bool isInsertSubregLike() const { return Flags & (1ULL << MCID::InsertSubreg); } | ||
| 413 | |||
| 414 | |||
| 415 |   /// Return true if this instruction is convergent. | ||
| 416 |   /// | ||
| 417 |   /// Convergent instructions may not be made control-dependent on any | ||
| 418 |   /// additional values. | ||
| 419 | bool isConvergent() const { return Flags & (1ULL << MCID::Convergent); } | ||
| 420 | |||
| 421 |   /// Return true if variadic operands of this instruction are definitions. | ||
| 422 | bool variadicOpsAreDefs() const { | ||
| 423 | return Flags & (1ULL << MCID::VariadicOpsAreDefs); | ||
| 424 |   } | ||
| 425 | |||
| 426 |   /// Return true if this instruction authenticates a pointer (e.g. LDRAx/BRAx | ||
| 427 |   /// from ARMv8.3, which perform loads/branches with authentication). | ||
| 428 |   /// | ||
| 429 |   /// An authenticated instruction may fail in an ABI-defined manner when | ||
| 430 |   /// operating on an invalid signed pointer. | ||
| 431 | bool isAuthenticated() const { | ||
| 432 | return Flags & (1ULL << MCID::Authenticated); | ||
| 433 |   } | ||
| 434 | |||
| 435 |   //===--------------------------------------------------------------------===// | ||
| 436 |   // Side Effect Analysis | ||
| 437 |   //===--------------------------------------------------------------------===// | ||
| 438 | |||
| 439 |   /// Return true if this instruction could possibly read memory. | ||
| 440 |   /// Instructions with this flag set are not necessarily simple load | ||
| 441 |   /// instructions, they may load a value and modify it, for example. | ||
| 442 | bool mayLoad() const { return Flags & (1ULL << MCID::MayLoad); } | ||
| 443 | |||
| 444 |   /// Return true if this instruction could possibly modify memory. | ||
| 445 |   /// Instructions with this flag set are not necessarily simple store | ||
| 446 |   /// instructions, they may store a modified value based on their operands, or | ||
| 447 |   /// may not actually modify anything, for example. | ||
| 448 | bool mayStore() const { return Flags & (1ULL << MCID::MayStore); } | ||
| 449 | |||
| 450 |   /// Return true if this instruction may raise a floating-point exception. | ||
| 451 | bool mayRaiseFPException() const { | ||
| 452 | return Flags & (1ULL << MCID::MayRaiseFPException); | ||
| 453 |   } | ||
| 454 | |||
| 455 |   /// Return true if this instruction has side | ||
| 456 |   /// effects that are not modeled by other flags.  This does not return true | ||
| 457 |   /// for instructions whose effects are captured by: | ||
| 458 |   /// | ||
| 459 |   ///  1. Their operand list and implicit definition/use list.  Register use/def | ||
| 460 |   ///     info is explicit for instructions. | ||
| 461 |   ///  2. Memory accesses.  Use mayLoad/mayStore. | ||
| 462 |   ///  3. Calling, branching, returning: use isCall/isReturn/isBranch. | ||
| 463 |   /// | ||
| 464 |   /// Examples of side effects would be modifying 'invisible' machine state like | ||
| 465 |   /// a control register, flushing a cache, modifying a register invisible to | ||
| 466 |   /// LLVM, etc. | ||
| 467 | bool hasUnmodeledSideEffects() const { | ||
| 468 | return Flags & (1ULL << MCID::UnmodeledSideEffects); | ||
| 469 |   } | ||
| 470 | |||
| 471 |   //===--------------------------------------------------------------------===// | ||
| 472 |   // Flags that indicate whether an instruction can be modified by a method. | ||
| 473 |   //===--------------------------------------------------------------------===// | ||
| 474 | |||
| 475 |   /// Return true if this may be a 2- or 3-address instruction (of the | ||
| 476 |   /// form "X = op Y, Z, ..."), which produces the same result if Y and Z are | ||
| 477 |   /// exchanged.  If this flag is set, then the | ||
| 478 |   /// TargetInstrInfo::commuteInstruction method may be used to hack on the | ||
| 479 |   /// instruction. | ||
| 480 |   /// | ||
| 481 |   /// Note that this flag may be set on instructions that are only commutable | ||
| 482 |   /// sometimes.  In these cases, the call to commuteInstruction will fail. | ||
| 483 |   /// Also note that some instructions require non-trivial modification to | ||
| 484 |   /// commute them. | ||
| 485 | bool isCommutable() const { return Flags & (1ULL << MCID::Commutable); } | ||
| 486 | |||
| 487 |   /// Return true if this is a 2-address instruction which can be changed | ||
| 488 |   /// into a 3-address instruction if needed.  Doing this transformation can be | ||
| 489 |   /// profitable in the register allocator, because it means that the | ||
| 490 |   /// instruction can use a 2-address form if possible, but degrade into a less | ||
| 491 |   /// efficient form if the source and dest register cannot be assigned to the | ||
| 492 |   /// same register.  For example, this allows the x86 backend to turn a "shl | ||
| 493 |   /// reg, 3" instruction into an LEA instruction, which is the same speed as | ||
| 494 |   /// the shift but has bigger code size. | ||
| 495 |   /// | ||
| 496 |   /// If this returns true, then the target must implement the | ||
| 497 |   /// TargetInstrInfo::convertToThreeAddress method for this instruction, which | ||
| 498 |   /// is allowed to fail if the transformation isn't valid for this specific | ||
| 499 |   /// instruction (e.g. shl reg, 4 on x86). | ||
| 500 |   /// | ||
| 501 | bool isConvertibleTo3Addr() const { | ||
| 502 | return Flags & (1ULL << MCID::ConvertibleTo3Addr); | ||
| 503 |   } | ||
| 504 | |||
| 505 |   /// Return true if this instruction requires custom insertion support | ||
| 506 |   /// when the DAG scheduler is inserting it into a machine basic block.  If | ||
| 507 |   /// this is true for the instruction, it basically means that it is a pseudo | ||
| 508 |   /// instruction used at SelectionDAG time that is expanded out into magic code | ||
| 509 |   /// by the target when MachineInstrs are formed. | ||
| 510 |   /// | ||
| 511 |   /// If this is true, the TargetLoweringInfo::InsertAtEndOfBasicBlock method | ||
| 512 |   /// is used to insert this into the MachineBasicBlock. | ||
| 513 | bool usesCustomInsertionHook() const { | ||
| 514 | return Flags & (1ULL << MCID::UsesCustomInserter); | ||
| 515 |   } | ||
| 516 | |||
| 517 |   /// Return true if this instruction requires *adjustment* after | ||
| 518 |   /// instruction selection by calling a target hook. For example, this can be | ||
| 519 |   /// used to fill in ARM 's' optional operand depending on whether the | ||
| 520 |   /// conditional flag register is used. | ||
| 521 | bool hasPostISelHook() const { return Flags & (1ULL << MCID::HasPostISelHook); } | ||
| 522 | |||
| 523 |   /// Returns true if this instruction is a candidate for remat. This | ||
| 524 |   /// flag is only used in TargetInstrInfo method isTriviallyRematerializable. | ||
| 525 |   /// | ||
| 526 |   /// If this flag is set, the isReallyTriviallyReMaterializable() | ||
| 527 |   /// or isReallyTriviallyReMaterializableGeneric methods are called to verify | ||
| 528 |   /// the instruction is really rematable. | ||
| 529 | bool isRematerializable() const { | ||
| 530 | return Flags & (1ULL << MCID::Rematerializable); | ||
| 531 |   } | ||
| 532 | |||
| 533 |   /// Returns true if this instruction has the same cost (or less) than a | ||
| 534 |   /// move instruction. This is useful during certain types of optimizations | ||
| 535 |   /// (e.g., remat during two-address conversion or machine licm) where we would | ||
| 536 |   /// like to remat or hoist the instruction, but not if it costs more than | ||
| 537 |   /// moving the instruction into the appropriate register. Note, we are not | ||
| 538 |   /// marking copies from and to the same register class with this flag. | ||
| 539 |   /// | ||
| 540 |   /// This method could be called by interface TargetInstrInfo::isAsCheapAsAMove | ||
| 541 |   /// for different subtargets. | ||
| 542 | bool isAsCheapAsAMove() const { return Flags & (1ULL << MCID::CheapAsAMove); } | ||
| 543 | |||
| 544 |   /// Returns true if this instruction source operands have special | ||
| 545 |   /// register allocation requirements that are not captured by the operand | ||
| 546 |   /// register classes. e.g. ARM::STRD's two source registers must be an even / | ||
| 547 |   /// odd pair, ARM::STM registers have to be in ascending order.  Post-register | ||
| 548 |   /// allocation passes should not attempt to change allocations for sources of | ||
| 549 |   /// instructions with this flag. | ||
| 550 | bool hasExtraSrcRegAllocReq() const { | ||
| 551 | return Flags & (1ULL << MCID::ExtraSrcRegAllocReq); | ||
| 552 |   } | ||
| 553 | |||
| 554 |   /// Returns true if this instruction def operands have special register | ||
| 555 |   /// allocation requirements that are not captured by the operand register | ||
| 556 |   /// classes. e.g. ARM::LDRD's two def registers must be an even / odd pair, | ||
| 557 |   /// ARM::LDM registers have to be in ascending order.  Post-register | ||
| 558 |   /// allocation passes should not attempt to change allocations for definitions | ||
| 559 |   /// of instructions with this flag. | ||
| 560 | bool hasExtraDefRegAllocReq() const { | ||
| 561 | return Flags & (1ULL << MCID::ExtraDefRegAllocReq); | ||
| 562 |   } | ||
| 563 | |||
| 564 |   /// Return a list of registers that are potentially read by any | ||
| 565 |   /// instance of this machine instruction.  For example, on X86, the "adc" | ||
| 566 |   /// instruction adds two register operands and adds the carry bit in from the | ||
| 567 |   /// flags register.  In this case, the instruction is marked as implicitly | ||
| 568 |   /// reading the flags.  Likewise, the variable shift instruction on X86 is | ||
| 569 |   /// marked as implicitly reading the 'CL' register, which it always does. | ||
| 570 | ArrayRef<MCPhysReg> implicit_uses() const { | ||
| 571 | return {ImplicitOps, NumImplicitUses}; | ||
| 572 |   } | ||
| 573 | |||
| 574 |   /// Return a list of registers that are potentially written by any | ||
| 575 |   /// instance of this machine instruction.  For example, on X86, many | ||
| 576 |   /// instructions implicitly set the flags register.  In this case, they are | ||
| 577 |   /// marked as setting the FLAGS.  Likewise, many instructions always deposit | ||
| 578 |   /// their result in a physical register.  For example, the X86 divide | ||
| 579 |   /// instruction always deposits the quotient and remainder in the EAX/EDX | ||
| 580 |   /// registers.  For that instruction, this will return a list containing the | ||
| 581 |   /// EAX/EDX/EFLAGS registers. | ||
| 582 | ArrayRef<MCPhysReg> implicit_defs() const { | ||
| 583 | return {ImplicitOps + NumImplicitUses, NumImplicitDefs}; | ||
| 584 |   } | ||
| 585 | |||
| 586 |   /// Return true if this instruction implicitly | ||
| 587 |   /// uses the specified physical register. | ||
| 588 | bool hasImplicitUseOfPhysReg(unsigned Reg) const { | ||
| 589 | return is_contained(implicit_uses(), Reg); | ||
| 590 |   } | ||
| 591 | |||
| 592 |   /// Return true if this instruction implicitly | ||
| 593 |   /// defines the specified physical register. | ||
| 594 | bool hasImplicitDefOfPhysReg(unsigned Reg, | ||
| 595 | const MCRegisterInfo *MRI = nullptr) const; | ||
| 596 | |||
| 597 |   /// Return the scheduling class for this instruction.  The | ||
| 598 |   /// scheduling class is an index into the InstrItineraryData table.  This | ||
| 599 |   /// returns zero if there is no known scheduling information for the | ||
| 600 |   /// instruction. | ||
| 601 | unsigned getSchedClass() const { return SchedClass; } | ||
| 602 | |||
| 603 |   /// Return the number of bytes in the encoding of this instruction, | ||
| 604 |   /// or zero if the encoding size cannot be known from the opcode. | ||
| 605 | unsigned getSize() const { return Size; } | ||
| 606 | |||
| 607 |   /// Find the index of the first operand in the | ||
| 608 |   /// operand list that is used to represent the predicate. It returns -1 if | ||
| 609 |   /// none is found. | ||
| 610 | int findFirstPredOperandIdx() const { | ||
| 611 | if (isPredicable()) { | ||
| 612 | for (unsigned i = 0, e = getNumOperands(); i != e; ++i) | ||
| 613 | if (operands()[i].isPredicate()) | ||
| 614 | return i; | ||
| 615 |     } | ||
| 616 | return -1; | ||
| 617 |   } | ||
| 618 | |||
| 619 |   /// Return true if this instruction defines the specified physical | ||
| 620 |   /// register, either explicitly or implicitly. | ||
| 621 | bool hasDefOfPhysReg(const MCInst &MI, unsigned Reg, | ||
| 622 | const MCRegisterInfo &RI) const; | ||
| 623 | }; | ||
| 624 | |||
| 625 | } // end namespace llvm | ||
| 626 | |||
| 627 | #endif |