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/ilist.h" 23 #include "llvm/ADT/ilist_node.h" 24 #include "llvm/ADT/STLExtras.h" 25 #include "llvm/ADT/StringRef.h" 26 #include "llvm/ADT/DenseMapInfo.h" 27 #include "llvm/Support/DebugLoc.h" 28 #include <vector> 29 30 namespace llvm { 31 32 template <typename T> class SmallVectorImpl; 33 class AliasAnalysis; 34 class TargetInstrInfo; 35 class TargetRegisterInfo; 36 class MachineFunction; 37 class MachineMemOperand; 38 39 //===----------------------------------------------------------------------===// 40 /// MachineInstr - Representation of each machine instruction. 41 /// 42 class MachineInstr : public ilist_node<MachineInstr> { 43 public: 44 typedef MachineMemOperand **mmo_iterator; 45 46 /// Flags to specify different kinds of comments to output in 47 /// assembly code. These flags carry semantic information not 48 /// otherwise easily derivable from the IR text. 49 /// 50 enum CommentFlag { 51 ReloadReuse = 0x1 52 }; 53 54 enum MIFlag { 55 NoFlags = 0, 56 FrameSetup = 1 << 0 // Instruction is used as a part of 57 // function frame setup code. 58 }; 59 private: 60 const MCInstrDesc *MCID; // Instruction descriptor. 61 uint16_t NumImplicitOps; // Number of implicit operands (which 62 // are determined at construction time). 63 64 uint8_t Flags; // Various bits of additional 65 // information about machine 66 // instruction. 67 68 uint8_t AsmPrinterFlags; // Various bits of information used by 69 // the AsmPrinter to emit helpful 70 // comments. This is *not* semantic 71 // information. Do not use this for 72 // anything other than to convey comment 73 // information to AsmPrinter. 74 75 std::vector<MachineOperand> Operands; // the operands 76 mmo_iterator MemRefs; // information on memory references 77 mmo_iterator MemRefsEnd; 78 MachineBasicBlock *Parent; // Pointer to the owning basic block. 79 DebugLoc debugLoc; // Source line information. 80 81 // OperandComplete - Return true if it's illegal to add a new operand 82 bool OperandsComplete() const; 83 84 MachineInstr(const MachineInstr&); // DO NOT IMPLEMENT 85 void operator=(const MachineInstr&); // DO NOT IMPLEMENT 86 87 // Intrusive list support 88 friend struct ilist_traits<MachineInstr>; 89 friend struct ilist_traits<MachineBasicBlock>; 90 void setParent(MachineBasicBlock *P) { Parent = P; } 91 92 /// MachineInstr ctor - This constructor creates a copy of the given 93 /// MachineInstr in the given MachineFunction. 94 MachineInstr(MachineFunction &, const MachineInstr &); 95 96 /// MachineInstr ctor - This constructor creates a dummy MachineInstr with 97 /// MCID NULL and no operands. 98 MachineInstr(); 99 100 // The next two constructors have DebugLoc and non-DebugLoc versions; 101 // over time, the non-DebugLoc versions should be phased out and eventually 102 // removed. 103 104 /// MachineInstr ctor - This constructor creates a MachineInstr and adds the 105 /// implicit operands. It reserves space for the number of operands specified 106 /// by the MCInstrDesc. The version with a DebugLoc should be preferred. 107 explicit MachineInstr(const MCInstrDesc &MCID, bool NoImp = false); 108 109 /// MachineInstr ctor - Work exactly the same as the ctor above, except that 110 /// the MachineInstr is created and added to the end of the specified basic 111 /// block. The version with a DebugLoc should be preferred. 112 MachineInstr(MachineBasicBlock *MBB, const MCInstrDesc &MCID); 113 114 /// MachineInstr ctor - This constructor create a MachineInstr and add the 115 /// implicit operands. It reserves space for number of operands specified by 116 /// MCInstrDesc. An explicit DebugLoc is supplied. 117 explicit MachineInstr(const MCInstrDesc &MCID, const DebugLoc dl, 118 bool NoImp = false); 119 120 /// MachineInstr ctor - Work exactly the same as the ctor above, except that 121 /// the MachineInstr is created and added to the end of the specified basic 122 /// block. 123 MachineInstr(MachineBasicBlock *MBB, const DebugLoc dl, 124 const MCInstrDesc &MCID); 125 126 ~MachineInstr(); 127 128 // MachineInstrs are pool-allocated and owned by MachineFunction. 129 friend class MachineFunction; 130 131 public: 132 const MachineBasicBlock* getParent() const { return Parent; } 133 MachineBasicBlock* getParent() { return Parent; } 134 135 /// getAsmPrinterFlags - Return the asm printer flags bitvector. 136 /// 137 uint8_t getAsmPrinterFlags() const { return AsmPrinterFlags; } 138 139 /// clearAsmPrinterFlags - clear the AsmPrinter bitvector 140 /// 141 void clearAsmPrinterFlags() { AsmPrinterFlags = 0; } 142 143 /// getAsmPrinterFlag - Return whether an AsmPrinter flag is set. 144 /// 145 bool getAsmPrinterFlag(CommentFlag Flag) const { 146 return AsmPrinterFlags & Flag; 147 } 148 149 /// setAsmPrinterFlag - Set a flag for the AsmPrinter. 150 /// 151 void setAsmPrinterFlag(CommentFlag Flag) { 152 AsmPrinterFlags |= (uint8_t)Flag; 153 } 154 155 /// getFlags - Return the MI flags bitvector. 156 uint8_t getFlags() const { 157 return Flags; 158 } 159 160 /// getFlag - Return whether an MI flag is set. 161 bool getFlag(MIFlag Flag) const { 162 return Flags & Flag; 163 } 164 165 /// setFlag - Set a MI flag. 166 void setFlag(MIFlag Flag) { 167 Flags |= (uint8_t)Flag; 168 } 169 170 void setFlags(unsigned flags) { 171 Flags = flags; 172 } 173 174 /// clearAsmPrinterFlag - clear specific AsmPrinter flags 175 /// 176 void clearAsmPrinterFlag(CommentFlag Flag) { 177 AsmPrinterFlags &= ~Flag; 178 } 179 180 /// getDebugLoc - Returns the debug location id of this MachineInstr. 181 /// 182 DebugLoc getDebugLoc() const { return debugLoc; } 183 184 /// emitError - Emit an error referring to the source location of this 185 /// instruction. This should only be used for inline assembly that is somehow 186 /// impossible to compile. Other errors should have been handled much 187 /// earlier. 188 /// 189 /// If this method returns, the caller should try to recover from the error. 190 /// 191 void emitError(StringRef Msg) const; 192 193 /// getDesc - Returns the target instruction descriptor of this 194 /// MachineInstr. 195 const MCInstrDesc &getDesc() const { return *MCID; } 196 197 /// getOpcode - Returns the opcode of this MachineInstr. 198 /// 199 int getOpcode() const { return MCID->Opcode; } 200 201 /// Access to explicit operands of the instruction. 202 /// 203 unsigned getNumOperands() const { return (unsigned)Operands.size(); } 204 205 const MachineOperand& getOperand(unsigned i) const { 206 assert(i < getNumOperands() && "getOperand() out of range!"); 207 return Operands[i]; 208 } 209 MachineOperand& getOperand(unsigned i) { 210 assert(i < getNumOperands() && "getOperand() out of range!"); 211 return Operands[i]; 212 } 213 214 /// getNumExplicitOperands - Returns the number of non-implicit operands. 215 /// 216 unsigned getNumExplicitOperands() const; 217 218 /// iterator/begin/end - Iterate over all operands of a machine instruction. 219 typedef std::vector<MachineOperand>::iterator mop_iterator; 220 typedef std::vector<MachineOperand>::const_iterator const_mop_iterator; 221 222 mop_iterator operands_begin() { return Operands.begin(); } 223 mop_iterator operands_end() { return Operands.end(); } 224 225 const_mop_iterator operands_begin() const { return Operands.begin(); } 226 const_mop_iterator operands_end() const { return Operands.end(); } 227 228 /// Access to memory operands of the instruction 229 mmo_iterator memoperands_begin() const { return MemRefs; } 230 mmo_iterator memoperands_end() const { return MemRefsEnd; } 231 bool memoperands_empty() const { return MemRefsEnd == MemRefs; } 232 233 /// hasOneMemOperand - Return true if this instruction has exactly one 234 /// MachineMemOperand. 235 bool hasOneMemOperand() const { 236 return MemRefsEnd - MemRefs == 1; 237 } 238 239 enum MICheckType { 240 CheckDefs, // Check all operands for equality 241 CheckKillDead, // Check all operands including kill / dead markers 242 IgnoreDefs, // Ignore all definitions 243 IgnoreVRegDefs // Ignore virtual register definitions 244 }; 245 246 /// isIdenticalTo - Return true if this instruction is identical to (same 247 /// opcode and same operands as) the specified instruction. 248 bool isIdenticalTo(const MachineInstr *Other, 249 MICheckType Check = CheckDefs) const; 250 251 /// removeFromParent - This method unlinks 'this' from the containing basic 252 /// block, and returns it, but does not delete it. 253 MachineInstr *removeFromParent(); 254 255 /// eraseFromParent - This method unlinks 'this' from the containing basic 256 /// block and deletes it. 257 void eraseFromParent(); 258 259 /// isLabel - Returns true if the MachineInstr represents a label. 260 /// 261 bool isLabel() const { 262 return getOpcode() == TargetOpcode::PROLOG_LABEL || 263 getOpcode() == TargetOpcode::EH_LABEL || 264 getOpcode() == TargetOpcode::GC_LABEL; 265 } 266 267 bool isPrologLabel() const { 268 return getOpcode() == TargetOpcode::PROLOG_LABEL; 269 } 270 bool isEHLabel() const { return getOpcode() == TargetOpcode::EH_LABEL; } 271 bool isGCLabel() const { return getOpcode() == TargetOpcode::GC_LABEL; } 272 bool isDebugValue() const { return getOpcode() == TargetOpcode::DBG_VALUE; } 273 274 bool isPHI() const { return getOpcode() == TargetOpcode::PHI; } 275 bool isKill() const { return getOpcode() == TargetOpcode::KILL; } 276 bool isImplicitDef() const { return getOpcode()==TargetOpcode::IMPLICIT_DEF; } 277 bool isInlineAsm() const { return getOpcode() == TargetOpcode::INLINEASM; } 278 bool isStackAligningInlineAsm() const; 279 bool isInsertSubreg() const { 280 return getOpcode() == TargetOpcode::INSERT_SUBREG; 281 } 282 bool isSubregToReg() const { 283 return getOpcode() == TargetOpcode::SUBREG_TO_REG; 284 } 285 bool isRegSequence() const { 286 return getOpcode() == TargetOpcode::REG_SEQUENCE; 287 } 288 bool isCopy() const { 289 return getOpcode() == TargetOpcode::COPY; 290 } 291 bool isFullCopy() const { 292 return isCopy() && !getOperand(0).getSubReg() && !getOperand(1).getSubReg(); 293 } 294 295 /// isCopyLike - Return true if the instruction behaves like a copy. 296 /// This does not include native copy instructions. 297 bool isCopyLike() const { 298 return isCopy() || isSubregToReg(); 299 } 300 301 /// isIdentityCopy - Return true is the instruction is an identity copy. 302 bool isIdentityCopy() const { 303 return isCopy() && getOperand(0).getReg() == getOperand(1).getReg() && 304 getOperand(0).getSubReg() == getOperand(1).getSubReg(); 305 } 306 307 /// readsRegister - Return true if the MachineInstr reads the specified 308 /// register. If TargetRegisterInfo is passed, then it also checks if there 309 /// is a read of a super-register. 310 /// This does not count partial redefines of virtual registers as reads: 311 /// %reg1024:6 = OP. 312 bool readsRegister(unsigned Reg, const TargetRegisterInfo *TRI = NULL) const { 313 return findRegisterUseOperandIdx(Reg, false, TRI) != -1; 314 } 315 316 /// readsVirtualRegister - Return true if the MachineInstr reads the specified 317 /// virtual register. Take into account that a partial define is a 318 /// read-modify-write operation. 319 bool readsVirtualRegister(unsigned Reg) const { 320 return readsWritesVirtualRegister(Reg).first; 321 } 322 323 /// readsWritesVirtualRegister - Return a pair of bools (reads, writes) 324 /// indicating if this instruction reads or writes Reg. This also considers 325 /// partial defines. 326 /// If Ops is not null, all operand indices for Reg are added. 327 std::pair<bool,bool> readsWritesVirtualRegister(unsigned Reg, 328 SmallVectorImpl<unsigned> *Ops = 0) const; 329 330 /// killsRegister - Return true if the MachineInstr kills the specified 331 /// register. If TargetRegisterInfo is passed, then it also checks if there is 332 /// a kill of a super-register. 333 bool killsRegister(unsigned Reg, const TargetRegisterInfo *TRI = NULL) const { 334 return findRegisterUseOperandIdx(Reg, true, TRI) != -1; 335 } 336 337 /// definesRegister - Return true if the MachineInstr fully defines the 338 /// specified register. If TargetRegisterInfo is passed, then it also checks 339 /// if there is a def of a super-register. 340 /// NOTE: It's ignoring subreg indices on virtual registers. 341 bool definesRegister(unsigned Reg, const TargetRegisterInfo *TRI=NULL) const { 342 return findRegisterDefOperandIdx(Reg, false, false, TRI) != -1; 343 } 344 345 /// modifiesRegister - Return true if the MachineInstr modifies (fully define 346 /// or partially define) the specified register. 347 /// NOTE: It's ignoring subreg indices on virtual registers. 348 bool modifiesRegister(unsigned Reg, const TargetRegisterInfo *TRI) const { 349 return findRegisterDefOperandIdx(Reg, false, true, TRI) != -1; 350 } 351 352 /// registerDefIsDead - Returns true if the register is dead in this machine 353 /// instruction. If TargetRegisterInfo is passed, then it also checks 354 /// if there is a dead def of a super-register. 355 bool registerDefIsDead(unsigned Reg, 356 const TargetRegisterInfo *TRI = NULL) const { 357 return findRegisterDefOperandIdx(Reg, true, false, TRI) != -1; 358 } 359 360 /// findRegisterUseOperandIdx() - Returns the operand index that is a use of 361 /// the specific register or -1 if it is not found. It further tightens 362 /// the search criteria to a use that kills the register if isKill is true. 363 int findRegisterUseOperandIdx(unsigned Reg, bool isKill = false, 364 const TargetRegisterInfo *TRI = NULL) const; 365 366 /// findRegisterUseOperand - Wrapper for findRegisterUseOperandIdx, it returns 367 /// a pointer to the MachineOperand rather than an index. 368 MachineOperand *findRegisterUseOperand(unsigned Reg, bool isKill = false, 369 const TargetRegisterInfo *TRI = NULL) { 370 int Idx = findRegisterUseOperandIdx(Reg, isKill, TRI); 371 return (Idx == -1) ? NULL : &getOperand(Idx); 372 } 373 374 /// findRegisterDefOperandIdx() - Returns the operand index that is a def of 375 /// the specified register or -1 if it is not found. If isDead is true, defs 376 /// that are not dead are skipped. If Overlap is true, then it also looks for 377 /// defs that merely overlap the specified register. If TargetRegisterInfo is 378 /// non-null, then it also checks if there is a def of a super-register. 379 int findRegisterDefOperandIdx(unsigned Reg, 380 bool isDead = false, bool Overlap = false, 381 const TargetRegisterInfo *TRI = NULL) const; 382 383 /// findRegisterDefOperand - Wrapper for findRegisterDefOperandIdx, it returns 384 /// a pointer to the MachineOperand rather than an index. 385 MachineOperand *findRegisterDefOperand(unsigned Reg, bool isDead = false, 386 const TargetRegisterInfo *TRI = NULL) { 387 int Idx = findRegisterDefOperandIdx(Reg, isDead, false, TRI); 388 return (Idx == -1) ? NULL : &getOperand(Idx); 389 } 390 391 /// findFirstPredOperandIdx() - Find the index of the first operand in the 392 /// operand list that is used to represent the predicate. It returns -1 if 393 /// none is found. 394 int findFirstPredOperandIdx() const; 395 396 /// isRegTiedToUseOperand - Given the index of a register def operand, 397 /// check if the register def is tied to a source operand, due to either 398 /// two-address elimination or inline assembly constraints. Returns the 399 /// first tied use operand index by reference is UseOpIdx is not null. 400 bool isRegTiedToUseOperand(unsigned DefOpIdx, unsigned *UseOpIdx = 0) const; 401 402 /// isRegTiedToDefOperand - Return true if the use operand of the specified 403 /// index is tied to an def operand. It also returns the def operand index by 404 /// reference if DefOpIdx is not null. 405 bool isRegTiedToDefOperand(unsigned UseOpIdx, unsigned *DefOpIdx = 0) const; 406 407 /// clearKillInfo - Clears kill flags on all operands. 408 /// 409 void clearKillInfo(); 410 411 /// copyKillDeadInfo - Copies kill / dead operand properties from MI. 412 /// 413 void copyKillDeadInfo(const MachineInstr *MI); 414 415 /// copyPredicates - Copies predicate operand(s) from MI. 416 void copyPredicates(const MachineInstr *MI); 417 418 /// substituteRegister - Replace all occurrences of FromReg with ToReg:SubIdx, 419 /// properly composing subreg indices where necessary. 420 void substituteRegister(unsigned FromReg, unsigned ToReg, unsigned SubIdx, 421 const TargetRegisterInfo &RegInfo); 422 423 /// addRegisterKilled - We have determined MI kills a register. Look for the 424 /// operand that uses it and mark it as IsKill. If AddIfNotFound is true, 425 /// add a implicit operand if it's not found. Returns true if the operand 426 /// exists / is added. 427 bool addRegisterKilled(unsigned IncomingReg, 428 const TargetRegisterInfo *RegInfo, 429 bool AddIfNotFound = false); 430 431 /// addRegisterDead - We have determined MI defined a register without a use. 432 /// Look for the operand that defines it and mark it as IsDead. If 433 /// AddIfNotFound is true, add a implicit operand if it's not found. Returns 434 /// true if the operand exists / is added. 435 bool addRegisterDead(unsigned IncomingReg, const TargetRegisterInfo *RegInfo, 436 bool AddIfNotFound = false); 437 438 /// addRegisterDefined - We have determined MI defines a register. Make sure 439 /// there is an operand defining Reg. 440 void addRegisterDefined(unsigned IncomingReg, 441 const TargetRegisterInfo *RegInfo = 0); 442 443 /// setPhysRegsDeadExcept - Mark every physreg used by this instruction as 444 /// dead except those in the UsedRegs list. 445 void setPhysRegsDeadExcept(const SmallVectorImpl<unsigned> &UsedRegs, 446 const TargetRegisterInfo &TRI); 447 448 /// isSafeToMove - Return true if it is safe to move this instruction. If 449 /// SawStore is set to true, it means that there is a store (or call) between 450 /// the instruction's location and its intended destination. 451 bool isSafeToMove(const TargetInstrInfo *TII, AliasAnalysis *AA, 452 bool &SawStore) const; 453 454 /// isSafeToReMat - Return true if it's safe to rematerialize the specified 455 /// instruction which defined the specified register instead of copying it. 456 bool isSafeToReMat(const TargetInstrInfo *TII, AliasAnalysis *AA, 457 unsigned DstReg) const; 458 459 /// hasVolatileMemoryRef - Return true if this instruction may have a 460 /// volatile memory reference, or if the information describing the 461 /// memory reference is not available. Return false if it is known to 462 /// have no volatile memory references. 463 bool hasVolatileMemoryRef() const; 464 465 /// isInvariantLoad - Return true if this instruction is loading from a 466 /// location whose value is invariant across the function. For example, 467 /// loading a value from the constant pool or from the argument area of 468 /// a function if it does not change. This should only return true of *all* 469 /// loads the instruction does are invariant (if it does multiple loads). 470 bool isInvariantLoad(AliasAnalysis *AA) const; 471 472 /// isConstantValuePHI - If the specified instruction is a PHI that always 473 /// merges together the same virtual register, return the register, otherwise 474 /// return 0. 475 unsigned isConstantValuePHI() const; 476 477 /// hasUnmodeledSideEffects - Return true if this instruction has side 478 /// effects that are not modeled by mayLoad / mayStore, etc. 479 /// For all instructions, the property is encoded in MCInstrDesc::Flags 480 /// (see MCInstrDesc::hasUnmodeledSideEffects(). The only exception is 481 /// INLINEASM instruction, in which case the side effect property is encoded 482 /// in one of its operands (see InlineAsm::Extra_HasSideEffect). 483 /// 484 bool hasUnmodeledSideEffects() const; 485 486 /// allDefsAreDead - Return true if all the defs of this instruction are dead. 487 /// 488 bool allDefsAreDead() const; 489 490 /// copyImplicitOps - Copy implicit register operands from specified 491 /// instruction to this instruction. 492 void copyImplicitOps(const MachineInstr *MI); 493 494 // 495 // Debugging support 496 // 497 void print(raw_ostream &OS, const TargetMachine *TM = 0) const; 498 void dump() const; 499 500 //===--------------------------------------------------------------------===// 501 // Accessors used to build up machine instructions. 502 503 /// addOperand - Add the specified operand to the instruction. If it is an 504 /// implicit operand, it is added to the end of the operand list. If it is 505 /// an explicit operand it is added at the end of the explicit operand list 506 /// (before the first implicit operand). 507 void addOperand(const MachineOperand &Op); 508 509 /// setDesc - Replace the instruction descriptor (thus opcode) of 510 /// the current instruction with a new one. 511 /// 512 void setDesc(const MCInstrDesc &tid) { MCID = &tid; } 513 514 /// setDebugLoc - Replace current source information with new such. 515 /// Avoid using this, the constructor argument is preferable. 516 /// 517 void setDebugLoc(const DebugLoc dl) { debugLoc = dl; } 518 519 /// RemoveOperand - Erase an operand from an instruction, leaving it with one 520 /// fewer operand than it started with. 521 /// 522 void RemoveOperand(unsigned i); 523 524 /// addMemOperand - Add a MachineMemOperand to the machine instruction. 525 /// This function should be used only occasionally. The setMemRefs function 526 /// is the primary method for setting up a MachineInstr's MemRefs list. 527 void addMemOperand(MachineFunction &MF, MachineMemOperand *MO); 528 529 /// setMemRefs - Assign this MachineInstr's memory reference descriptor 530 /// list. This does not transfer ownership. 531 void setMemRefs(mmo_iterator NewMemRefs, mmo_iterator NewMemRefsEnd) { 532 MemRefs = NewMemRefs; 533 MemRefsEnd = NewMemRefsEnd; 534 } 535 536 private: 537 /// getRegInfo - If this instruction is embedded into a MachineFunction, 538 /// return the MachineRegisterInfo object for the current function, otherwise 539 /// return null. 540 MachineRegisterInfo *getRegInfo(); 541 542 /// addImplicitDefUseOperands - Add all implicit def and use operands to 543 /// this instruction. 544 void addImplicitDefUseOperands(); 545 546 /// RemoveRegOperandsFromUseLists - Unlink all of the register operands in 547 /// this instruction from their respective use lists. This requires that the 548 /// operands already be on their use lists. 549 void RemoveRegOperandsFromUseLists(); 550 551 /// AddRegOperandsToUseLists - Add all of the register operands in 552 /// this instruction from their respective use lists. This requires that the 553 /// operands not be on their use lists yet. 554 void AddRegOperandsToUseLists(MachineRegisterInfo &RegInfo); 555 }; 556 557 /// MachineInstrExpressionTrait - Special DenseMapInfo traits to compare 558 /// MachineInstr* by *value* of the instruction rather than by pointer value. 559 /// The hashing and equality testing functions ignore definitions so this is 560 /// useful for CSE, etc. 561 struct MachineInstrExpressionTrait : DenseMapInfo<MachineInstr*> { 562 static inline MachineInstr *getEmptyKey() { 563 return 0; 564 } 565 566 static inline MachineInstr *getTombstoneKey() { 567 return reinterpret_cast<MachineInstr*>(-1); 568 } 569 570 static unsigned getHashValue(const MachineInstr* const &MI); 571 572 static bool isEqual(const MachineInstr* const &LHS, 573 const MachineInstr* const &RHS) { 574 if (RHS == getEmptyKey() || RHS == getTombstoneKey() || 575 LHS == getEmptyKey() || LHS == getTombstoneKey()) 576 return LHS == RHS; 577 return LHS->isIdenticalTo(RHS, MachineInstr::IgnoreVRegDefs); 578 } 579 }; 580 581 //===----------------------------------------------------------------------===// 582 // Debugging Support 583 584 inline raw_ostream& operator<<(raw_ostream &OS, const MachineInstr &MI) { 585 MI.print(OS); 586 return OS; 587 } 588 589 } // End llvm namespace 590 591 #endif 592