1 //===-- lib/CodeGen/MachineInstr.cpp --------------------------------------===// 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 // Methods common to all machine instructions. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "llvm/Constants.h" 15 #include "llvm/CodeGen/MachineInstr.h" 16 #include "llvm/Value.h" 17 #include "llvm/CodeGen/MachineFunction.h" 18 #include "llvm/CodeGen/MachineRegisterInfo.h" 19 #include "llvm/CodeGen/PseudoSourceValue.h" 20 #include "llvm/Target/TargetMachine.h" 21 #include "llvm/Target/TargetInstrInfo.h" 22 #include "llvm/Target/TargetInstrDesc.h" 23 #include "llvm/Target/TargetRegisterInfo.h" 24 #include "llvm/Support/MathExtras.h" 25 #include "llvm/Support/Streams.h" 26 #include <ostream> 27 using namespace llvm; 28 29 //===----------------------------------------------------------------------===// 30 // MachineOperand Implementation 31 //===----------------------------------------------------------------------===// 32 33 /// AddRegOperandToRegInfo - Add this register operand to the specified 34 /// MachineRegisterInfo. If it is null, then the next/prev fields should be 35 /// explicitly nulled out. 36 void MachineOperand::AddRegOperandToRegInfo(MachineRegisterInfo *RegInfo) { 37 assert(isReg() && "Can only add reg operand to use lists"); 38 39 // If the reginfo pointer is null, just explicitly null out or next/prev 40 // pointers, to ensure they are not garbage. 41 if (RegInfo == 0) { 42 Contents.Reg.Prev = 0; 43 Contents.Reg.Next = 0; 44 return; 45 } 46 47 // Otherwise, add this operand to the head of the registers use/def list. 48 MachineOperand **Head = &RegInfo->getRegUseDefListHead(getReg()); 49 50 // For SSA values, we prefer to keep the definition at the start of the list. 51 // we do this by skipping over the definition if it is at the head of the 52 // list. 53 if (*Head && (*Head)->isDef()) 54 Head = &(*Head)->Contents.Reg.Next; 55 56 Contents.Reg.Next = *Head; 57 if (Contents.Reg.Next) { 58 assert(getReg() == Contents.Reg.Next->getReg() && 59 "Different regs on the same list!"); 60 Contents.Reg.Next->Contents.Reg.Prev = &Contents.Reg.Next; 61 } 62 63 Contents.Reg.Prev = Head; 64 *Head = this; 65 } 66 67 void MachineOperand::setReg(unsigned Reg) { 68 if (getReg() == Reg) return; // No change. 69 70 // Otherwise, we have to change the register. If this operand is embedded 71 // into a machine function, we need to update the old and new register's 72 // use/def lists. 73 if (MachineInstr *MI = getParent()) 74 if (MachineBasicBlock *MBB = MI->getParent()) 75 if (MachineFunction *MF = MBB->getParent()) { 76 RemoveRegOperandFromRegInfo(); 77 Contents.Reg.RegNo = Reg; 78 AddRegOperandToRegInfo(&MF->getRegInfo()); 79 return; 80 } 81 82 // Otherwise, just change the register, no problem. :) 83 Contents.Reg.RegNo = Reg; 84 } 85 86 /// ChangeToImmediate - Replace this operand with a new immediate operand of 87 /// the specified value. If an operand is known to be an immediate already, 88 /// the setImm method should be used. 89 void MachineOperand::ChangeToImmediate(int64_t ImmVal) { 90 // If this operand is currently a register operand, and if this is in a 91 // function, deregister the operand from the register's use/def list. 92 if (isReg() && getParent() && getParent()->getParent() && 93 getParent()->getParent()->getParent()) 94 RemoveRegOperandFromRegInfo(); 95 96 OpKind = MO_Immediate; 97 Contents.ImmVal = ImmVal; 98 } 99 100 /// ChangeToRegister - Replace this operand with a new register operand of 101 /// the specified value. If an operand is known to be an register already, 102 /// the setReg method should be used. 103 void MachineOperand::ChangeToRegister(unsigned Reg, bool isDef, bool isImp, 104 bool isKill, bool isDead) { 105 // If this operand is already a register operand, use setReg to update the 106 // register's use/def lists. 107 if (isReg()) { 108 setReg(Reg); 109 } else { 110 // Otherwise, change this to a register and set the reg#. 111 OpKind = MO_Register; 112 Contents.Reg.RegNo = Reg; 113 114 // If this operand is embedded in a function, add the operand to the 115 // register's use/def list. 116 if (MachineInstr *MI = getParent()) 117 if (MachineBasicBlock *MBB = MI->getParent()) 118 if (MachineFunction *MF = MBB->getParent()) 119 AddRegOperandToRegInfo(&MF->getRegInfo()); 120 } 121 122 IsDef = isDef; 123 IsImp = isImp; 124 IsKill = isKill; 125 IsDead = isDead; 126 SubReg = 0; 127 } 128 129 /// isIdenticalTo - Return true if this operand is identical to the specified 130 /// operand. 131 bool MachineOperand::isIdenticalTo(const MachineOperand &Other) const { 132 if (getType() != Other.getType()) return false; 133 134 switch (getType()) { 135 default: assert(0 && "Unrecognized operand type"); 136 case MachineOperand::MO_Register: 137 return getReg() == Other.getReg() && isDef() == Other.isDef() && 138 getSubReg() == Other.getSubReg(); 139 case MachineOperand::MO_Immediate: 140 return getImm() == Other.getImm(); 141 case MachineOperand::MO_FPImmediate: 142 return getFPImm() == Other.getFPImm(); 143 case MachineOperand::MO_MachineBasicBlock: 144 return getMBB() == Other.getMBB(); 145 case MachineOperand::MO_FrameIndex: 146 return getIndex() == Other.getIndex(); 147 case MachineOperand::MO_ConstantPoolIndex: 148 return getIndex() == Other.getIndex() && getOffset() == Other.getOffset(); 149 case MachineOperand::MO_JumpTableIndex: 150 return getIndex() == Other.getIndex(); 151 case MachineOperand::MO_GlobalAddress: 152 return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset(); 153 case MachineOperand::MO_ExternalSymbol: 154 return !strcmp(getSymbolName(), Other.getSymbolName()) && 155 getOffset() == Other.getOffset(); 156 } 157 } 158 159 /// print - Print the specified machine operand. 160 /// 161 void MachineOperand::print(std::ostream &OS, const TargetMachine *TM) const { 162 switch (getType()) { 163 case MachineOperand::MO_Register: 164 if (getReg() == 0 || TargetRegisterInfo::isVirtualRegister(getReg())) { 165 OS << "%reg" << getReg(); 166 } else { 167 // If the instruction is embedded into a basic block, we can find the 168 // target info for the instruction. 169 if (TM == 0) 170 if (const MachineInstr *MI = getParent()) 171 if (const MachineBasicBlock *MBB = MI->getParent()) 172 if (const MachineFunction *MF = MBB->getParent()) 173 TM = &MF->getTarget(); 174 175 if (TM) 176 OS << "%" << TM->getRegisterInfo()->get(getReg()).Name; 177 else 178 OS << "%mreg" << getReg(); 179 } 180 181 if (isDef() || isKill() || isDead() || isImplicit()) { 182 OS << "<"; 183 bool NeedComma = false; 184 if (isImplicit()) { 185 OS << (isDef() ? "imp-def" : "imp-use"); 186 NeedComma = true; 187 } else if (isDef()) { 188 OS << "def"; 189 NeedComma = true; 190 } 191 if (isKill() || isDead()) { 192 if (NeedComma) OS << ","; 193 if (isKill()) OS << "kill"; 194 if (isDead()) OS << "dead"; 195 } 196 OS << ">"; 197 } 198 break; 199 case MachineOperand::MO_Immediate: 200 OS << getImm(); 201 break; 202 case MachineOperand::MO_FPImmediate: 203 if (getFPImm()->getType() == Type::FloatTy) { 204 OS << getFPImm()->getValueAPF().convertToFloat(); 205 } else { 206 OS << getFPImm()->getValueAPF().convertToDouble(); 207 } 208 break; 209 case MachineOperand::MO_MachineBasicBlock: 210 OS << "mbb<" 211 << ((Value*)getMBB()->getBasicBlock())->getName() 212 << "," << (void*)getMBB() << ">"; 213 break; 214 case MachineOperand::MO_FrameIndex: 215 OS << "<fi#" << getIndex() << ">"; 216 break; 217 case MachineOperand::MO_ConstantPoolIndex: 218 OS << "<cp#" << getIndex(); 219 if (getOffset()) OS << "+" << getOffset(); 220 OS << ">"; 221 break; 222 case MachineOperand::MO_JumpTableIndex: 223 OS << "<jt#" << getIndex() << ">"; 224 break; 225 case MachineOperand::MO_GlobalAddress: 226 OS << "<ga:" << ((Value*)getGlobal())->getName(); 227 if (getOffset()) OS << "+" << getOffset(); 228 OS << ">"; 229 break; 230 case MachineOperand::MO_ExternalSymbol: 231 OS << "<es:" << getSymbolName(); 232 if (getOffset()) OS << "+" << getOffset(); 233 OS << ">"; 234 break; 235 default: 236 assert(0 && "Unrecognized operand type"); 237 } 238 } 239 240 //===----------------------------------------------------------------------===// 241 // MachineMemOperand Implementation 242 //===----------------------------------------------------------------------===// 243 244 MachineMemOperand::MachineMemOperand(const Value *v, unsigned int f, 245 int64_t o, uint64_t s, unsigned int a) 246 : Offset(o), Size(s), V(v), 247 Flags((f & 7) | ((Log2_32(a) + 1) << 3)) { 248 assert(isPowerOf2_32(a) && "Alignment is not a power of 2!"); 249 } 250 251 //===----------------------------------------------------------------------===// 252 // MachineInstr Implementation 253 //===----------------------------------------------------------------------===// 254 255 /// MachineInstr ctor - This constructor creates a dummy MachineInstr with 256 /// TID NULL and no operands. 257 MachineInstr::MachineInstr() 258 : TID(0), NumImplicitOps(0), Parent(0) { 259 } 260 261 void MachineInstr::addImplicitDefUseOperands() { 262 if (TID->ImplicitDefs) 263 for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs) 264 addOperand(MachineOperand::CreateReg(*ImpDefs, true, true)); 265 if (TID->ImplicitUses) 266 for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses) 267 addOperand(MachineOperand::CreateReg(*ImpUses, false, true)); 268 } 269 270 /// MachineInstr ctor - This constructor create a MachineInstr and add the 271 /// implicit operands. It reserves space for number of operands specified by 272 /// TargetInstrDesc or the numOperands if it is not zero. (for 273 /// instructions with variable number of operands). 274 MachineInstr::MachineInstr(const TargetInstrDesc &tid, bool NoImp) 275 : TID(&tid), NumImplicitOps(0), Parent(0) { 276 if (!NoImp && TID->getImplicitDefs()) 277 for (const unsigned *ImpDefs = TID->getImplicitDefs(); *ImpDefs; ++ImpDefs) 278 NumImplicitOps++; 279 if (!NoImp && TID->getImplicitUses()) 280 for (const unsigned *ImpUses = TID->getImplicitUses(); *ImpUses; ++ImpUses) 281 NumImplicitOps++; 282 Operands.reserve(NumImplicitOps + TID->getNumOperands()); 283 if (!NoImp) 284 addImplicitDefUseOperands(); 285 } 286 287 /// MachineInstr ctor - Work exactly the same as the ctor above, except that the 288 /// MachineInstr is created and added to the end of the specified basic block. 289 /// 290 MachineInstr::MachineInstr(MachineBasicBlock *MBB, 291 const TargetInstrDesc &tid) 292 : TID(&tid), NumImplicitOps(0), Parent(0) { 293 assert(MBB && "Cannot use inserting ctor with null basic block!"); 294 if (TID->ImplicitDefs) 295 for (const unsigned *ImpDefs = TID->getImplicitDefs(); *ImpDefs; ++ImpDefs) 296 NumImplicitOps++; 297 if (TID->ImplicitUses) 298 for (const unsigned *ImpUses = TID->getImplicitUses(); *ImpUses; ++ImpUses) 299 NumImplicitOps++; 300 Operands.reserve(NumImplicitOps + TID->getNumOperands()); 301 addImplicitDefUseOperands(); 302 MBB->push_back(this); // Add instruction to end of basic block! 303 } 304 305 /// MachineInstr ctor - Copies MachineInstr arg exactly 306 /// 307 MachineInstr::MachineInstr(MachineFunction &MF, const MachineInstr &MI) { 308 TID = &MI.getDesc(); 309 NumImplicitOps = MI.NumImplicitOps; 310 Operands.reserve(MI.getNumOperands()); 311 312 // Add operands 313 for (unsigned i = 0; i != MI.getNumOperands(); ++i) { 314 Operands.push_back(MI.getOperand(i)); 315 Operands.back().ParentMI = this; 316 } 317 318 // Add memory operands. 319 for (alist<MachineMemOperand>::const_iterator i = MI.memoperands_begin(), 320 j = MI.memoperands_end(); i != j; ++i) 321 addMemOperand(MF, *i); 322 323 // Set parent to null. 324 Parent = 0; 325 } 326 327 MachineInstr::~MachineInstr() { 328 assert(MemOperands.empty() && 329 "MachineInstr being deleted with live memoperands!"); 330 #ifndef NDEBUG 331 for (unsigned i = 0, e = Operands.size(); i != e; ++i) { 332 assert(Operands[i].ParentMI == this && "ParentMI mismatch!"); 333 assert((!Operands[i].isReg() || !Operands[i].isOnRegUseList()) && 334 "Reg operand def/use list corrupted"); 335 } 336 #endif 337 } 338 339 /// getOpcode - Returns the opcode of this MachineInstr. 340 /// 341 int MachineInstr::getOpcode() const { 342 return TID->Opcode; 343 } 344 345 /// getRegInfo - If this instruction is embedded into a MachineFunction, 346 /// return the MachineRegisterInfo object for the current function, otherwise 347 /// return null. 348 MachineRegisterInfo *MachineInstr::getRegInfo() { 349 if (MachineBasicBlock *MBB = getParent()) 350 return &MBB->getParent()->getRegInfo(); 351 return 0; 352 } 353 354 /// RemoveRegOperandsFromUseLists - Unlink all of the register operands in 355 /// this instruction from their respective use lists. This requires that the 356 /// operands already be on their use lists. 357 void MachineInstr::RemoveRegOperandsFromUseLists() { 358 for (unsigned i = 0, e = Operands.size(); i != e; ++i) { 359 if (Operands[i].isReg()) 360 Operands[i].RemoveRegOperandFromRegInfo(); 361 } 362 } 363 364 /// AddRegOperandsToUseLists - Add all of the register operands in 365 /// this instruction from their respective use lists. This requires that the 366 /// operands not be on their use lists yet. 367 void MachineInstr::AddRegOperandsToUseLists(MachineRegisterInfo &RegInfo) { 368 for (unsigned i = 0, e = Operands.size(); i != e; ++i) { 369 if (Operands[i].isReg()) 370 Operands[i].AddRegOperandToRegInfo(&RegInfo); 371 } 372 } 373 374 375 /// addOperand - Add the specified operand to the instruction. If it is an 376 /// implicit operand, it is added to the end of the operand list. If it is 377 /// an explicit operand it is added at the end of the explicit operand list 378 /// (before the first implicit operand). 379 void MachineInstr::addOperand(const MachineOperand &Op) { 380 bool isImpReg = Op.isReg() && Op.isImplicit(); 381 assert((isImpReg || !OperandsComplete()) && 382 "Trying to add an operand to a machine instr that is already done!"); 383 384 // If we are adding the operand to the end of the list, our job is simpler. 385 // This is true most of the time, so this is a reasonable optimization. 386 if (isImpReg || NumImplicitOps == 0) { 387 // We can only do this optimization if we know that the operand list won't 388 // reallocate. 389 if (Operands.empty() || Operands.size()+1 <= Operands.capacity()) { 390 Operands.push_back(Op); 391 392 // Set the parent of the operand. 393 Operands.back().ParentMI = this; 394 395 // If the operand is a register, update the operand's use list. 396 if (Op.isReg()) 397 Operands.back().AddRegOperandToRegInfo(getRegInfo()); 398 return; 399 } 400 } 401 402 // Otherwise, we have to insert a real operand before any implicit ones. 403 unsigned OpNo = Operands.size()-NumImplicitOps; 404 405 MachineRegisterInfo *RegInfo = getRegInfo(); 406 407 // If this instruction isn't embedded into a function, then we don't need to 408 // update any operand lists. 409 if (RegInfo == 0) { 410 // Simple insertion, no reginfo update needed for other register operands. 411 Operands.insert(Operands.begin()+OpNo, Op); 412 Operands[OpNo].ParentMI = this; 413 414 // Do explicitly set the reginfo for this operand though, to ensure the 415 // next/prev fields are properly nulled out. 416 if (Operands[OpNo].isReg()) 417 Operands[OpNo].AddRegOperandToRegInfo(0); 418 419 } else if (Operands.size()+1 <= Operands.capacity()) { 420 // Otherwise, we have to remove register operands from their register use 421 // list, add the operand, then add the register operands back to their use 422 // list. This also must handle the case when the operand list reallocates 423 // to somewhere else. 424 425 // If insertion of this operand won't cause reallocation of the operand 426 // list, just remove the implicit operands, add the operand, then re-add all 427 // the rest of the operands. 428 for (unsigned i = OpNo, e = Operands.size(); i != e; ++i) { 429 assert(Operands[i].isReg() && "Should only be an implicit reg!"); 430 Operands[i].RemoveRegOperandFromRegInfo(); 431 } 432 433 // Add the operand. If it is a register, add it to the reg list. 434 Operands.insert(Operands.begin()+OpNo, Op); 435 Operands[OpNo].ParentMI = this; 436 437 if (Operands[OpNo].isReg()) 438 Operands[OpNo].AddRegOperandToRegInfo(RegInfo); 439 440 // Re-add all the implicit ops. 441 for (unsigned i = OpNo+1, e = Operands.size(); i != e; ++i) { 442 assert(Operands[i].isReg() && "Should only be an implicit reg!"); 443 Operands[i].AddRegOperandToRegInfo(RegInfo); 444 } 445 } else { 446 // Otherwise, we will be reallocating the operand list. Remove all reg 447 // operands from their list, then readd them after the operand list is 448 // reallocated. 449 RemoveRegOperandsFromUseLists(); 450 451 Operands.insert(Operands.begin()+OpNo, Op); 452 Operands[OpNo].ParentMI = this; 453 454 // Re-add all the operands. 455 AddRegOperandsToUseLists(*RegInfo); 456 } 457 } 458 459 /// RemoveOperand - Erase an operand from an instruction, leaving it with one 460 /// fewer operand than it started with. 461 /// 462 void MachineInstr::RemoveOperand(unsigned OpNo) { 463 assert(OpNo < Operands.size() && "Invalid operand number"); 464 465 // Special case removing the last one. 466 if (OpNo == Operands.size()-1) { 467 // If needed, remove from the reg def/use list. 468 if (Operands.back().isReg() && Operands.back().isOnRegUseList()) 469 Operands.back().RemoveRegOperandFromRegInfo(); 470 471 Operands.pop_back(); 472 return; 473 } 474 475 // Otherwise, we are removing an interior operand. If we have reginfo to 476 // update, remove all operands that will be shifted down from their reg lists, 477 // move everything down, then re-add them. 478 MachineRegisterInfo *RegInfo = getRegInfo(); 479 if (RegInfo) { 480 for (unsigned i = OpNo, e = Operands.size(); i != e; ++i) { 481 if (Operands[i].isReg()) 482 Operands[i].RemoveRegOperandFromRegInfo(); 483 } 484 } 485 486 Operands.erase(Operands.begin()+OpNo); 487 488 if (RegInfo) { 489 for (unsigned i = OpNo, e = Operands.size(); i != e; ++i) { 490 if (Operands[i].isReg()) 491 Operands[i].AddRegOperandToRegInfo(RegInfo); 492 } 493 } 494 } 495 496 /// addMemOperand - Add a MachineMemOperand to the machine instruction, 497 /// referencing arbitrary storage. 498 void MachineInstr::addMemOperand(MachineFunction &MF, 499 const MachineMemOperand &MO) { 500 MemOperands.push_back(MF.CreateMachineMemOperand(MO)); 501 } 502 503 /// clearMemOperands - Erase all of this MachineInstr's MachineMemOperands. 504 void MachineInstr::clearMemOperands(MachineFunction &MF) { 505 while (!MemOperands.empty()) 506 MF.DeleteMachineMemOperand(MemOperands.remove(MemOperands.begin())); 507 } 508 509 510 /// removeFromParent - This method unlinks 'this' from the containing basic 511 /// block, and returns it, but does not delete it. 512 MachineInstr *MachineInstr::removeFromParent() { 513 assert(getParent() && "Not embedded in a basic block!"); 514 getParent()->remove(this); 515 return this; 516 } 517 518 519 /// eraseFromParent - This method unlinks 'this' from the containing basic 520 /// block, and deletes it. 521 void MachineInstr::eraseFromParent() { 522 assert(getParent() && "Not embedded in a basic block!"); 523 getParent()->erase(this); 524 } 525 526 527 /// OperandComplete - Return true if it's illegal to add a new operand 528 /// 529 bool MachineInstr::OperandsComplete() const { 530 unsigned short NumOperands = TID->getNumOperands(); 531 if (!TID->isVariadic() && getNumOperands()-NumImplicitOps >= NumOperands) 532 return true; // Broken: we have all the operands of this instruction! 533 return false; 534 } 535 536 /// getNumExplicitOperands - Returns the number of non-implicit operands. 537 /// 538 unsigned MachineInstr::getNumExplicitOperands() const { 539 unsigned NumOperands = TID->getNumOperands(); 540 if (!TID->isVariadic()) 541 return NumOperands; 542 543 for (unsigned e = getNumOperands(); NumOperands != e; ++NumOperands) { 544 const MachineOperand &MO = getOperand(NumOperands); 545 if (!MO.isRegister() || !MO.isImplicit()) 546 NumOperands++; 547 } 548 return NumOperands; 549 } 550 551 552 /// isLabel - Returns true if the MachineInstr represents a label. 553 /// 554 bool MachineInstr::isLabel() const { 555 return getOpcode() == TargetInstrInfo::DBG_LABEL || 556 getOpcode() == TargetInstrInfo::EH_LABEL || 557 getOpcode() == TargetInstrInfo::GC_LABEL; 558 } 559 560 /// isDebugLabel - Returns true if the MachineInstr represents a debug label. 561 /// 562 bool MachineInstr::isDebugLabel() const { 563 return getOpcode() == TargetInstrInfo::DBG_LABEL; 564 } 565 566 /// findRegisterUseOperandIdx() - Returns the MachineOperand that is a use of 567 /// the specific register or -1 if it is not found. It further tightening 568 /// the search criteria to a use that kills the register if isKill is true. 569 int MachineInstr::findRegisterUseOperandIdx(unsigned Reg, bool isKill, 570 const TargetRegisterInfo *TRI) const { 571 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 572 const MachineOperand &MO = getOperand(i); 573 if (!MO.isRegister() || !MO.isUse()) 574 continue; 575 unsigned MOReg = MO.getReg(); 576 if (!MOReg) 577 continue; 578 if (MOReg == Reg || 579 (TRI && 580 TargetRegisterInfo::isPhysicalRegister(MOReg) && 581 TargetRegisterInfo::isPhysicalRegister(Reg) && 582 TRI->isSubRegister(MOReg, Reg))) 583 if (!isKill || MO.isKill()) 584 return i; 585 } 586 return -1; 587 } 588 589 /// findRegisterDefOperandIdx() - Returns the operand index that is a def of 590 /// the specified register or -1 if it is not found. If isDead is true, defs 591 /// that are not dead are skipped. If TargetRegisterInfo is non-null, then it 592 /// also checks if there is a def of a super-register. 593 int MachineInstr::findRegisterDefOperandIdx(unsigned Reg, bool isDead, 594 const TargetRegisterInfo *TRI) const { 595 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 596 const MachineOperand &MO = getOperand(i); 597 if (!MO.isRegister() || !MO.isDef()) 598 continue; 599 unsigned MOReg = MO.getReg(); 600 if (MOReg == Reg || 601 (TRI && 602 TargetRegisterInfo::isPhysicalRegister(MOReg) && 603 TargetRegisterInfo::isPhysicalRegister(Reg) && 604 TRI->isSubRegister(MOReg, Reg))) 605 if (!isDead || MO.isDead()) 606 return i; 607 } 608 return -1; 609 } 610 611 /// findFirstPredOperandIdx() - Find the index of the first operand in the 612 /// operand list that is used to represent the predicate. It returns -1 if 613 /// none is found. 614 int MachineInstr::findFirstPredOperandIdx() const { 615 const TargetInstrDesc &TID = getDesc(); 616 if (TID.isPredicable()) { 617 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) 618 if (TID.OpInfo[i].isPredicate()) 619 return i; 620 } 621 622 return -1; 623 } 624 625 /// isRegReDefinedByTwoAddr - Given the defined register and the operand index, 626 /// check if the register def is a re-definition due to two addr elimination. 627 bool MachineInstr::isRegReDefinedByTwoAddr(unsigned Reg, unsigned DefIdx) const{ 628 const TargetInstrDesc &TID = getDesc(); 629 for (unsigned i = 0, e = TID.getNumOperands(); i != e; ++i) { 630 const MachineOperand &MO = getOperand(i); 631 if (MO.isRegister() && MO.isUse() && MO.getReg() == Reg && 632 TID.getOperandConstraint(i, TOI::TIED_TO) == (int)DefIdx) 633 return true; 634 } 635 return false; 636 } 637 638 /// copyKillDeadInfo - Copies kill / dead operand properties from MI. 639 /// 640 void MachineInstr::copyKillDeadInfo(const MachineInstr *MI) { 641 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 642 const MachineOperand &MO = MI->getOperand(i); 643 if (!MO.isRegister() || (!MO.isKill() && !MO.isDead())) 644 continue; 645 for (unsigned j = 0, ee = getNumOperands(); j != ee; ++j) { 646 MachineOperand &MOp = getOperand(j); 647 if (!MOp.isIdenticalTo(MO)) 648 continue; 649 if (MO.isKill()) 650 MOp.setIsKill(); 651 else 652 MOp.setIsDead(); 653 break; 654 } 655 } 656 } 657 658 /// copyPredicates - Copies predicate operand(s) from MI. 659 void MachineInstr::copyPredicates(const MachineInstr *MI) { 660 const TargetInstrDesc &TID = MI->getDesc(); 661 if (!TID.isPredicable()) 662 return; 663 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 664 if (TID.OpInfo[i].isPredicate()) { 665 // Predicated operands must be last operands. 666 addOperand(MI->getOperand(i)); 667 } 668 } 669 } 670 671 /// isSafeToMove - Return true if it is safe to move this instruction. If 672 /// SawStore is set to true, it means that there is a store (or call) between 673 /// the instruction's location and its intended destination. 674 bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII, bool &SawStore) { 675 // Ignore stuff that we obviously can't move. 676 if (TID->mayStore() || TID->isCall()) { 677 SawStore = true; 678 return false; 679 } 680 if (TID->isReturn() || TID->isBranch() || TID->hasUnmodeledSideEffects()) 681 return false; 682 683 // See if this instruction does a load. If so, we have to guarantee that the 684 // loaded value doesn't change between the load and the its intended 685 // destination. The check for isInvariantLoad gives the targe the chance to 686 // classify the load as always returning a constant, e.g. a constant pool 687 // load. 688 if (TID->mayLoad() && !TII->isInvariantLoad(this)) { 689 // Otherwise, this is a real load. If there is a store between the load and 690 // end of block, we can't sink the load. 691 // 692 // FIXME: we can't do this transformation until we know that the load is 693 // not volatile, and machineinstrs don't keep this info. :( 694 // 695 //if (SawStore) 696 return false; 697 } 698 return true; 699 } 700 701 void MachineInstr::dump() const { 702 cerr << " " << *this; 703 } 704 705 void MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const { 706 // Specialize printing if op#0 is definition 707 unsigned StartOp = 0; 708 if (getNumOperands() && getOperand(0).isRegister() && getOperand(0).isDef()) { 709 getOperand(0).print(OS, TM); 710 OS << " = "; 711 ++StartOp; // Don't print this operand again! 712 } 713 714 OS << getDesc().getName(); 715 716 for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { 717 if (i != StartOp) 718 OS << ","; 719 OS << " "; 720 getOperand(i).print(OS, TM); 721 } 722 723 if (!memoperands_empty()) { 724 OS << ", Mem:"; 725 for (alist<MachineMemOperand>::const_iterator i = memoperands_begin(), 726 e = memoperands_end(); i != e; ++i) { 727 const MachineMemOperand &MRO = *i; 728 const Value *V = MRO.getValue(); 729 730 assert((MRO.isLoad() || MRO.isStore()) && 731 "SV has to be a load, store or both."); 732 733 if (MRO.isVolatile()) 734 OS << "Volatile "; 735 736 if (MRO.isLoad()) 737 OS << "LD"; 738 if (MRO.isStore()) 739 OS << "ST"; 740 741 OS << "(" << MRO.getSize() << "," << MRO.getAlignment() << ") ["; 742 743 if (!V) 744 OS << "<unknown>"; 745 else if (!V->getName().empty()) 746 OS << V->getName(); 747 else if (isa<PseudoSourceValue>(V)) 748 OS << *V; 749 else 750 OS << V; 751 752 OS << " + " << MRO.getOffset() << "]"; 753 } 754 } 755 756 OS << "\n"; 757 } 758 759 bool MachineInstr::addRegisterKilled(unsigned IncomingReg, 760 const TargetRegisterInfo *RegInfo, 761 bool AddIfNotFound) { 762 bool isPhysReg = TargetRegisterInfo::isPhysicalRegister(IncomingReg); 763 bool hasAliases = isPhysReg && RegInfo->getAliasSet(IncomingReg); 764 SmallVector<unsigned,4> DeadOps; 765 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 766 MachineOperand &MO = getOperand(i); 767 if (!MO.isRegister() || !MO.isUse()) 768 continue; 769 unsigned Reg = MO.getReg(); 770 if (!Reg) 771 continue; 772 773 if (Reg == IncomingReg) { 774 MO.setIsKill(); 775 return true; 776 } 777 if (hasAliases && MO.isKill() && 778 TargetRegisterInfo::isPhysicalRegister(Reg)) { 779 // A super-register kill already exists. 780 if (RegInfo->isSuperRegister(IncomingReg, Reg)) 781 return true; 782 if (RegInfo->isSubRegister(IncomingReg, Reg)) 783 DeadOps.push_back(i); 784 } 785 } 786 787 // Trim unneeded kill operands. 788 while (!DeadOps.empty()) { 789 unsigned OpIdx = DeadOps.back(); 790 if (getOperand(OpIdx).isImplicit()) 791 RemoveOperand(OpIdx); 792 else 793 getOperand(OpIdx).setIsKill(false); 794 DeadOps.pop_back(); 795 } 796 797 // If not found, this means an alias of one of the operands is killed. Add a 798 // new implicit operand if required. 799 if (AddIfNotFound) { 800 addOperand(MachineOperand::CreateReg(IncomingReg, 801 false /*IsDef*/, 802 true /*IsImp*/, 803 true /*IsKill*/)); 804 return true; 805 } 806 return false; 807 } 808 809 bool MachineInstr::addRegisterDead(unsigned IncomingReg, 810 const TargetRegisterInfo *RegInfo, 811 bool AddIfNotFound) { 812 bool isPhysReg = TargetRegisterInfo::isPhysicalRegister(IncomingReg); 813 bool hasAliases = isPhysReg && RegInfo->getAliasSet(IncomingReg); 814 SmallVector<unsigned,4> DeadOps; 815 for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 816 MachineOperand &MO = getOperand(i); 817 if (!MO.isRegister() || !MO.isDef()) 818 continue; 819 unsigned Reg = MO.getReg(); 820 if (Reg == IncomingReg) { 821 MO.setIsDead(); 822 return true; 823 } 824 if (hasAliases && MO.isDead() && 825 TargetRegisterInfo::isPhysicalRegister(Reg)) { 826 // There exists a super-register that's marked dead. 827 if (RegInfo->isSuperRegister(IncomingReg, Reg)) 828 return true; 829 if (RegInfo->isSubRegister(IncomingReg, Reg)) 830 DeadOps.push_back(i); 831 } 832 } 833 834 // Trim unneeded dead operands. 835 while (!DeadOps.empty()) { 836 unsigned OpIdx = DeadOps.back(); 837 if (getOperand(OpIdx).isImplicit()) 838 RemoveOperand(OpIdx); 839 else 840 getOperand(OpIdx).setIsDead(false); 841 DeadOps.pop_back(); 842 } 843 844 // If not found, this means an alias of one of the operand is dead. Add a 845 // new implicit operand. 846 if (AddIfNotFound) { 847 addOperand(MachineOperand::CreateReg(IncomingReg, true/*IsDef*/, 848 true/*IsImp*/,false/*IsKill*/, 849 true/*IsDead*/)); 850 return true; 851 } 852 return false; 853 } 854