MachineInstr.h revision 1251443929a256c833717e1030c368d3b6e4cb7c
148486893f46d2e12e926682a3ecb908716bc66c4Chris Lattner//===-- llvm/CodeGen/MachineInstr.h - MachineInstr class --------*- C++ -*-===// 2ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 7ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 9a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner// 10a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner// This file contains the declaration of the MachineInstr class, which is the 11ef6a6a69ff1e1b709d0acb315b9f6c926c67a778Misha Brukman// basic representation for all target dependent machine instructions used by 12a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner// the back end. 13a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner// 14a730c864227b287cdfad5f5f3d5d0808c9f422bbChris Lattner//===----------------------------------------------------------------------===// 1523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 1623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve#ifndef LLVM_CODEGEN_MACHINEINSTR_H 1723ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve#define LLVM_CODEGEN_MACHINEINSTR_H 1823ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 19fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/ADT/ilist.h" 20fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/ADT/ilist_node.h" 21fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman#include "llvm/ADT/STLExtras.h" 221251443929a256c833717e1030c368d3b6e4cb7cDavid Greene#include "llvm/CodeGen/AsmPrinter.h" 23103a64318bb716d68a4248996466900411d789beChris Lattner#include "llvm/CodeGen/MachineOperand.h" 2479e6ed9d4733ef6bfaf6e6ae71a013c8b226b7c9Owen Anderson#include "llvm/Target/TargetInstrDesc.h" 251e86a66b00b94adc4ad6977ef6b47c516ac62cecDevang Patel#include "llvm/Support/DebugLoc.h" 261baa88e3de8947b02d9ef4caa73e5860f048ec6eDan Gohman#include <vector> 27be583b914d8156b99d3da264d5adca37fee8dbc9John Criswell 28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 29d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 30e33f44cfc547359bc28526e4c5e1852b600b4448Dan Gohmanclass AliasAnalysis; 31749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattnerclass TargetInstrDesc; 32b27087f5aa574f875598f4a309b7dd687c64a455Evan Chengclass TargetInstrInfo; 336f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohmanclass TargetRegisterInfo; 348e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanclass MachineFunction; 35c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohmanclass MachineMemOperand; 36c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos 37b05497e0ca1ba2e7f57b792cc160e5d1c8579582Chris Lattner//===----------------------------------------------------------------------===// 388b915b4ed2c6e43413937ac71c0cbcf476ad1a98Chris Lattner/// MachineInstr - Representation of each machine instruction. 398b915b4ed2c6e43413937ac71c0cbcf476ad1a98Chris Lattner/// 40fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohmanclass MachineInstr : public ilist_node<MachineInstr> { 41c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohmanpublic: 42c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman typedef MachineMemOperand **mmo_iterator; 43c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman 44c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohmanprivate: 45749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner const TargetInstrDesc *TID; // Instruction descriptor. 46c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng unsigned short NumImplicitOps; // Number of implicit operands (which 479a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng // are determined at construction time). 489a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng 491251443929a256c833717e1030c368d3b6e4cb7cDavid Greene unsigned short AsmPrinterFlags; // Various bits of information used by 501251443929a256c833717e1030c368d3b6e4cb7cDavid Greene // the AsmPrinter to emit helpful 511251443929a256c833717e1030c368d3b6e4cb7cDavid Greene // comments. This is *not* semantic 521251443929a256c833717e1030c368d3b6e4cb7cDavid Greene // information. Do not use this for 531251443929a256c833717e1030c368d3b6e4cb7cDavid Greene // anything other than to convey comment 541251443929a256c833717e1030c368d3b6e4cb7cDavid Greene // information to AsmPrinter. 551251443929a256c833717e1030c368d3b6e4cb7cDavid Greene 56943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner std::vector<MachineOperand> Operands; // the operands 57c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman mmo_iterator MemRefs; // information on memory references 58c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman mmo_iterator MemRefsEnd; 59f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner MachineBasicBlock *Parent; // Pointer to the owning basic block. 6006efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen DebugLoc debugLoc; // Source line information. 61c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke 62413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner // OperandComplete - Return true if it's illegal to add a new operand 63413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner bool OperandsComplete() const; 64a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 658e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman MachineInstr(const MachineInstr&); // DO NOT IMPLEMENT 669452b0797a80001920576d7e2ef4af05242cba69Chris Lattner void operator=(const MachineInstr&); // DO NOT IMPLEMENT 67c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos 68c0b9dc5be79f009d260edb5cd5e1d8346587aaa2Alkis Evlogimenos // Intrusive list support 69fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman friend struct ilist_traits<MachineInstr>; 70fed90b6d097d50881afb45e4d79f430db66dd741Dan Gohman friend struct ilist_traits<MachineBasicBlock>; 71f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner void setParent(MachineBasicBlock *P) { Parent = P; } 728e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman 738e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman /// MachineInstr ctor - This constructor creates a copy of the given 748e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman /// MachineInstr in the given MachineFunction. 758e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman MachineInstr(MachineFunction &, const MachineInstr &); 768e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman 77c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng /// MachineInstr ctor - This constructor creates a dummy MachineInstr with 7867f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng /// TID NULL and no operands. 79c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng MachineInstr(); 80e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve 8106efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen // The next two constructors have DebugLoc and non-DebugLoc versions; 8206efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen // over time, the non-DebugLoc versions should be phased out and eventually 8306efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen // removed. 8406efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen 85d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng /// MachineInstr ctor - This constructor create a MachineInstr and add the 86a4161ee99478e7f8f9e33481e1c0dc79f0b4bd7dChris Lattner /// implicit operands. It reserves space for number of operands specified by 8706efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// TargetInstrDesc. The version with a DebugLoc should be preferred. 88749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner explicit MachineInstr(const TargetInstrDesc &TID, bool NoImp = false); 89d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng 907db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner /// MachineInstr ctor - Work exactly the same as the ctor above, except that 917db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner /// the MachineInstr is created and added to the end of the specified basic 9206efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// block. The version with a DebugLoc should be preferred. 937db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner /// 94749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner MachineInstr(MachineBasicBlock *MBB, const TargetInstrDesc &TID); 95ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 9606efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// MachineInstr ctor - This constructor create a MachineInstr and add the 9706efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// implicit operands. It reserves space for number of operands specified by 9806efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// TargetInstrDesc. An explicit DebugLoc is supplied. 9906efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen explicit MachineInstr(const TargetInstrDesc &TID, const DebugLoc dl, 10006efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen bool NoImp = false); 10106efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen 10206efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// MachineInstr ctor - Work exactly the same as the ctor above, except that 10306efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// the MachineInstr is created and added to the end of the specified basic 10406efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// block. 10506efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// 10606efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen MachineInstr(MachineBasicBlock *MBB, const DebugLoc dl, 10706efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen const TargetInstrDesc &TID); 10806efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen 109aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos ~MachineInstr(); 110aad5c0505183a5b7913f1a443a1f0650122551ccAlkis Evlogimenos 1118e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman // MachineInstrs are pool-allocated and owned by MachineFunction. 1128e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman friend class MachineFunction; 1138e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman 1148e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmanpublic: 115f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner const MachineBasicBlock* getParent() const { return Parent; } 116f20c1a497fe3922ac718429d65a5fe396890575eChris Lattner MachineBasicBlock* getParent() { return Parent; } 11706efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen 1181251443929a256c833717e1030c368d3b6e4cb7cDavid Greene /// getAsmPrinterFlags - Return the asm printer flags bitvector. 1191251443929a256c833717e1030c368d3b6e4cb7cDavid Greene /// 1201251443929a256c833717e1030c368d3b6e4cb7cDavid Greene unsigned short getAsmPrinterFlags() const { return AsmPrinterFlags; } 1211251443929a256c833717e1030c368d3b6e4cb7cDavid Greene 1221251443929a256c833717e1030c368d3b6e4cb7cDavid Greene /// getAsmPrinterFlag - Return whether an AsmPrinter flag is set. 1231251443929a256c833717e1030c368d3b6e4cb7cDavid Greene /// 1241251443929a256c833717e1030c368d3b6e4cb7cDavid Greene bool getAsmPrinterFlag(AsmPrinter::CommentFlag Flag) const { 1251251443929a256c833717e1030c368d3b6e4cb7cDavid Greene return AsmPrinterFlags & Flag; 1261251443929a256c833717e1030c368d3b6e4cb7cDavid Greene } 1271251443929a256c833717e1030c368d3b6e4cb7cDavid Greene 1281251443929a256c833717e1030c368d3b6e4cb7cDavid Greene /// setAsmPrinterFlag - Set a flag for the AsmPrinter. 1291251443929a256c833717e1030c368d3b6e4cb7cDavid Greene /// 1301251443929a256c833717e1030c368d3b6e4cb7cDavid Greene void setAsmPrinterFlag(unsigned short Flag) { 1311251443929a256c833717e1030c368d3b6e4cb7cDavid Greene AsmPrinterFlags |= Flag; 1321251443929a256c833717e1030c368d3b6e4cb7cDavid Greene } 1331251443929a256c833717e1030c368d3b6e4cb7cDavid Greene 13406efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// getDebugLoc - Returns the debug location id of this MachineInstr. 13506efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// 136d5fb7906130989a579d1bfe4490b414331e94feeChris Lattner DebugLoc getDebugLoc() const { return debugLoc; } 13767f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng 13869244300b8a0112efb44b6273ecea4ca6264b8cfChris Lattner /// getDesc - Returns the target instruction descriptor of this 13967f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng /// MachineInstr. 140749c6f6b5ed301c84aac562e414486549d7b98ebChris Lattner const TargetInstrDesc &getDesc() const { return *TID; } 141ab8672c8bb83e722b856eac67863542ea7e0cbb2Alkis Evlogimenos 142c54839573cd9ffa6af33dc5190cc40d498534585Brian Gaeke /// getOpcode - Returns the opcode of this MachineInstr. 143cd0b3a90aa34bd42d75d8d86f74ca4972145781dBrian Gaeke /// 14479e6ed9d4733ef6bfaf6e6ae71a013c8b226b7c9Owen Anderson int getOpcode() const { return TID->Opcode; } 1459f495b54fa94dba4e0be59ba9736c7cf18d996d9Vikram S. Adve 146cd0b3a90aa34bd42d75d8d86f74ca4972145781dBrian Gaeke /// Access to explicit operands of the instruction. 147cd0b3a90aa34bd42d75d8d86f74ca4972145781dBrian Gaeke /// 14834cd4a484e532cc463fd5a4bf59b88d13c5467c1Evan Cheng unsigned getNumOperands() const { return (unsigned)Operands.size(); } 149ea61c358720aa6c7a159d51658b34276316aa841Misha Brukman 150572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner const MachineOperand& getOperand(unsigned i) const { 151a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands() && "getOperand() out of range!"); 152943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner return Operands[i]; 153572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner } 154572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner MachineOperand& getOperand(unsigned i) { 155a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands() && "getOperand() out of range!"); 156943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattner return Operands[i]; 157572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner } 1586d6c3f86186333037f2fd3fb001e8b2998c080d9Chris Lattner 15919e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng /// getNumExplicitOperands - Returns the number of non-implicit operands. 16019e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng /// 16119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng unsigned getNumExplicitOperands() const; 162fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner 16369de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman /// Access to memory operands of the instruction 164c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman mmo_iterator memoperands_begin() const { return MemRefs; } 165c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman mmo_iterator memoperands_end() const { return MemRefsEnd; } 166c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman bool memoperands_empty() const { return MemRefsEnd == MemRefs; } 16769de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman 168cddc11e7570893233af8e84dfb8e7f0f9ab0090dDan Gohman /// hasOneMemOperand - Return true if this instruction has exactly one 169cddc11e7570893233af8e84dfb8e7f0f9ab0090dDan Gohman /// MachineMemOperand. 170cddc11e7570893233af8e84dfb8e7f0f9ab0090dDan Gohman bool hasOneMemOperand() const { 171c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman return MemRefsEnd - MemRefs == 1; 172cddc11e7570893233af8e84dfb8e7f0f9ab0090dDan Gohman } 173cddc11e7570893233af8e84dfb8e7f0f9ab0090dDan Gohman 174fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner /// isIdenticalTo - Return true if this instruction is identical to (same 175fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner /// opcode and same operands as) the specified instruction. 176fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner bool isIdenticalTo(const MachineInstr *Other) const { 177fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner if (Other->getOpcode() != getOpcode() || 178846c1b49365be588b5aaddd02916e46c2422ae6fChris Lattner Other->getNumOperands() != getNumOperands()) 179fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner return false; 180fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner for (unsigned i = 0, e = getNumOperands(); i != e; ++i) 181fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner if (!getOperand(i).isIdenticalTo(Other->getOperand(i))) 182fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner return false; 183fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner return true; 184fcfcb6cb502fd4562b57425a5802dc52f358c451Chris Lattner } 185a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve 1866b560918426182d2b46b899d609911d49f6739f7Chris Lattner /// removeFromParent - This method unlinks 'this' from the containing basic 1876b560918426182d2b46b899d609911d49f6739f7Chris Lattner /// block, and returns it, but does not delete it. 1886b560918426182d2b46b899d609911d49f6739f7Chris Lattner MachineInstr *removeFromParent(); 1896b560918426182d2b46b899d609911d49f6739f7Chris Lattner 1906b560918426182d2b46b899d609911d49f6739f7Chris Lattner /// eraseFromParent - This method unlinks 'this' from the containing basic 1916b560918426182d2b46b899d609911d49f6739f7Chris Lattner /// block and deletes it. 1928e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman void eraseFromParent(); 193466b534a570f574ed485d875bbca8454f68dcb52Tanya Lattner 1944406604047423576e36657c7ede266ca42e79642Dan Gohman /// isLabel - Returns true if the MachineInstr represents a label. 1954406604047423576e36657c7ede266ca42e79642Dan Gohman /// 1964406604047423576e36657c7ede266ca42e79642Dan Gohman bool isLabel() const; 1974406604047423576e36657c7ede266ca42e79642Dan Gohman 198bb81d97feb396a8bb21d074db1c57e9f66525f40Evan Cheng /// isDebugLabel - Returns true if the MachineInstr represents a debug label. 199bb81d97feb396a8bb21d074db1c57e9f66525f40Evan Cheng /// 200bb81d97feb396a8bb21d074db1c57e9f66525f40Evan Cheng bool isDebugLabel() const; 201bb81d97feb396a8bb21d074db1c57e9f66525f40Evan Cheng 2026130f66eaae89f8878590796977678afa8448926Evan Cheng /// readsRegister - Return true if the MachineInstr reads the specified 2036130f66eaae89f8878590796977678afa8448926Evan Cheng /// register. If TargetRegisterInfo is passed, then it also checks if there 2046130f66eaae89f8878590796977678afa8448926Evan Cheng /// is a read of a super-register. 2056130f66eaae89f8878590796977678afa8448926Evan Cheng bool readsRegister(unsigned Reg, const TargetRegisterInfo *TRI = NULL) const { 2066130f66eaae89f8878590796977678afa8448926Evan Cheng return findRegisterUseOperandIdx(Reg, false, TRI) != -1; 2076130f66eaae89f8878590796977678afa8448926Evan Cheng } 2086130f66eaae89f8878590796977678afa8448926Evan Cheng 2096130f66eaae89f8878590796977678afa8448926Evan Cheng /// killsRegister - Return true if the MachineInstr kills the specified 2106130f66eaae89f8878590796977678afa8448926Evan Cheng /// register. If TargetRegisterInfo is passed, then it also checks if there is 2116130f66eaae89f8878590796977678afa8448926Evan Cheng /// a kill of a super-register. 2126130f66eaae89f8878590796977678afa8448926Evan Cheng bool killsRegister(unsigned Reg, const TargetRegisterInfo *TRI = NULL) const { 2136130f66eaae89f8878590796977678afa8448926Evan Cheng return findRegisterUseOperandIdx(Reg, true, TRI) != -1; 2146130f66eaae89f8878590796977678afa8448926Evan Cheng } 2156130f66eaae89f8878590796977678afa8448926Evan Cheng 2166130f66eaae89f8878590796977678afa8448926Evan Cheng /// modifiesRegister - Return true if the MachineInstr modifies the 2176130f66eaae89f8878590796977678afa8448926Evan Cheng /// specified register. If TargetRegisterInfo is passed, then it also checks 2186130f66eaae89f8878590796977678afa8448926Evan Cheng /// if there is a def of a super-register. 2196130f66eaae89f8878590796977678afa8448926Evan Cheng bool modifiesRegister(unsigned Reg, 2206130f66eaae89f8878590796977678afa8448926Evan Cheng const TargetRegisterInfo *TRI = NULL) const { 2216130f66eaae89f8878590796977678afa8448926Evan Cheng return findRegisterDefOperandIdx(Reg, false, TRI) != -1; 2226130f66eaae89f8878590796977678afa8448926Evan Cheng } 2236130f66eaae89f8878590796977678afa8448926Evan Cheng 2246130f66eaae89f8878590796977678afa8448926Evan Cheng /// registerDefIsDead - Returns true if the register is dead in this machine 2256130f66eaae89f8878590796977678afa8448926Evan Cheng /// instruction. If TargetRegisterInfo is passed, then it also checks 2266130f66eaae89f8878590796977678afa8448926Evan Cheng /// if there is a dead def of a super-register. 2276130f66eaae89f8878590796977678afa8448926Evan Cheng bool registerDefIsDead(unsigned Reg, 2286130f66eaae89f8878590796977678afa8448926Evan Cheng const TargetRegisterInfo *TRI = NULL) const { 2296130f66eaae89f8878590796977678afa8448926Evan Cheng return findRegisterDefOperandIdx(Reg, true, TRI) != -1; 2306130f66eaae89f8878590796977678afa8448926Evan Cheng } 2316130f66eaae89f8878590796977678afa8448926Evan Cheng 232faa510726f4b40aa4495e60e4d341c6467e3fb01Evan Cheng /// findRegisterUseOperandIdx() - Returns the operand index that is a use of 23310f9101c4c0df0837414976ad0ef0e86d6771059Jim Grosbach /// the specific register or -1 if it is not found. It further tightens 23476d7e76c15c258ec4a71fd75a2a32bca3a5e5e27Evan Cheng /// the search criteria to a use that kills the register if isKill is true. 2356130f66eaae89f8878590796977678afa8448926Evan Cheng int findRegisterUseOperandIdx(unsigned Reg, bool isKill = false, 2366130f66eaae89f8878590796977678afa8448926Evan Cheng const TargetRegisterInfo *TRI = NULL) const; 2376130f66eaae89f8878590796977678afa8448926Evan Cheng 2386130f66eaae89f8878590796977678afa8448926Evan Cheng /// findRegisterUseOperand - Wrapper for findRegisterUseOperandIdx, it returns 2396130f66eaae89f8878590796977678afa8448926Evan Cheng /// a pointer to the MachineOperand rather than an index. 2409180c8e3cfd12abd21242768db05072a209ca6e7Evan Cheng MachineOperand *findRegisterUseOperand(unsigned Reg, bool isKill = false, 2416130f66eaae89f8878590796977678afa8448926Evan Cheng const TargetRegisterInfo *TRI = NULL) { 2426130f66eaae89f8878590796977678afa8448926Evan Cheng int Idx = findRegisterUseOperandIdx(Reg, isKill, TRI); 2436130f66eaae89f8878590796977678afa8448926Evan Cheng return (Idx == -1) ? NULL : &getOperand(Idx); 2446130f66eaae89f8878590796977678afa8448926Evan Cheng } 245576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng 2466130f66eaae89f8878590796977678afa8448926Evan Cheng /// findRegisterDefOperandIdx() - Returns the operand index that is a def of 247703bfe69092e8da79fbef2fc5ca07b805ad9f753Dan Gohman /// the specified register or -1 if it is not found. If isDead is true, defs 248703bfe69092e8da79fbef2fc5ca07b805ad9f753Dan Gohman /// that are not dead are skipped. If TargetRegisterInfo is non-null, then it 249703bfe69092e8da79fbef2fc5ca07b805ad9f753Dan Gohman /// also checks if there is a def of a super-register. 2506130f66eaae89f8878590796977678afa8448926Evan Cheng int findRegisterDefOperandIdx(unsigned Reg, bool isDead = false, 2516130f66eaae89f8878590796977678afa8448926Evan Cheng const TargetRegisterInfo *TRI = NULL) const; 2526130f66eaae89f8878590796977678afa8448926Evan Cheng 2536130f66eaae89f8878590796977678afa8448926Evan Cheng /// findRegisterDefOperand - Wrapper for findRegisterDefOperandIdx, it returns 2546130f66eaae89f8878590796977678afa8448926Evan Cheng /// a pointer to the MachineOperand rather than an index. 255631bd3cdf39eb099d5d5d279b17b08f119956538Evan Cheng MachineOperand *findRegisterDefOperand(unsigned Reg, bool isDead = false, 2566130f66eaae89f8878590796977678afa8448926Evan Cheng const TargetRegisterInfo *TRI = NULL) { 2576130f66eaae89f8878590796977678afa8448926Evan Cheng int Idx = findRegisterDefOperandIdx(Reg, isDead, TRI); 2586130f66eaae89f8878590796977678afa8448926Evan Cheng return (Idx == -1) ? NULL : &getOperand(Idx); 2596130f66eaae89f8878590796977678afa8448926Evan Cheng } 26019e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 261f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng /// findFirstPredOperandIdx() - Find the index of the first operand in the 262f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng /// operand list that is used to represent the predicate. It returns -1 if 263f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng /// none is found. 264f277ee4be7edabb759a7f78138b693d72d0c263fEvan Cheng int findFirstPredOperandIdx() const; 265b371f457b0ea4a652a9f526ba4375c80ae542252Evan Cheng 266d9df5017040489303acb57bdd8697ef0f8bafc08Bob Wilson /// isRegTiedToUseOperand - Given the index of a register def operand, 267d9df5017040489303acb57bdd8697ef0f8bafc08Bob Wilson /// check if the register def is tied to a source operand, due to either 268d9df5017040489303acb57bdd8697ef0f8bafc08Bob Wilson /// two-address elimination or inline assembly constraints. Returns the 269d9df5017040489303acb57bdd8697ef0f8bafc08Bob Wilson /// first tied use operand index by reference is UseOpIdx is not null. 270ce9be2cf5dc84865f6b819bd3f9be16944426268Jakob Stoklund Olesen bool isRegTiedToUseOperand(unsigned DefOpIdx, unsigned *UseOpIdx = 0) const; 27132dfbeada7292167bb488f36a71a5a6a519ddaffEvan Cheng 272a24752ff43dc1ad8c18c5d9e78549c45f62b980eEvan Cheng /// isRegTiedToDefOperand - Return true if the use operand of the specified 273a24752ff43dc1ad8c18c5d9e78549c45f62b980eEvan Cheng /// index is tied to an def operand. It also returns the def operand index by 274a24752ff43dc1ad8c18c5d9e78549c45f62b980eEvan Cheng /// reference if DefOpIdx is not null. 275ce9be2cf5dc84865f6b819bd3f9be16944426268Jakob Stoklund Olesen bool isRegTiedToDefOperand(unsigned UseOpIdx, unsigned *DefOpIdx = 0) const; 276a24752ff43dc1ad8c18c5d9e78549c45f62b980eEvan Cheng 2779a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng /// copyKillDeadInfo - Copies kill / dead operand properties from MI. 2789a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng /// 279576d123e130a8291669dd2384a3735cc4933fd00Evan Cheng void copyKillDeadInfo(const MachineInstr *MI); 2809a00279988612d0f960fb8d43e4ccfcab89e0e14Evan Cheng 28119e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng /// copyPredicates - Copies predicate operand(s) from MI. 28219e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng void copyPredicates(const MachineInstr *MI); 28319e3f31f6acd9f5ce3cdd8372d4cb598ed921f95Evan Cheng 284b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson /// addRegisterKilled - We have determined MI kills a register. Look for the 285b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson /// operand that uses it and mark it as IsKill. If AddIfNotFound is true, 286b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson /// add a implicit operand if it's not found. Returns true if the operand 287b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson /// exists / is added. 2886f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman bool addRegisterKilled(unsigned IncomingReg, 2896f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman const TargetRegisterInfo *RegInfo, 290b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson bool AddIfNotFound = false); 291b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson 292b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson /// addRegisterDead - We have determined MI defined a register without a use. 293b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson /// Look for the operand that defines it and mark it as IsDead. If 294b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson /// AddIfNotFound is true, add a implicit operand if it's not found. Returns 295b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson /// true if the operand exists / is added. 2966f0d024a534af18d9e60b3ea757376cd8a3a980eDan Gohman bool addRegisterDead(unsigned IncomingReg, const TargetRegisterInfo *RegInfo, 297b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson bool AddIfNotFound = false); 298b487e7215c4f70f3d98f8fbc0a11eb119afc1f37Owen Anderson 2999f1c8317a4676945b4961ddb9827ef2412551620Evan Cheng /// isSafeToMove - Return true if it is safe to move this instruction. If 3009f1c8317a4676945b4961ddb9827ef2412551620Evan Cheng /// SawStore is set to true, it means that there is a store (or call) between 3019f1c8317a4676945b4961ddb9827ef2412551620Evan Cheng /// the instruction's location and its intended destination. 302a70dca156fa76d452f54829b5c5f962ddfd94ef2Dan Gohman bool isSafeToMove(const TargetInstrInfo *TII, bool &SawStore, 303a70dca156fa76d452f54829b5c5f962ddfd94ef2Dan Gohman AliasAnalysis *AA) const; 304b27087f5aa574f875598f4a309b7dd687c64a455Evan Cheng 3053e4fb70c6af53a2d00e057a7e4a8f93eb2ff2112Dan Gohman /// isSafeToReMat - Return true if it's safe to rematerialize the specified 3063e4fb70c6af53a2d00e057a7e4a8f93eb2ff2112Dan Gohman /// instruction which defined the specified register instead of copying it. 307a70dca156fa76d452f54829b5c5f962ddfd94ef2Dan Gohman bool isSafeToReMat(const TargetInstrInfo *TII, unsigned DstReg, 308a70dca156fa76d452f54829b5c5f962ddfd94ef2Dan Gohman AliasAnalysis *AA) const; 309df3b99381f1c211071cc1daf0cc297666877bbcbEvan Cheng 3103e4fb70c6af53a2d00e057a7e4a8f93eb2ff2112Dan Gohman /// hasVolatileMemoryRef - Return true if this instruction may have a 3113e4fb70c6af53a2d00e057a7e4a8f93eb2ff2112Dan Gohman /// volatile memory reference, or if the information describing the 3123e4fb70c6af53a2d00e057a7e4a8f93eb2ff2112Dan Gohman /// memory reference is not available. Return false if it is known to 3133e4fb70c6af53a2d00e057a7e4a8f93eb2ff2112Dan Gohman /// have no volatile memory references. 3143e4fb70c6af53a2d00e057a7e4a8f93eb2ff2112Dan Gohman bool hasVolatileMemoryRef() const; 3153e4fb70c6af53a2d00e057a7e4a8f93eb2ff2112Dan Gohman 316e33f44cfc547359bc28526e4c5e1852b600b4448Dan Gohman /// isInvariantLoad - Return true if this instruction is loading from a 317e33f44cfc547359bc28526e4c5e1852b600b4448Dan Gohman /// location whose value is invariant across the function. For example, 318e33f44cfc547359bc28526e4c5e1852b600b4448Dan Gohman /// loading a value from the constant pool or from from the argument area of 319e33f44cfc547359bc28526e4c5e1852b600b4448Dan Gohman /// a function if it does not change. This should only return true of *all* 320e33f44cfc547359bc28526e4c5e1852b600b4448Dan Gohman /// loads the instruction does are invariant (if it does multiple loads). 321a70dca156fa76d452f54829b5c5f962ddfd94ef2Dan Gohman bool isInvariantLoad(AliasAnalysis *AA) const; 322e33f44cfc547359bc28526e4c5e1852b600b4448Dan Gohman 323a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve // 324a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve // Debugging support 325fa78fbf446b505767e838f9c188707183c57fc9cChris Lattner // 326cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson void print(raw_ostream &OS, const TargetMachine *TM = 0) const; 327572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner void dump() const; 3282f898d207466bf233b55607e404baca302bc7b5eChris Lattner 329413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner //===--------------------------------------------------------------------===// 33062ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner // Accessors used to build up machine instructions. 3317ad6be7b01a902f532eebb607306f7b3f4627718Chris Lattner 33262ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// addOperand - Add the specified operand to the instruction. If it is an 33362ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// implicit operand, it is added to the end of the operand list. If it is 33462ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// an explicit operand it is added at the end of the explicit operand list 33562ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// (before the first implicit operand). 33662ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner void addOperand(const MachineOperand &Op); 33762ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner 3385080f4d9919d39b367891dc51e739c571a66036cChris Lattner /// setDesc - Replace the instruction descriptor (thus opcode) of 33967f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng /// the current instruction with a new one. 3403c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// 3415080f4d9919d39b367891dc51e739c571a66036cChris Lattner void setDesc(const TargetInstrDesc &tid) { TID = &tid; } 3423c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner 34306efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// setDebugLoc - Replace current source information with new such. 344ab160cf371d6148d49b5401a903dd4ce381b2f8cDale Johannesen /// Avoid using this, the constructor argument is preferable. 34506efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen /// 34606efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen void setDebugLoc(const DebugLoc dl) { debugLoc = dl; } 34706efc02854a96a9f92edc3bf46b0451f488cf2e6Dale Johannesen 3483c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// RemoveOperand - Erase an operand from an instruction, leaving it with one 3493c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// fewer operand than it started with. 3503c8cbe6567c94fdd24ec9b2b8b5c5cc1b01a8c58Chris Lattner /// 35162ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner void RemoveOperand(unsigned i); 35262ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner 353c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// addMemOperand - Add a MachineMemOperand to the machine instruction. 354c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// This function should be used only occasionally. The setMemRefs function 355c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// is the primary method for setting up a MachineInstr's MemRefs list. 356c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman void addMemOperand(MachineFunction &MF, MachineMemOperand *MO); 3578e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohman 358c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// setMemRefs - Assign this MachineInstr's memory reference descriptor 359c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman /// list. This does not transfer ownership. 360c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman void setMemRefs(mmo_iterator NewMemRefs, mmo_iterator NewMemRefsEnd) { 361c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman MemRefs = NewMemRefs; 362c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman MemRefsEnd = NewMemRefsEnd; 363c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman } 36469de1932b350d7cdfc0ed1f4198d6f78c7822a02Dan Gohman 365943b5e117fe9a087f9aa529a2632c2d32cc22374Chris Lattnerprivate: 36662ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// getRegInfo - If this instruction is embedded into a MachineFunction, 36762ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// return the MachineRegisterInfo object for the current function, otherwise 36862ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// return null. 36962ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner MachineRegisterInfo *getRegInfo(); 370d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng 371d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng /// addImplicitDefUseOperands - Add all implicit def and use operands to 372d7de496b23fca8145f777a56281457bf64e8bbadEvan Cheng /// this instruction. 37367f660cb080965ea93ed6d7265a67100f2fe38e4Evan Cheng void addImplicitDefUseOperands(); 37462ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner 37562ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// RemoveRegOperandsFromUseLists - Unlink all of the register operands in 37662ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// this instruction from their respective use lists. This requires that the 37762ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// operands already be on their use lists. 37862ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner void RemoveRegOperandsFromUseLists(); 37962ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner 38062ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// AddRegOperandsToUseLists - Add all of the register operands in 38162ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// this instruction from their respective use lists. This requires that the 38262ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner /// operands not be on their use lists yet. 38362ed6b9ade63bf01717ce5274fa11e93e873d245Chris Lattner void AddRegOperandsToUseLists(MachineRegisterInfo &RegInfo); 384a995e6086deca9cbd9aab9d6e1e94b36964b66daVikram S. Adve}; 38523ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve 386b05497e0ca1ba2e7f57b792cc160e5d1c8579582Chris Lattner//===----------------------------------------------------------------------===// 387593da4acc56d4c591ad688e6605b04d0825c867eVikram S. Adve// Debugging Support 388593da4acc56d4c591ad688e6605b04d0825c867eVikram S. Adve 389cb3718832375a581c5ea23f15918f3ea447a446cOwen Andersoninline raw_ostream& operator<<(raw_ostream &OS, const MachineInstr &MI) { 390cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson MI.print(OS); 391cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson return OS; 392cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson} 393cb3718832375a581c5ea23f15918f3ea447a446cOwen Anderson 394d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 395d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 39623ee550765232e22d0daf6407141ecef4c55c06fVikram S. Adve#endif 397