MachineInstr.cpp revision f20c1a497fe3922ac718429d65a5fe396890575e
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===// 2edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 921326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// 1021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// Methods common to all machine instructions. 1121326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke// 12035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===----------------------------------------------------------------------===// 1370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 14822b4fb896846b87dd11a330ae13f2239329aeefChris Lattner#include "llvm/CodeGen/MachineInstr.h" 1584bc5427d6883f73cfeae3da640acd011d35c006Chris Lattner#include "llvm/Value.h" 168517e1f0beea9b5e47974f083396d53294c390adChris Lattner#include "llvm/CodeGen/MachineFunction.h" 171049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner#include "llvm/Target/TargetMachine.h" 183501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h" 192a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner#include "llvm/Target/MRegisterInfo.h" 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#include "llvm/Support/LeakDetector.h" 21a09362eb975730ac624c0bd210a95655ee105296Bill Wendling#include "llvm/Support/Streams.h" 22c21c5eeb4f56f160e79522df2d3aab5cfe73c05dJeff Cohen#include <ostream> 230742b59913a7760eb26f08121cd244a37e83e3b3Chris Lattnerusing namespace llvm; 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner//===----------------------------------------------------------------------===// 26f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner// MachineOperand Implementation 27f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner//===----------------------------------------------------------------------===// 28f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 29f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner/// isIdenticalTo - Return true if this operand is identical to the specified 30f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner/// operand. 31f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattnerbool MachineOperand::isIdenticalTo(const MachineOperand &Other) const { 32f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (getType() != Other.getType()) return false; 33f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 34f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner switch (getType()) { 35f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner default: assert(0 && "Unrecognized operand type"); 36f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_Register: 37f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner return getReg() == Other.getReg() && isDef() == Other.isDef() && 38f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner getSubReg() == Other.getSubReg(); 39f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_Immediate: 40f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner return getImm() == Other.getImm(); 41f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_MachineBasicBlock: 42f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner return getMBB() == Other.getMBB(); 43f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_FrameIndex: 448aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner return getIndex() == Other.getIndex(); 45f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_ConstantPoolIndex: 468aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner return getIndex() == Other.getIndex() && getOffset() == Other.getOffset(); 47f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_JumpTableIndex: 488aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner return getIndex() == Other.getIndex(); 49f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_GlobalAddress: 50f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner return getGlobal() == Other.getGlobal() && getOffset() == Other.getOffset(); 51f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_ExternalSymbol: 52f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner return !strcmp(getSymbolName(), Other.getSymbolName()) && 53f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner getOffset() == Other.getOffset(); 54f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 55f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner} 56f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 57f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner/// print - Print the specified machine operand. 58f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner/// 59f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattnervoid MachineOperand::print(std::ostream &OS, const TargetMachine *TM) const { 60f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner switch (getType()) { 61f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_Register: 62f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (getReg() == 0 || MRegisterInfo::isVirtualRegister(getReg())) { 63f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << "%reg" << getReg(); 64f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } else { 65f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner // If the instruction is embedded into a basic block, we can find the 66f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner // target 67f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner // info for the instruction. 68f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (TM == 0) 69f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (const MachineInstr *MI = getParent()) 70f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (const MachineBasicBlock *MBB = MI->getParent()) 71f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (const MachineFunction *MF = MBB->getParent()) 72f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner TM = &MF->getTarget(); 73f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 74f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (TM) 75f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << "%" << TM->getRegisterInfo()->get(getReg()).Name; 76f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner else 77f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << "%mreg" << getReg(); 78f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 79f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 80f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (isDef() || isKill() || isDead() || isImplicit()) { 81f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << "<"; 82f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner bool NeedComma = false; 83f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (isImplicit()) { 84f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << (isDef() ? "imp-def" : "imp-use"); 85f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner NeedComma = true; 86f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } else if (isDef()) { 87f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << "def"; 88f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner NeedComma = true; 89f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 90f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (isKill() || isDead()) { 91f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (NeedComma) OS << ","; 92f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (isKill()) OS << "kill"; 93f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (isDead()) OS << "dead"; 94f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 95f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << ">"; 96f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 97f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner break; 98f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_Immediate: 99f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << getImm(); 100f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner break; 101f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_MachineBasicBlock: 102f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << "mbb<" 1038aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner << ((Value*)getMBB()->getBasicBlock())->getName() 1048aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner << "," << (void*)getMBB() << ">"; 105f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner break; 106f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_FrameIndex: 1078aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner OS << "<fi#" << getIndex() << ">"; 108f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner break; 109f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_ConstantPoolIndex: 1108aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner OS << "<cp#" << getIndex(); 111f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (getOffset()) OS << "+" << getOffset(); 112f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << ">"; 113f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner break; 114f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_JumpTableIndex: 1158aa797aa51cd4ea1ec6f46f4891a6897944b75b2Chris Lattner OS << "<jt#" << getIndex() << ">"; 116f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner break; 117f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_GlobalAddress: 118f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << "<ga:" << ((Value*)getGlobal())->getName(); 119f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (getOffset()) OS << "+" << getOffset(); 120f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << ">"; 121f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner break; 122f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner case MachineOperand::MO_ExternalSymbol: 123f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << "<es:" << getSymbolName(); 124f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner if (getOffset()) OS << "+" << getOffset(); 125f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner OS << ">"; 126f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner break; 127f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner default: 128f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner assert(0 && "Unrecognized operand type"); 129f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner } 130f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner} 131f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 132f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner//===----------------------------------------------------------------------===// 133f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner// MachineInstr Implementation 134f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner//===----------------------------------------------------------------------===// 135f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner 136c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// MachineInstr ctor - This constructor creates a dummy MachineInstr with 13767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng/// TID NULL and no operands. 138c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan ChengMachineInstr::MachineInstr() 139f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner : TID(0), NumImplicitOps(0), Parent(0) { 140aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 141aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 1427279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner} 1437279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner 14467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Chengvoid MachineInstr::addImplicitDefUseOperands() { 14567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID->ImplicitDefs) 146a4161ee99478e7f8f9e33481e1c0dc79f0b4bd7dChris Lattner for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs) 1478019f41c0b7fda031d494e3900eada7d4e494772Chris Lattner addOperand(MachineOperand::CreateReg(*ImpDefs, true, true)); 14867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID->ImplicitUses) 149a4161ee99478e7f8f9e33481e1c0dc79f0b4bd7dChris Lattner for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses) 1508019f41c0b7fda031d494e3900eada7d4e494772Chris Lattner addOperand(MachineOperand::CreateReg(*ImpUses, false, true)); 151d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng} 152d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng 153d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng/// MachineInstr ctor - This constructor create a MachineInstr and add the 154c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// implicit operands. It reserves space for number of operands specified by 155c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// TargetInstrDescriptor or the numOperands if it is not zero. (for 156c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// instructions with variable number of operands). 157fa9457276a2174aaf302240dd32d89900ad021aeEvan ChengMachineInstr::MachineInstr(const TargetInstrDescriptor &tid, bool NoImp) 158f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner : TID(&tid), NumImplicitOps(0), Parent(0) { 159fa9457276a2174aaf302240dd32d89900ad021aeEvan Cheng if (!NoImp && TID->ImplicitDefs) 16067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs) 161d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NumImplicitOps++; 162fa9457276a2174aaf302240dd32d89900ad021aeEvan Cheng if (!NoImp && TID->ImplicitUses) 16367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses) 164d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NumImplicitOps++; 16567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng Operands.reserve(NumImplicitOps + TID->numOperands); 166fa9457276a2174aaf302240dd32d89900ad021aeEvan Cheng if (!NoImp) 167fa9457276a2174aaf302240dd32d89900ad021aeEvan Cheng addImplicitDefUseOperands(); 168d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng // Make sure that we get added to a machine basicblock 169d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng LeakDetector::addGarbageObject(this); 170d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng} 171d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng 172ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the 173ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block. 174ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 175c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan ChengMachineInstr::MachineInstr(MachineBasicBlock *MBB, 17667f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng const TargetInstrDescriptor &tid) 177f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner : TID(&tid), NumImplicitOps(0), Parent(0) { 178ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner assert(MBB && "Cannot use inserting ctor with null basic block!"); 17967f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID->ImplicitDefs) 18067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng for (const unsigned *ImpDefs = TID->ImplicitDefs; *ImpDefs; ++ImpDefs) 181d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NumImplicitOps++; 18267f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if (TID->ImplicitUses) 18367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng for (const unsigned *ImpUses = TID->ImplicitUses; *ImpUses; ++ImpUses) 184d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng NumImplicitOps++; 18567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng Operands.reserve(NumImplicitOps + TID->numOperands); 18667f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng addImplicitDefUseOperands(); 187aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos // Make sure that we get added to a machine basicblock 188aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::addGarbageObject(this); 189ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner MBB->push_back(this); // Add instruction to end of basic block! 190ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner} 191ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner 192ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// MachineInstr ctor - Copies MachineInstr arg exactly 193ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman/// 194466b534a570f574ed485d875bbca8454f68dcb52Tanya LattnerMachineInstr::MachineInstr(const MachineInstr &MI) { 19567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng TID = MI.getInstrDescriptor(); 1966b2c05f3d3c7b44183c629485ade10c18b86828dEvan Cheng NumImplicitOps = MI.NumImplicitOps; 197943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner Operands.reserve(MI.getNumOperands()); 198b5159ed0cb7943e5938782f7693beb18342165ceTanya Lattner 199ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // Add operands 200e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner for (unsigned i = 0; i != MI.getNumOperands(); ++i) { 201943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner Operands.push_back(MI.getOperand(i)); 202e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner Operands.back().ParentMI = this; 203e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner } 2040c63e03e04d3982e1913479bba404c3debc9a27eTanya Lattner 205ce22e76996d3ff0930716fa60c29df60a7e0481bMisha Brukman // Set parent, next, and prev to null 206f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner Parent = 0; 207f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner Prev = 0; 208f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner Next = 0; 209466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner} 210466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner 211466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner 212ce22e76996d3ff0930716fa60c29df60a7e0481bMisha BrukmanMachineInstr::~MachineInstr() { 213aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos LeakDetector::removeGarbageObject(this); 214e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner#ifndef NDEBUG 215e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner for (unsigned i = 0, e = Operands.size(); i != e; ++i) 216e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner assert(Operands[i].ParentMI == this && "ParentMI mismatch!"); 217e12d6abfdfc5141b2001f0c369a0e1525315b9c0Chris Lattner#endif 218aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos} 219aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 22067f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng/// getOpcode - Returns the opcode of this MachineInstr. 22167f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng/// 222cb648f90a26eb05ae8d508d500ca12881df50824Dan Gohmanint MachineInstr::getOpcode() const { 22367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng return TID->Opcode; 22467f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng} 22567f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng 22648d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// removeFromParent - This method unlinks 'this' from the containing basic 22748d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner/// block, and returns it, but does not delete it. 22848d7c069c76882475c23de153bda9483cd3c9bb4Chris LattnerMachineInstr *MachineInstr::removeFromParent() { 22948d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner assert(getParent() && "Not embedded in a basic block!"); 23048d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner getParent()->remove(this); 23148d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner return this; 23248d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner} 23348d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner 23448d7c069c76882475c23de153bda9483cd3c9bb4Chris Lattner 23521326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// OperandComplete - Return true if it's illegal to add a new operand 23621326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaeke/// 2372a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const { 23867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng unsigned short NumOperands = TID->numOperands; 23967f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng if ((TID->Flags & M_VARIABLE_OPS) == 0 && 2408bcb042f22f06d034f18aee8cb5dd0a04745fd97Evan Cheng getNumOperands()-NumImplicitOps >= NumOperands) 2413497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve return true; // Broken: we have all the operands of this instruction! 242413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return false; 24370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 24470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 24519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng/// getNumExplicitOperands - Returns the number of non-implicit operands. 24619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng/// 24719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Chengunsigned MachineInstr::getNumExplicitOperands() const { 24819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng unsigned NumOperands = TID->numOperands; 24919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if ((TID->Flags & M_VARIABLE_OPS) == 0) 25019e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng return NumOperands; 25119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 25219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng for (unsigned e = getNumOperands(); NumOperands != e; ++NumOperands) { 25319e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng const MachineOperand &MO = getOperand(NumOperands); 25419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if (!MO.isRegister() || !MO.isImplicit()) 25519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng NumOperands++; 25619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 25719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng return NumOperands; 25819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng} 25919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 2608ace2cd034be10c09be51daf08c3dda327f54262Chris Lattner 261faa510726f4b40aa4495e60e4d341c6467e3fb01Evan Cheng/// findRegisterUseOperandIdx() - Returns the MachineOperand that is a use of 26232eb1f1ca4220d2f24916e587ad7e8574d7d82a1Evan Cheng/// the specific register or -1 if it is not found. It further tightening 26376d7e76c15c258ec4a71fd75a2a32bca3a5e5e27Evan Cheng/// the search criteria to a use that kills the register if isKill is true. 264f277ee4be7edabb759a7f78138b693d72d0c263fEvan Chengint MachineInstr::findRegisterUseOperandIdx(unsigned Reg, bool isKill) const { 265576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 266f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng const MachineOperand &MO = getOperand(i); 26792dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman if (MO.isRegister() && MO.isUse() && MO.getReg() == Reg) 26876d7e76c15c258ec4a71fd75a2a32bca3a5e5e27Evan Cheng if (!isKill || MO.isKill()) 26932eb1f1ca4220d2f24916e587ad7e8574d7d82a1Evan Cheng return i; 270b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng } 27132eb1f1ca4220d2f24916e587ad7e8574d7d82a1Evan Cheng return -1; 272b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng} 273b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng 274b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng/// findRegisterDefOperand() - Returns the MachineOperand that is a def of 275b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng/// the specific register or NULL if it is not found. 276b371f457b0ea4a652a9f526ba4375c80ae542252Evan ChengMachineOperand *MachineInstr::findRegisterDefOperand(unsigned Reg) { 277b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 278b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng MachineOperand &MO = getOperand(i); 27992dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman if (MO.isRegister() && MO.isDef() && MO.getReg() == Reg) 280576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng return &MO; 281576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng } 282576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng return NULL; 283576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng} 28419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 285f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng/// findFirstPredOperandIdx() - Find the index of the first operand in the 286f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng/// operand list that is used to represent the predicate. It returns -1 if 287f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng/// none is found. 288f277ee4be7edabb759a7f78138b693d72d0c263fEvan Chengint MachineInstr::findFirstPredOperandIdx() const { 28919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng const TargetInstrDescriptor *TID = getInstrDescriptor(); 290c3a289c4b5a60a204363ba4ae9f017ba87b714f9Evan Cheng if (TID->Flags & M_PREDICABLE) { 29119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng for (unsigned i = 0, e = getNumOperands(); i != e; ++i) 29219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if ((TID->OpInfo[i].Flags & M_PREDICATE_OPERAND)) 293f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng return i; 29419e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 29519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 296f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng return -1; 29719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng} 298576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng 29932dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng/// isRegReDefinedByTwoAddr - Returns true if the Reg re-definition is due 30032dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng/// to two addr elimination. 30132dfbeada7292167bb488f36a71a5a6a519ddaffEvan Chengbool MachineInstr::isRegReDefinedByTwoAddr(unsigned Reg) const { 30232dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng const TargetInstrDescriptor *TID = getInstrDescriptor(); 30332dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { 30432dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng const MachineOperand &MO1 = getOperand(i); 30532dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng if (MO1.isRegister() && MO1.isDef() && MO1.getReg() == Reg) { 30632dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng for (unsigned j = i+1; j < e; ++j) { 30732dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng const MachineOperand &MO2 = getOperand(j); 30832dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng if (MO2.isRegister() && MO2.isUse() && MO2.getReg() == Reg && 30932dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng TID->getOperandConstraint(j, TOI::TIED_TO) == (int)i) 31032dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng return true; 31132dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng } 31232dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng } 31332dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng } 31432dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng return false; 31532dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng} 31632dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng 317576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// copyKillDeadInfo - Copies kill / dead operand properties from MI. 318576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng/// 319576d123e130a8291669dd2384a3735cc4933fd00Evan Chengvoid MachineInstr::copyKillDeadInfo(const MachineInstr *MI) { 320576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 321576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng const MachineOperand &MO = MI->getOperand(i); 32292dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman if (!MO.isRegister() || (!MO.isKill() && !MO.isDead())) 323576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng continue; 324576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng for (unsigned j = 0, ee = getNumOperands(); j != ee; ++j) { 325576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MachineOperand &MOp = getOperand(j); 326576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng if (!MOp.isIdenticalTo(MO)) 327576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng continue; 328576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng if (MO.isKill()) 329576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MOp.setIsKill(); 330576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng else 331576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng MOp.setIsDead(); 332576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng break; 333576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng } 334576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng } 335576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng} 336576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng 33719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng/// copyPredicates - Copies predicate operand(s) from MI. 33819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Chengvoid MachineInstr::copyPredicates(const MachineInstr *MI) { 33919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng const TargetInstrDescriptor *TID = MI->getInstrDescriptor(); 340c3a289c4b5a60a204363ba4ae9f017ba87b714f9Evan Cheng if (TID->Flags & M_PREDICABLE) { 34119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 34219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng if ((TID->OpInfo[i].Flags & M_PREDICATE_OPERAND)) { 34319e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng // Predicated operands must be last operands. 3448019f41c0b7fda031d494e3900eada7d4e494772Chris Lattner addOperand(MI->getOperand(i)); 34519e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 34619e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 34719e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng } 34819e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng} 34919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 35021326fc2ad47ee7e73a8c0b03a4a0cc0b0a0c4e8Brian Gaekevoid MachineInstr::dump() const { 351e81561909d128c6e2d8033cb5465a49b2596b26aBill Wendling cerr << " " << *this; 35270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 35370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 354b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const { 355e3087890ac7f2fcf4697f8e09091e9a384311b9cChris Lattner // Specialize printing if op#0 is definition 3566a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner unsigned StartOp = 0; 35792dfe2001e96f6e2b6d327e8816f38033f88b295Dan Gohman if (getNumOperands() && getOperand(0).isRegister() && getOperand(0).isDef()) { 358f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner getOperand(0).print(OS, TM); 3596a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " = "; 3606a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner ++StartOp; // Don't print this operand again! 3616a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner } 362b140762a45d21aaed054f15adaff0fc2274d939dTanya Lattner 363e3087890ac7f2fcf4697f8e09091e9a384311b9cChris Lattner OS << getInstrDescriptor()->Name; 364edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 3656a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { 3666a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner if (i != StartOp) 3676a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << ","; 3686a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " "; 369f73823000e2d5d6e1cf65bdf5a107297e18d35fbChris Lattner getOperand(i).print(OS, TM); 3701049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 371edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman 3721049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\n"; 3731049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 3741049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 375