1 //===-- llvm/CodeGen/MachineInstr.h - MachineInstr class --------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file contains the declaration of the MachineInstr class, which is the 11 // basic representation for all target dependent machine instructions used by 12 // the back end. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #ifndef LLVM_CODEGEN_MACHINEINSTR_H 17 #define LLVM_CODEGEN_MACHINEINSTR_H 18 19 #include "llvm/CodeGen/MachineOperand.h" 20 #include "llvm/MC/MCInstrDesc.h" 21 #include "llvm/Target/TargetOpcodes.h" 22 #include "llvm/ADT/ArrayRef.h" 23 #include "llvm/ADT/ilist.h" 24 #include "llvm/ADT/ilist_node.h" 25 #include "llvm/ADT/STLExtras.h" 26 #include "llvm/ADT/StringRef.h" 27 #include "llvm/ADT/DenseMapInfo.h" 28 #include "llvm/InlineAsm.h" 29 #include "llvm/Support/DebugLoc.h" 30 #include <vector> 31 32 namespace llvm { 33 34 template <typename T> class SmallVectorImpl; 35 class AliasAnalysis; 36 class TargetInstrInfo; 37 class TargetRegisterClass; 38 class TargetRegisterInfo; 39 class MachineFunction; 40 class MachineMemOperand; 41 42 //===----------------------------------------------------------------------===// 43 /// MachineInstr - Representation of each machine instruction. 44 /// 45 class MachineInstr : public ilist_node<MachineInstr> { 46 public: 47 typedef MachineMemOperand **mmo_iterator; 48 49 /// Flags to specify different kinds of comments to output in 50 /// assembly code. These flags carry semantic information not 51 /// otherwise easily derivable from the IR text. 52 /// 53 enum CommentFlag { 54 ReloadReuse = 0x1 55 }; 56 57 enum MIFlag { 58 NoFlags = 0, 59 FrameSetup = 1 << 0, // Instruction is used as a part of 60 // function frame setup code. 61 InsideBundle = 1 << 1 // Instruction is inside a bundle (not 62 // the first MI in a bundle) 63 }; 64 private: 65 const MCInstrDesc *MCID; // Instruction descriptor. 66 67 uint8_t Flags; // Various bits of additional 68 // information about machine 69 // instruction. 70 71 uint8_t AsmPrinterFlags; // Various bits of information used by 72 // the AsmPrinter to emit helpful 73 // comments. This is *not* semantic 74 // information. Do not use this for 75 // anything other than to convey comment 76 // information to AsmPrinter. 77 78 uint16_t NumMemRefs; // information on memory references 79 mmo_iterator MemRefs; 80 81 std::vector<MachineOperand> Operands; // the operands 82 MachineBasicBlock *Parent; // Pointer to the owning basic block. 83 DebugLoc debugLoc; // Source line information. 84 85 MachineInstr(const MachineInstr&) LLVM_DELETED_FUNCTION; 86 void operator=(const MachineInstr&) LLVM_DELETED_FUNCTION; 87 88 // Intrusive list support 89 friend struct ilist_traits<MachineInstr>; 90 friend struct ilist_traits<MachineBasicBlock>; 91 void setParent(MachineBasicBlock *P) { Parent = P; } 92 93 /// MachineInstr ctor - This constructor creates a copy of the given 94 /// MachineInstr in the given MachineFunction. 95 MachineInstr(MachineFunction &, const MachineInstr &); 96 97 /// MachineInstr ctor - This constructor creates a dummy MachineInstr with 98 /// MCID NULL and no operands. 99 MachineInstr(); 100 101 /// MachineInstr ctor - This constructor create a MachineInstr and add the 102 /// implicit operands. It reserves space for number of operands specified by 103 /// MCInstrDesc. An explicit DebugLoc is supplied. 104 MachineInstr(const MCInstrDesc &MCID, const DebugLoc dl, bool NoImp = false); 105 106 /// MachineInstr ctor - Work exactly the same as the ctor above, except that 107 /// the MachineInstr is created and added to the end of the specified basic 108 /// block. 109 MachineInstr(MachineBasicBlock *MBB, const DebugLoc dl, 110 const MCInstrDesc &MCID); 111 112 ~MachineInstr(); 113 114 // MachineInstrs are pool-allocated and owned by MachineFunction. 115 friend class MachineFunction; 116 117 public: 118 const MachineBasicBlock* getParent() const { return Parent; } 119 MachineBasicBlock* getParent() { return Parent; } 120 121 /// getAsmPrinterFlags - Return the asm printer flags bitvector. 122 /// 123 uint8_t getAsmPrinterFlags() const { return AsmPrinterFlags; } 124 125 /// clearAsmPrinterFlags - clear the AsmPrinter bitvector 126 /// 127 void clearAsmPrinterFlags() { AsmPrinterFlags = 0; } 128 129 /// getAsmPrinterFlag - Return whether an AsmPrinter flag is set. 130 /// 131 bool getAsmPrinterFlag(CommentFlag Flag) const { 132 return AsmPrinterFlags & Flag; 133 } 134 135 /// setAsmPrinterFlag - Set a flag for the AsmPrinter. 136 /// 137 void setAsmPrinterFlag(CommentFlag Flag) { 138 AsmPrinterFlags |= (uint8_t)Flag; 139 } 140 141 /// clearAsmPrinterFlag - clear specific AsmPrinter flags 142 /// 143 void clearAsmPrinterFlag(CommentFlag Flag) { 144 AsmPrinterFlags &= ~Flag; 145 } 146 147 /// getFlags - Return the MI flags bitvector. 148 uint8_t getFlags() const { 149 return Flags; 150 } 151 152 /// getFlag - Return whether an MI flag is set. 153 bool getFlag(MIFlag Flag) const { 154 return Flags & Flag; 155 } 156 157 /// setFlag - Set a MI flag. 158 void setFlag(MIFlag Flag) { 159 Flags |= (uint8_t)Flag; 160 } 161 162 void setFlags(unsigned flags) { 163 Flags = flags; 164 } 165 166 /// clearFlag - Clear a MI flag. 167 void clearFlag(MIFlag Flag) { 168 Flags &= ~((uint8_t)Flag); 169 } 170 171 /// isInsideBundle - Return true if MI is in a bundle (but not the first MI 172 /// in a bundle). 173 /// 174 /// A bundle looks like this before it's finalized: 175 /// ---------------- 176 /// | MI | 177 /// ---------------- 178 /// | 179 /// ---------------- 180 /// | MI * | 181 /// ---------------- 182 /// | 183 /// ---------------- 184 /// | MI * | 185 /// ---------------- 186 /// In this case, the first MI starts a bundle but is not inside a bundle, the 187 /// next 2 MIs are considered "inside" the bundle. 188 /// 189 /// After a bundle is finalized, it looks like this: 190 /// ---------------- 191 /// | Bundle | 192 /// ---------------- 193 /// | 194 /// ---------------- 195 /// | MI * | 196 /// ---------------- 197 /// | 198 /// ---------------- 199 /// | MI * | 200 /// ---------------- 201 /// | 202 /// ---------------- 203 /// | MI * | 204 /// ---------------- 205 /// The first instruction has the special opcode "BUNDLE". It's not "inside" 206 /// a bundle, but the next three MIs are. 207 bool isInsideBundle() const { 208 return getFlag(InsideBundle); 209 } 210 211 /// setIsInsideBundle - Set InsideBundle bit. 212 /// 213 void setIsInsideBundle(bool Val = true) { 214 if (Val) 215 setFlag(InsideBundle); 216 else 217 clearFlag(InsideBundle); 218 } 219 220 /// isBundled - Return true if this instruction part of a bundle. This is true 221 /// if either itself or its following instruction is marked "InsideBundle". 222 bool isBundled() const; 223 224 /// getDebugLoc - Returns the debug location id of this MachineInstr. 225 /// 226 DebugLoc getDebugLoc() const { return debugLoc; } 227 228 /// emitError - Emit an error referring to the source location of this 229 /// instruction. This should only be used for inline assembly that is somehow 230 /// impossible to compile. Other errors should have been handled much 231 /// earlier. 232 /// 233 /// If this method returns, the caller should try to recover from the error. 234 /// 235 void emitError(StringRef Msg) const; 236 237 /// getDesc - Returns the target instruction descriptor of this 238 /// MachineInstr. 239 const MCInstrDesc &getDesc() const { return *MCID; } 240 241 /// getOpcode - Returns the opcode of this MachineInstr. 242 /// 243 int getOpcode() const { return MCID->Opcode; } 244 245 /// Access to explicit operands of the instruction. 246 /// 247 unsigned getNumOperands() const { return (unsigned)Operands.size(); } 248 249 const MachineOperand& getOperand(unsigned i) const { 250 assert(i < getNumOperands() && "getOperand() out of range!"); 251 return Operands[i]; 252 } 253 MachineOperand& getOperand(unsigned i) { 254 assert(i < getNumOperands() && "getOperand() out of range!"); 255 return Operands[i]; 256 } 257 258 /// getNumExplicitOperands - Returns the number of non-implicit operands. 259 /// 260 unsigned getNumExplicitOperands() const; 261 262 /// iterator/begin/end - Iterate over all operands of a machine instruction. 263 typedef std::vector<MachineOperand>::iterator mop_iterator; 264 typedef std::vector<MachineOperand>::const_iterator const_mop_iterator; 265 266 mop_iterator operands_begin() { return Operands.begin(); } 267 mop_iterator operands_end() { return Operands.end(); } 268 269 const_mop_iterator operands_begin() const { return Operands.begin(); } 270 const_mop_iterator operands_end() const { return Operands.end(); } 271 272 /// Access to memory operands of the instruction 273 mmo_iterator memoperands_begin() const { return MemRefs; } 274 mmo_iterator memoperands_end() const { return MemRefs + NumMemRefs; } 275 bool memoperands_empty() const { return NumMemRefs == 0; } 276 277 /// hasOneMemOperand - Return true if this instruction has exactly one 278 /// MachineMemOperand. 279 bool hasOneMemOperand() const { 280 return NumMemRefs == 1; 281 } 282 283 /// API for querying MachineInstr properties. They are the same as MCInstrDesc 284 /// queries but they are bundle aware. 285 286 enum QueryType { 287 IgnoreBundle, // Ignore bundles 288 AnyInBundle, // Return true if any instruction in bundle has property 289 AllInBundle // Return true if all instructions in bundle have property 290 }; 291 292 /// hasProperty - Return true if the instruction (or in the case of a bundle, 293 /// the instructions inside the bundle) has the specified property. 294 /// The first argument is the property being queried. 295 /// The second argument indicates whether the query should look inside 296 /// instruction bundles. 297 bool hasProperty(unsigned MCFlag, QueryType Type = AnyInBundle) const { 298 // Inline the fast path. 299 if (Type == IgnoreBundle || !isBundle()) 300 return getDesc().getFlags() & (1 << MCFlag); 301 302 // If we have a bundle, take the slow path. 303 return hasPropertyInBundle(1 << MCFlag, Type); 304 } 305 306 /// isVariadic - Return true if this instruction can have a variable number of 307 /// operands. In this case, the variable operands will be after the normal 308 /// operands but before the implicit definitions and uses (if any are 309 /// present). 310 bool isVariadic(QueryType Type = IgnoreBundle) const { 311 return hasProperty(MCID::Variadic, Type); 312 } 313 314 /// hasOptionalDef - Set if this instruction has an optional definition, e.g. 315 /// ARM instructions which can set condition code if 's' bit is set. 316 bool hasOptionalDef(QueryType Type = IgnoreBundle) const { 317 return hasProperty(MCID::HasOptionalDef, Type); 318 } 319 320 /// isPseudo - Return true if this is a pseudo instruction that doesn't 321 /// correspond to a real machine instruction. 322 /// 323 bool isPseudo(QueryType Type = IgnoreBundle) const { 324 return hasProperty(MCID::Pseudo, Type); 325 } 326 327 bool isReturn(QueryType Type = AnyInBundle) const { 328 return hasProperty(MCID::Return, Type); 329 } 330 331 bool isCall(QueryType Type = AnyInBundle) const { 332 return hasProperty(MCID::Call, Type); 333 } 334 335 /// isBarrier - Returns true if the specified instruction stops control flow 336 /// from executing the instruction immediately following it. Examples include 337 /// unconditional branches and return instructions. 338 bool isBarrier(QueryType Type = AnyInBundle) const { 339 return hasProperty(MCID::Barrier, Type); 340 } 341 342 /// isTerminator - Returns true if this instruction part of the terminator for 343 /// a basic block. Typically this is things like return and branch 344 /// instructions. 345 /// 346 /// Various passes use this to insert code into the bottom of a basic block, 347 /// but before control flow occurs. 348 bool isTerminator(QueryType Type = AnyInBundle) const { 349 return hasProperty(MCID::Terminator, Type); 350 } 351 352 /// isBranch - Returns true if this is a conditional, unconditional, or 353 /// indirect branch. Predicates below can be used to discriminate between 354 /// these cases, and the TargetInstrInfo::AnalyzeBranch method can be used to 355 /// get more information. 356 bool isBranch(QueryType Type = AnyInBundle) const { 357 return hasProperty(MCID::Branch, Type); 358 } 359 360 /// isIndirectBranch - Return true if this is an indirect branch, such as a 361 /// branch through a register. 362 bool isIndirectBranch(QueryType Type = AnyInBundle) const { 363 return hasProperty(MCID::IndirectBranch, Type); 364 } 365 366 /// isConditionalBranch - Return true if this is a branch which may fall 367 /// through to the next instruction or may transfer control flow to some other 368 /// block. The TargetInstrInfo::AnalyzeBranch method can be used to get more 369 /// information about this branch. 370 bool isConditionalBranch(QueryType Type = AnyInBundle) const { 371 return isBranch(Type) & !isBarrier(Type) & !isIndirectBranch(Type); 372 } 373 374 /// isUnconditionalBranch - Return true if this is a branch which always 375 /// transfers control flow to some other block. The 376 /// TargetInstrInfo::AnalyzeBranch method can be used to get more information 377 /// about this branch. 378 bool isUnconditionalBranch(QueryType Type = AnyInBundle) const { 379 return isBranch(Type) & isBarrier(Type) & !isIndirectBranch(Type); 380 } 381 382 // isPredicable - Return true if this instruction has a predicate operand that 383 // controls execution. It may be set to 'always', or may be set to other 384 /// values. There are various methods in TargetInstrInfo that can be used to 385 /// control and modify the predicate in this instruction. 386 bool isPredicable(QueryType Type = AllInBundle) const { 387 // If it's a bundle than all bundled instructions must be predicable for this 388 // to return true. 389 return hasProperty(MCID::Predicable, Type); 390 } 391 392 /// isCompare - Return true if this instruction is a comparison. 393 bool isCompare(QueryType Type = IgnoreBundle) const { 394 return hasProperty(MCID::Compare, Type); 395 } 396 397 /// isMoveImmediate - Return true if this instruction is a move immediate 398 /// (including conditional moves) instruction. 399 bool isMoveImmediate(QueryType Type = IgnoreBundle) const { 400 return hasProperty(MCID::MoveImm, Type); 401 } 402 403 /// isBitcast - Return true if this instruction is a bitcast instruction. 404 /// 405 bool isBitcast(QueryType Type = IgnoreBundle) const { 406 return hasProperty(MCID::Bitcast, Type); 407 } 408 409 /// isSelect - Return true if this instruction is a select instruction. 410 /// 411 bool isSelect(QueryType Type = IgnoreBundle) const { 412 return hasProperty(MCID::Select, Type); 413 } 414 415 /// isNotDuplicable - Return true if this instruction cannot be safely 416 /// duplicated. For example, if the instruction has a unique labels attached 417 /// to it, duplicating it would cause multiple definition errors. 418 bool isNotDuplicable(QueryType Type = AnyInBundle) const { 419 return hasProperty(MCID::NotDuplicable, Type); 420 } 421 422 /// hasDelaySlot - Returns true if the specified instruction has a delay slot 423 /// which must be filled by the code generator. 424 bool hasDelaySlot(QueryType Type = AnyInBundle) const { 425 return hasProperty(MCID::DelaySlot, Type); 426 } 427 428 /// canFoldAsLoad - Return true for instructions that can be folded as 429 /// memory operands in other instructions. The most common use for this 430 /// is instructions that are simple loads from memory that don't modify 431 /// the loaded value in any way, but it can also be used for instructions 432 /// that can be expressed as constant-pool loads, such as V_SETALLONES 433 /// on x86, to allow them to be folded when it is beneficial. 434 /// This should only be set on instructions that return a value in their 435 /// only virtual register definition. 436 bool canFoldAsLoad(QueryType Type = IgnoreBundle) const { 437 return hasProperty(MCID::FoldableAsLoad, Type); 438 } 439 440 //===--------------------------------------------------------------------===// 441 // Side Effect Analysis 442 //===--------------------------------------------------------------------===// 443 444 /// mayLoad - Return true if this instruction could possibly read memory. 445 /// Instructions with this flag set are not necessarily simple load 446 /// instructions, they may load a value and modify it, for example. 447 bool mayLoad(QueryType Type = AnyInBundle) const { 448 if (isInlineAsm()) { 449 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm(); 450 if (ExtraInfo & InlineAsm::Extra_MayLoad) 451 return true; 452 } 453 return hasProperty(MCID::MayLoad, Type); 454 } 455 456 457 /// mayStore - Return true if this instruction could possibly modify memory. 458 /// Instructions with this flag set are not necessarily simple store 459 /// instructions, they may store a modified value based on their operands, or 460 /// may not actually modify anything, for example. 461 bool mayStore(QueryType Type = AnyInBundle) const { 462 if (isInlineAsm()) { 463 unsigned ExtraInfo = getOperand(InlineAsm::MIOp_ExtraInfo).getImm(); 464 if (ExtraInfo & InlineAsm::Extra_MayStore) 465 return true; 466 } 467 return hasProperty(MCID::MayStore, Type); 468 } 469 470 //===--------------------------------------------------------------------===// 471 // Flags that indicate whether an instruction can be modified by a method. 472 //===--------------------------------------------------------------------===// 473 474 /// isCommutable - Return true if this may be a 2- or 3-address 475 /// instruction (of the form "X = op Y, Z, ..."), which produces the same 476 /// result if Y and Z are exchanged. If this flag is set, then the 477 /// TargetInstrInfo::commuteInstruction method may be used to hack on the 478 /// instruction. 479 /// 480 /// Note that this flag may be set on instructions that are only commutable 481 /// sometimes. In these cases, the call to commuteInstruction will fail. 482 /// Also note that some instructions require non-trivial modification to 483 /// commute them. 484 bool isCommutable(QueryType Type = IgnoreBundle) const { 485 return hasProperty(MCID::Commutable, Type); 486 } 487 488 /// isConvertibleTo3Addr - Return true if this is a 2-address instruction 489 /// which can be changed into a 3-address instruction if needed. Doing this 490 /// transformation can be profitable in the register allocator, because it 491 /// means that the instruction can use a 2-address form if possible, but 492 /// degrade into a less efficient form if the source and dest register cannot 493 /// be assigned to the same register. For example, this allows the x86 494 /// backend to turn a "shl reg, 3" instruction into an LEA instruction, which 495 /// is the same speed as the shift but has bigger code size. 496 /// 497 /// If this returns true, then the target must implement the 498 /// TargetInstrInfo::convertToThreeAddress method for this instruction, which 499 /// is allowed to fail if the transformation isn't valid for this specific 500 /// instruction (e.g. shl reg, 4 on x86). 501 /// 502 bool isConvertibleTo3Addr(QueryType Type = IgnoreBundle) const { 503 return hasProperty(MCID::ConvertibleTo3Addr, Type); 504 } 505 506 /// usesCustomInsertionHook - Return true if this instruction requires 507 /// custom insertion support when the DAG scheduler is inserting it into a 508 /// machine basic block. If this is true for the instruction, it basically 509 /// means that it is a pseudo instruction used at SelectionDAG time that is 510 /// expanded out into magic code by the target when MachineInstrs are formed. 511 /// 512 /// If this is true, the TargetLoweringInfo::InsertAtEndOfBasicBlock method 513 /// is used to insert this into the MachineBasicBlock. 514 bool usesCustomInsertionHook(QueryType Type = IgnoreBundle) const { 515 return hasProperty(MCID::UsesCustomInserter, Type); 516 } 517 518 /// hasPostISelHook - Return true if this instruction requires *adjustment* 519 /// after instruction selection by calling a target hook. For example, this 520 /// can be used to fill in ARM 's' optional operand depending on whether 521 /// the conditional flag register is used. 522 bool hasPostISelHook(QueryType Type = IgnoreBundle) const { 523 return hasProperty(MCID::HasPostISelHook, Type); 524 } 525 526 /// isRematerializable - Returns true if this instruction is a candidate for 527 /// remat. This flag is deprecated, please don't use it anymore. If this 528 /// flag is set, the isReallyTriviallyReMaterializable() method is called to 529 /// verify the instruction is really rematable. 530 bool isRematerializable(QueryType Type = AllInBundle) const { 531 // It's only possible to re-mat a bundle if all bundled instructions are 532 // re-materializable. 533 return hasProperty(MCID::Rematerializable, Type); 534 } 535 536 /// isAsCheapAsAMove - Returns true if this instruction has the same cost (or 537 /// less) than a move instruction. This is useful during certain types of 538 /// optimizations (e.g., remat during two-address conversion or machine licm) 539 /// where we would like to remat or hoist the instruction, but not if it costs 540 /// more than moving the instruction into the appropriate register. Note, we 541 /// are not marking copies from and to the same register class with this flag. 542 bool isAsCheapAsAMove(QueryType Type = AllInBundle) const { 543 // Only returns true for a bundle if all bundled instructions are cheap. 544 // FIXME: This probably requires a target hook. 545 return hasProperty(MCID::CheapAsAMove, Type); 546 } 547 548 /// hasExtraSrcRegAllocReq - Returns true if this instruction source operands 549 /// have special register allocation requirements that are not captured by the 550 /// operand register classes. e.g. ARM::STRD's two source registers must be an 551 /// even / odd pair, ARM::STM registers have to be in ascending order. 552 /// Post-register allocation passes should not attempt to change allocations 553 /// for sources of instructions with this flag. 554 bool hasExtraSrcRegAllocReq(QueryType Type = AnyInBundle) const { 555 return hasProperty(MCID::ExtraSrcRegAllocReq, Type); 556 } 557 558 /// hasExtraDefRegAllocReq - Returns true if this instruction def operands 559 /// have special register allocation requirements that are not captured by the 560 /// operand register classes. e.g. ARM::LDRD's two def registers must be an 561 /// even / odd pair, ARM::LDM registers have to be in ascending order. 562 /// Post-register allocation passes should not attempt to change allocations 563 /// for definitions of instructions with this flag. 564 bool hasExtraDefRegAllocReq(QueryType Type = AnyInBundle) const { 565 return hasProperty(MCID::ExtraDefRegAllocReq, Type); 566 } 567 568 569 enum MICheckType { 570 CheckDefs, // Check all operands for equality 571 CheckKillDead, // Check all operands including kill / dead markers 572 IgnoreDefs, // Ignore all definitions 573 IgnoreVRegDefs // Ignore virtual register definitions 574 }; 575 576 /// isIdenticalTo - Return true if this instruction is identical to (same 577 /// opcode and same operands as) the specified instruction. 578 bool isIdenticalTo(const MachineInstr *Other, 579 MICheckType Check = CheckDefs) const; 580 581 /// removeFromParent - This method unlinks 'this' from the containing basic 582 /// block, and returns it, but does not delete it. 583 MachineInstr *removeFromParent(); 584 585 /// eraseFromParent - This method unlinks 'this' from the containing basic 586 /// block and deletes it. 587 void eraseFromParent(); 588 589 /// isLabel - Returns true if the MachineInstr represents a label. 590 /// 591 bool isLabel() const { 592 return getOpcode() == TargetOpcode::PROLOG_LABEL || 593 getOpcode() == TargetOpcode::EH_LABEL || 594 getOpcode() == TargetOpcode::GC_LABEL; 595 } 596 597 bool isPrologLabel() const { 598 return getOpcode() == TargetOpcode::PROLOG_LABEL; 599 } 600 bool isEHLabel() const { return getOpcode() == TargetOpcode::EH_LABEL; } 601 bool isGCLabel() const { return getOpcode() == TargetOpcode::GC_LABEL; } 602 bool isDebugValue() const { return getOpcode() == TargetOpcode::DBG_VALUE; } 603 604 bool isPHI() const { return getOpcode() == TargetOpcode::PHI; } 605 bool isKill() const { return getOpcode() == TargetOpcode::KILL; } 606 bool isImplicitDef() const { return getOpcode()==TargetOpcode::IMPLICIT_DEF; } 607 bool isInlineAsm() const { return getOpcode() == TargetOpcode::INLINEASM; } 608 bool isStackAligningInlineAsm() const; 609 InlineAsm::AsmDialect getInlineAsmDialect() const; 610 bool isInsertSubreg() const { 611 return getOpcode() == TargetOpcode::INSERT_SUBREG; 612 } 613 bool isSubregToReg() const { 614 return getOpcode() == TargetOpcode::SUBREG_TO_REG; 615 } 616 bool isRegSequence() const { 617 return getOpcode() == TargetOpcode::REG_SEQUENCE; 618 } 619 bool isBundle() const { 620 return getOpcode() == TargetOpcode::BUNDLE; 621 } 622 bool isCopy() const { 623 return getOpcode() == TargetOpcode::COPY; 624 } 625 bool isFullCopy() const { 626 return isCopy() && !getOperand(0).getSubReg() && !getOperand(1).getSubReg(); 627 } 628 629 /// isCopyLike - Return true if the instruction behaves like a copy. 630 /// This does not include native copy instructions. 631 bool isCopyLike() const { 632 return isCopy() || isSubregToReg(); 633 } 634 635 /// isIdentityCopy - Return true is the instruction is an identity copy. 636 bool isIdentityCopy() const { 637 return isCopy() && getOperand(0).getReg() == getOperand(1).getReg() && 638 getOperand(0).getSubReg() == getOperand(1).getSubReg(); 639 } 640 641 /// isTransient - Return true if this is a transient instruction that is 642 /// either very likely to be eliminated during register allocation (such as 643 /// copy-like instructions), or if this instruction doesn't have an 644 /// execution-time cost. 645 bool isTransient() const { 646 switch(getOpcode()) { 647 default: return false; 648 // Copy-like instructions are usually eliminated during register allocation. 649 case TargetOpcode::PHI: 650 case TargetOpcode::COPY: 651 case TargetOpcode::INSERT_SUBREG: 652 case TargetOpcode::SUBREG_TO_REG: 653 case TargetOpcode::REG_SEQUENCE: 654 // Pseudo-instructions that don't produce any real output. 655 case TargetOpcode::IMPLICIT_DEF: 656 case TargetOpcode::KILL: 657 case TargetOpcode::PROLOG_LABEL: 658 case TargetOpcode::EH_LABEL: 659 case TargetOpcode::GC_LABEL: 660 case TargetOpcode::DBG_VALUE: 661 return true; 662 } 663 } 664 665 /// getBundleSize - Return the number of instructions inside the MI bundle. 666 unsigned getBundleSize() const; 667 668 /// readsRegister - Return true if the MachineInstr reads the specified 669 /// register. If TargetRegisterInfo is passed, then it also checks if there 670 /// is a read of a super-register. 671 /// This does not count partial redefines of virtual registers as reads: 672 /// %reg1024:6 = OP. 673 bool readsRegister(unsigned Reg, const TargetRegisterInfo *TRI = NULL) const { 674 return findRegisterUseOperandIdx(Reg, false, TRI) != -1; 675 } 676 677 /// readsVirtualRegister - Return true if the MachineInstr reads the specified 678 /// virtual register. Take into account that a partial define is a 679 /// read-modify-write operation. 680 bool readsVirtualRegister(unsigned Reg) const { 681 return readsWritesVirtualRegister(Reg).first; 682 } 683 684 /// readsWritesVirtualRegister - Return a pair of bools (reads, writes) 685 /// indicating if this instruction reads or writes Reg. This also considers 686 /// partial defines. 687 /// If Ops is not null, all operand indices for Reg are added. 688 std::pair<bool,bool> readsWritesVirtualRegister(unsigned Reg, 689 SmallVectorImpl<unsigned> *Ops = 0) const; 690 691 /// killsRegister - Return true if the MachineInstr kills the specified 692 /// register. If TargetRegisterInfo is passed, then it also checks if there is 693 /// a kill of a super-register. 694 bool killsRegister(unsigned Reg, const TargetRegisterInfo *TRI = NULL) const { 695 return findRegisterUseOperandIdx(Reg, true, TRI) != -1; 696 } 697 698 /// definesRegister - Return true if the MachineInstr fully defines the 699 /// specified register. If TargetRegisterInfo is passed, then it also checks 700 /// if there is a def of a super-register. 701 /// NOTE: It's ignoring subreg indices on virtual registers. 702 bool definesRegister(unsigned Reg, const TargetRegisterInfo *TRI=NULL) const { 703 return findRegisterDefOperandIdx(Reg, false, false, TRI) != -1; 704 } 705 706 /// modifiesRegister - Return true if the MachineInstr modifies (fully define 707 /// or partially define) the specified register. 708 /// NOTE: It's ignoring subreg indices on virtual registers. 709 bool modifiesRegister(unsigned Reg, const TargetRegisterInfo *TRI) const { 710 return findRegisterDefOperandIdx(Reg, false, true, TRI) != -1; 711 } 712 713 /// registerDefIsDead - Returns true if the register is dead in this machine 714 /// instruction. If TargetRegisterInfo is passed, then it also checks 715 /// if there is a dead def of a super-register. 716 bool registerDefIsDead(unsigned Reg, 717 const TargetRegisterInfo *TRI = NULL) const { 718 return findRegisterDefOperandIdx(Reg, true, false, TRI) != -1; 719 } 720 721 /// findRegisterUseOperandIdx() - Returns the operand index that is a use of 722 /// the specific register or -1 if it is not found. It further tightens 723 /// the search criteria to a use that kills the register if isKill is true. 724 int findRegisterUseOperandIdx(unsigned Reg, bool isKill = false, 725 const TargetRegisterInfo *TRI = NULL) const; 726 727 /// findRegisterUseOperand - Wrapper for findRegisterUseOperandIdx, it returns 728 /// a pointer to the MachineOperand rather than an index. 729 MachineOperand *findRegisterUseOperand(unsigned Reg, bool isKill = false, 730 const TargetRegisterInfo *TRI = NULL) { 731 int Idx = findRegisterUseOperandIdx(Reg, isKill, TRI); 732 return (Idx == -1) ? NULL : &getOperand(Idx); 733 } 734 735 /// findRegisterDefOperandIdx() - Returns the operand index that is a def of 736 /// the specified register or -1 if it is not found. If isDead is true, defs 737 /// that are not dead are skipped. If Overlap is true, then it also looks for 738 /// defs that merely overlap the specified register. If TargetRegisterInfo is 739 /// non-null, then it also checks if there is a def of a super-register. 740 /// This may also return a register mask operand when Overlap is true. 741 int findRegisterDefOperandIdx(unsigned Reg, 742 bool isDead = false, bool Overlap = false, 743 const TargetRegisterInfo *TRI = NULL) const; 744 745 /// findRegisterDefOperand - Wrapper for findRegisterDefOperandIdx, it returns 746 /// a pointer to the MachineOperand rather than an index. 747 MachineOperand *findRegisterDefOperand(unsigned Reg, bool isDead = false, 748 const TargetRegisterInfo *TRI = NULL) { 749 int Idx = findRegisterDefOperandIdx(Reg, isDead, false, TRI); 750 return (Idx == -1) ? NULL : &getOperand(Idx); 751 } 752 753 /// findFirstPredOperandIdx() - Find the index of the first operand in the 754 /// operand list that is used to represent the predicate. It returns -1 if 755 /// none is found. 756 int findFirstPredOperandIdx() const; 757 758 /// findInlineAsmFlagIdx() - Find the index of the flag word operand that 759 /// corresponds to operand OpIdx on an inline asm instruction. Returns -1 if 760 /// getOperand(OpIdx) does not belong to an inline asm operand group. 761 /// 762 /// If GroupNo is not NULL, it will receive the number of the operand group 763 /// containing OpIdx. 764 /// 765 /// The flag operand is an immediate that can be decoded with methods like 766 /// InlineAsm::hasRegClassConstraint(). 767 /// 768 int findInlineAsmFlagIdx(unsigned OpIdx, unsigned *GroupNo = 0) const; 769 770 /// getRegClassConstraint - Compute the static register class constraint for 771 /// operand OpIdx. For normal instructions, this is derived from the 772 /// MCInstrDesc. For inline assembly it is derived from the flag words. 773 /// 774 /// Returns NULL if the static register classs constraint cannot be 775 /// determined. 776 /// 777 const TargetRegisterClass* 778 getRegClassConstraint(unsigned OpIdx, 779 const TargetInstrInfo *TII, 780 const TargetRegisterInfo *TRI) const; 781 782 /// tieOperands - Add a tie between the register operands at DefIdx and 783 /// UseIdx. The tie will cause the register allocator to ensure that the two 784 /// operands are assigned the same physical register. 785 /// 786 /// Tied operands are managed automatically for explicit operands in the 787 /// MCInstrDesc. This method is for exceptional cases like inline asm. 788 void tieOperands(unsigned DefIdx, unsigned UseIdx); 789 790 /// findTiedOperandIdx - Given the index of a tied register operand, find the 791 /// operand it is tied to. Defs are tied to uses and vice versa. Returns the 792 /// index of the tied operand which must exist. 793 unsigned findTiedOperandIdx(unsigned OpIdx) const; 794 795 /// isRegTiedToUseOperand - Given the index of a register def operand, 796 /// check if the register def is tied to a source operand, due to either 797 /// two-address elimination or inline assembly constraints. Returns the 798 /// first tied use operand index by reference if UseOpIdx is not null. 799 bool isRegTiedToUseOperand(unsigned DefOpIdx, unsigned *UseOpIdx = 0) const { 800 const MachineOperand &MO = getOperand(DefOpIdx); 801 if (!MO.isReg() || !MO.isDef() || !MO.isTied()) 802 return false; 803 if (UseOpIdx) 804 *UseOpIdx = findTiedOperandIdx(DefOpIdx); 805 return true; 806 } 807 808 /// isRegTiedToDefOperand - Return true if the use operand of the specified 809 /// index is tied to an def operand. It also returns the def operand index by 810 /// reference if DefOpIdx is not null. 811 bool isRegTiedToDefOperand(unsigned UseOpIdx, unsigned *DefOpIdx = 0) const { 812 const MachineOperand &MO = getOperand(UseOpIdx); 813 if (!MO.isReg() || !MO.isUse() || !MO.isTied()) 814 return false; 815 if (DefOpIdx) 816 *DefOpIdx = findTiedOperandIdx(UseOpIdx); 817 return true; 818 } 819 820 /// clearKillInfo - Clears kill flags on all operands. 821 /// 822 void clearKillInfo(); 823 824 /// copyKillDeadInfo - Copies kill / dead operand properties from MI. 825 /// 826 void copyKillDeadInfo(const MachineInstr *MI); 827 828 /// copyPredicates - Copies predicate operand(s) from MI. 829 void copyPredicates(const MachineInstr *MI); 830 831 /// substituteRegister - Replace all occurrences of FromReg with ToReg:SubIdx, 832 /// properly composing subreg indices where necessary. 833 void substituteRegister(unsigned FromReg, unsigned ToReg, unsigned SubIdx, 834 const TargetRegisterInfo &RegInfo); 835 836 /// addRegisterKilled - We have determined MI kills a register. Look for the 837 /// operand that uses it and mark it as IsKill. If AddIfNotFound is true, 838 /// add a implicit operand if it's not found. Returns true if the operand 839 /// exists / is added. 840 bool addRegisterKilled(unsigned IncomingReg, 841 const TargetRegisterInfo *RegInfo, 842 bool AddIfNotFound = false); 843 844 /// clearRegisterKills - Clear all kill flags affecting Reg. If RegInfo is 845 /// provided, this includes super-register kills. 846 void clearRegisterKills(unsigned Reg, const TargetRegisterInfo *RegInfo); 847 848 /// addRegisterDead - We have determined MI defined a register without a use. 849 /// Look for the operand that defines it and mark it as IsDead. If 850 /// AddIfNotFound is true, add a implicit operand if it's not found. Returns 851 /// true if the operand exists / is added. 852 bool addRegisterDead(unsigned IncomingReg, const TargetRegisterInfo *RegInfo, 853 bool AddIfNotFound = false); 854 855 /// addRegisterDefined - We have determined MI defines a register. Make sure 856 /// there is an operand defining Reg. 857 void addRegisterDefined(unsigned IncomingReg, 858 const TargetRegisterInfo *RegInfo = 0); 859 860 /// setPhysRegsDeadExcept - Mark every physreg used by this instruction as 861 /// dead except those in the UsedRegs list. 862 /// 863 /// On instructions with register mask operands, also add implicit-def 864 /// operands for all registers in UsedRegs. 865 void setPhysRegsDeadExcept(ArrayRef<unsigned> UsedRegs, 866 const TargetRegisterInfo &TRI); 867 868 /// isSafeToMove - Return true if it is safe to move this instruction. If 869 /// SawStore is set to true, it means that there is a store (or call) between 870 /// the instruction's location and its intended destination. 871 bool isSafeToMove(const TargetInstrInfo *TII, AliasAnalysis *AA, 872 bool &SawStore) const; 873 874 /// isSafeToReMat - Return true if it's safe to rematerialize the specified 875 /// instruction which defined the specified register instead of copying it. 876 bool isSafeToReMat(const TargetInstrInfo *TII, AliasAnalysis *AA, 877 unsigned DstReg) const; 878 879 /// hasOrderedMemoryRef - Return true if this instruction may have an ordered 880 /// or volatile memory reference, or if the information describing the memory 881 /// reference is not available. Return false if it is known to have no 882 /// ordered or volatile memory references. 883 bool hasOrderedMemoryRef() const; 884 885 /// isInvariantLoad - Return true if this instruction is loading from a 886 /// location whose value is invariant across the function. For example, 887 /// loading a value from the constant pool or from the argument area of 888 /// a function if it does not change. This should only return true of *all* 889 /// loads the instruction does are invariant (if it does multiple loads). 890 bool isInvariantLoad(AliasAnalysis *AA) const; 891 892 /// isConstantValuePHI - If the specified instruction is a PHI that always 893 /// merges together the same virtual register, return the register, otherwise 894 /// return 0. 895 unsigned isConstantValuePHI() const; 896 897 /// hasUnmodeledSideEffects - Return true if this instruction has side 898 /// effects that are not modeled by mayLoad / mayStore, etc. 899 /// For all instructions, the property is encoded in MCInstrDesc::Flags 900 /// (see MCInstrDesc::hasUnmodeledSideEffects(). The only exception is 901 /// INLINEASM instruction, in which case the side effect property is encoded 902 /// in one of its operands (see InlineAsm::Extra_HasSideEffect). 903 /// 904 bool hasUnmodeledSideEffects() const; 905 906 /// allDefsAreDead - Return true if all the defs of this instruction are dead. 907 /// 908 bool allDefsAreDead() const; 909 910 /// copyImplicitOps - Copy implicit register operands from specified 911 /// instruction to this instruction. 912 void copyImplicitOps(const MachineInstr *MI); 913 914 // 915 // Debugging support 916 // 917 void print(raw_ostream &OS, const TargetMachine *TM = 0) const; 918 void dump() const; 919 920 //===--------------------------------------------------------------------===// 921 // Accessors used to build up machine instructions. 922 923 /// addOperand - Add the specified operand to the instruction. If it is an 924 /// implicit operand, it is added to the end of the operand list. If it is 925 /// an explicit operand it is added at the end of the explicit operand list 926 /// (before the first implicit operand). 927 void addOperand(const MachineOperand &Op); 928 929 /// setDesc - Replace the instruction descriptor (thus opcode) of 930 /// the current instruction with a new one. 931 /// 932 void setDesc(const MCInstrDesc &tid) { MCID = &tid; } 933 934 /// setDebugLoc - Replace current source information with new such. 935 /// Avoid using this, the constructor argument is preferable. 936 /// 937 void setDebugLoc(const DebugLoc dl) { debugLoc = dl; } 938 939 /// RemoveOperand - Erase an operand from an instruction, leaving it with one 940 /// fewer operand than it started with. 941 /// 942 void RemoveOperand(unsigned i); 943 944 /// addMemOperand - Add a MachineMemOperand to the machine instruction. 945 /// This function should be used only occasionally. The setMemRefs function 946 /// is the primary method for setting up a MachineInstr's MemRefs list. 947 void addMemOperand(MachineFunction &MF, MachineMemOperand *MO); 948 949 /// setMemRefs - Assign this MachineInstr's memory reference descriptor 950 /// list. This does not transfer ownership. 951 void setMemRefs(mmo_iterator NewMemRefs, mmo_iterator NewMemRefsEnd) { 952 MemRefs = NewMemRefs; 953 NumMemRefs = NewMemRefsEnd - NewMemRefs; 954 } 955 956 private: 957 /// getRegInfo - If this instruction is embedded into a MachineFunction, 958 /// return the MachineRegisterInfo object for the current function, otherwise 959 /// return null. 960 MachineRegisterInfo *getRegInfo(); 961 962 /// untieRegOperand - Break any tie involving OpIdx. 963 void untieRegOperand(unsigned OpIdx) { 964 MachineOperand &MO = getOperand(OpIdx); 965 if (MO.isReg() && MO.isTied()) { 966 getOperand(findTiedOperandIdx(OpIdx)).TiedTo = 0; 967 MO.TiedTo = 0; 968 } 969 } 970 971 /// addImplicitDefUseOperands - Add all implicit def and use operands to 972 /// this instruction. 973 void addImplicitDefUseOperands(); 974 975 /// RemoveRegOperandsFromUseLists - Unlink all of the register operands in 976 /// this instruction from their respective use lists. This requires that the 977 /// operands already be on their use lists. 978 void RemoveRegOperandsFromUseLists(MachineRegisterInfo&); 979 980 /// AddRegOperandsToUseLists - Add all of the register operands in 981 /// this instruction from their respective use lists. This requires that the 982 /// operands not be on their use lists yet. 983 void AddRegOperandsToUseLists(MachineRegisterInfo&); 984 985 /// hasPropertyInBundle - Slow path for hasProperty when we're dealing with a 986 /// bundle. 987 bool hasPropertyInBundle(unsigned Mask, QueryType Type) const; 988 }; 989 990 /// MachineInstrExpressionTrait - Special DenseMapInfo traits to compare 991 /// MachineInstr* by *value* of the instruction rather than by pointer value. 992 /// The hashing and equality testing functions ignore definitions so this is 993 /// useful for CSE, etc. 994 struct MachineInstrExpressionTrait : DenseMapInfo<MachineInstr*> { 995 static inline MachineInstr *getEmptyKey() { 996 return 0; 997 } 998 999 static inline MachineInstr *getTombstoneKey() { 1000 return reinterpret_cast<MachineInstr*>(-1); 1001 } 1002 1003 static unsigned getHashValue(const MachineInstr* const &MI); 1004 1005 static bool isEqual(const MachineInstr* const &LHS, 1006 const MachineInstr* const &RHS) { 1007 if (RHS == getEmptyKey() || RHS == getTombstoneKey() || 1008 LHS == getEmptyKey() || LHS == getTombstoneKey()) 1009 return LHS == RHS; 1010 return LHS->isIdenticalTo(RHS, MachineInstr::IgnoreVRegDefs); 1011 } 1012 }; 1013 1014 //===----------------------------------------------------------------------===// 1015 // Debugging Support 1016 1017 inline raw_ostream& operator<<(raw_ostream &OS, const MachineInstr &MI) { 1018 MI.print(OS); 1019 return OS; 1020 } 1021 1022 } // End llvm namespace 1023 1024 #endif 1025