MachineInstrBuilder.h revision be06aacaa9a270384599bbfa850b967e9996b9fb
1f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- 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//===----------------------------------------------------------------------===// 9f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 10f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// This file exposes a function named BuildMI, which is useful for dramatically 11ceb408f6a263e319683209ae5c6f8d1e3e4d9b69Chris Lattner// simplifying how MachineInstr's are created. It allows use of code like this: 12f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 139ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner// M = BuildMI(X86::ADDrr8, 2).addReg(argVal1).addReg(argVal2); 14f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner// 15f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner//===----------------------------------------------------------------------===// 16f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 17f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#ifndef LLVM_CODEGEN_MACHINEINSTRBUILDER_H 18f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#define LLVM_CODEGEN_MACHINEINSTRBUILDER_H 19f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 207ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng#include "llvm/CodeGen/MachineFunction.h" 21320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman#include "llvm/Support/ErrorHandling.h" 22f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 23d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Chengclass MCInstrDesc; 265f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesenclass MDNode; 27c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng 28587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlingnamespace RegState { 29587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling enum { 30587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Define = 0x2, 31587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Implicit = 0x4, 32587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Kill = 0x8, 33587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Dead = 0x10, 344784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng Undef = 0x20, 354784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng EarlyClobber = 0x40, 36a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen Debug = 0x80, 374efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper InternalRead = 0x100, 38fce711cb65716f86b4e150f42cbb597bbecf7dbeJakob Stoklund Olesen DefineNoRead = Define | Undef, 39587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling ImplicitDefine = Implicit | Define, 40587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling ImplicitKill = Implicit | Kill 41587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling }; 42587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 43587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling 449d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerclass MachineInstrBuilder { 45433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction *MF; 46f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MachineInstr *MI; 479d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic: 48433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstrBuilder() : MF(0), MI(0) {} 49433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen 50433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen /// Create a MachineInstrBuilder for manipulating an existing instruction. 51433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen /// F must be the machine function that was used to allocate I. 52433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstrBuilder(MachineFunction &F, MachineInstr *I) : MF(&F), MI(I) {} 53f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 54f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// Allow automatic conversion to the machine instruction we are working on. 55f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 56f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner operator MachineInstr*() const { return MI; } 5707e7998f09195806e9fe0430a2d5769020dd5dd0Chris Lattner MachineInstr *operator->() const { return MI; } 58024e91f6f6b9c65d767efe507df213c5c53744c7Chris Lattner operator MachineBasicBlock::iterator() const { return MI; } 59f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 609ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// addReg - Add a new virtual register operand... 61f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 627ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng const 63587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling MachineInstrBuilder &addReg(unsigned RegNo, unsigned flags = 0, 64587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling unsigned SubReg = 0) const { 65587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling assert((flags & 0x1) == 0 && 66587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling "Passing in 'true' to addReg is forbidden! Use enums instead."); 677f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateReg(RegNo, 687f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Define, 697f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Implicit, 707f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Kill, 717f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Dead, 727f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Undef, 737f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::EarlyClobber, 747f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen SubReg, 757f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Debug, 767f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::InternalRead)); 77f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 78f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 79f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 806a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// addImm - Add a new immediate operand. 816a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// 822d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner const MachineInstrBuilder &addImm(int64_t Val) const { 837f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateImm(Val)); 846a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner return *this; 856a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner } 86f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 878594d429e02c688d428036f8563f09572da3fbffDevang Patel const MachineInstrBuilder &addCImm(const ConstantInt *Val) const { 887f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateCImm(Val)); 898594d429e02c688d428036f8563f09572da3fbffDevang Patel return *this; 908594d429e02c688d428036f8563f09572da3fbffDevang Patel } 918594d429e02c688d428036f8563f09572da3fbffDevang Patel 924fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman const MachineInstrBuilder &addFPImm(const ConstantFP *Val) const { 937f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateFPImm(Val)); 944b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman return *this; 954b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman } 964b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman 979a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB, 989a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 997f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateMBB(MBB, TargetFlags)); 1008cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return *this; 1018cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 102aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner 1037fcbfe38d24fb556c231b24f226247a543e51c9dJim Grosbach const MachineInstrBuilder &addFrameIndex(int Idx) const { 1047f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateFI(Idx)); 105aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner return *this; 106aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner } 1079d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 108404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx, 1099a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner int Offset = 0, 1109a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1117f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateCPI(Idx, Offset, TargetFlags)); 1129d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1139d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1149d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1150b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen const MachineInstrBuilder &addTargetIndex(unsigned Idx, int64_t Offset = 0, 1160b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen unsigned char TargetFlags = 0) const { 1177f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateTargetIndex(Idx, Offset, 1187f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen TargetFlags)); 1190b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen return *this; 1200b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen } 1210b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen 1229a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner const MachineInstrBuilder &addJumpTableIndex(unsigned Idx, 1239a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1247f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateJTI(Idx, TargetFlags)); 125ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng return *this; 126ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng } 127ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng 12846510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const MachineInstrBuilder &addGlobalAddress(const GlobalValue *GV, 1299a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner int64_t Offset = 0, 1309a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1317f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateGA(GV, Offset, TargetFlags)); 1329d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1339d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1349d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1356520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman const MachineInstrBuilder &addExternalSymbol(const char *FnName, 1369a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1377f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateES(FnName, TargetFlags)); 1389d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1399d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1408cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman 1417f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen const MachineInstrBuilder &addBlockAddress(const BlockAddress *BA, 1427f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen int64_t Offset = 0, 1437f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen unsigned char TargetFlags = 0) const { 1447f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateBA(BA, Offset, TargetFlags)); 1457f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen return *this; 1467f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen } 1477f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen 1487739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen const MachineInstrBuilder &addRegMask(const uint32_t *Mask) const { 1497f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateRegMask(Mask)); 1507739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen return *this; 1517739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen } 1527739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen 153c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman const MachineInstrBuilder &addMemOperand(MachineMemOperand *MMO) const { 1547f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addMemOperand(*MF, MMO); 1558cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman return *this; 1568cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman } 15797357614b5957cc167c261d3be54713802715d9aDan Gohman 158320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman const MachineInstrBuilder &setMemRefs(MachineInstr::mmo_iterator b, 159320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MachineInstr::mmo_iterator e) const { 160320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MI->setMemRefs(b, e); 161320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return *this; 162320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 163320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 164320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 16597357614b5957cc167c261d3be54713802715d9aDan Gohman const MachineInstrBuilder &addOperand(const MachineOperand &MO) const { 1667f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MO); 16797357614b5957cc167c261d3be54713802715d9aDan Gohman return *this; 16897357614b5957cc167c261d3be54713802715d9aDan Gohman } 1695f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen 17091c38417cf11ce56b13a7434de76306f665c88c5Dale Johannesen const MachineInstrBuilder &addMetadata(const MDNode *MD) const { 1717f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateMetadata(MD)); 1725f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen return *this; 1735f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen } 1743889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner 1753889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner const MachineInstrBuilder &addSym(MCSymbol *Sym) const { 1767f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateMCSymbol(Sym)); 1773889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner return *this; 1783889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner } 179320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 18094c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlags(unsigned Flags) const { 18194c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlags(Flags); 18294c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 18394c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 18494c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 18594c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlag(MachineInstr::MIFlag Flag) const { 18694c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlag(Flag); 18794c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 18894c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 18994c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 190320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman // Add a displacement from an existing MachineOperand with an added offset. 191a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng const MachineInstrBuilder &addDisp(const MachineOperand &Disp, int64_t off, 192a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng unsigned char TargetFlags = 0) const { 193320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman switch (Disp.getType()) { 194320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman default: 195320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman llvm_unreachable("Unhandled operand type in addDisp()"); 196320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman case MachineOperand::MO_Immediate: 197320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return addImm(Disp.getImm() + off); 198a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng case MachineOperand::MO_GlobalAddress: { 199a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // If caller specifies new TargetFlags then use it, otherwise the 200a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // default behavior is to copy the target flags from the existing 201a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // MachineOperand. This means if the caller wants to clear the 202a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // target flags it needs to do so explicitly. 203a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng if (TargetFlags) 204a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off, 205a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng TargetFlags); 206a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off, 207a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng Disp.getTargetFlags()); 208a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng } 209320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 210320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 211be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen 212be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen /// Copy all the implicit operands from OtherMI onto this one. 213be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen const MachineInstrBuilder ©ImplicitOps(const MachineInstr *OtherMI) { 214be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen MI->copyImplicitOps(*MF, OtherMI); 215be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen return *this; 216be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen } 217f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}; 218f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 219f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface. Specify how to create the initial instruction 220c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// itself. 221f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// 2228e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmaninline MachineInstrBuilder BuildMI(MachineFunction &MF, 2239bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 224e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 225433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MF.CreateMachineInstr(MCID, DL)); 226f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 227f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 22891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder sets up the first operand as a 229c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// destination virtual register. 230367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// 2319bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendlinginline MachineInstrBuilder BuildMI(MachineFunction &MF, 2329bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 233e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 2349bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 235433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MF.CreateMachineInstr(MCID, DL)) 236587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(DestReg, RegState::Define); 237367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner} 238367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 23991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 24091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 24191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// sets up the first operand as a destination virtual register. 24291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 243c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 244c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2459bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 246e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 2479bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 248433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 249433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 250c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 251433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI).addReg(DestReg, RegState::Define); 252c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 253c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 254ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 255ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator I, 256ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 257ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID, 258ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned DestReg) { 259433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 260433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 261ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng BB.insert(I, MI); 262433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI).addReg(DestReg, RegState::Define); 263ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 264ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 265ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 266ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *I, 267ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 268ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID, 269ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned DestReg) { 270ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (I->isInsideBundle()) { 271ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator MII = I; 272ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID, DestReg); 273ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 274ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 275ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::iterator MII = I; 276ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID, DestReg); 277ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 278ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 27991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 28091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 28191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// does NOT take a destination register. 28291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 283c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 284c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2859bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 286e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 287433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 288433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 289c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 290433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI); 291c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 292c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 293ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 294ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator I, 295ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 296ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID) { 297433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 298433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 299ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng BB.insert(I, MI); 300433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI); 301ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 302ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 303ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 304ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *I, 305ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 306ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID) { 307ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (I->isInsideBundle()) { 308ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator MII = I; 309ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID); 310ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 311ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 312ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::iterator MII = I; 313ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID); 314ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 315ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 31691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 31791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and does NOT take a 31891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// destination register. 3199cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 320c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 3219bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 322e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 323e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return BuildMI(*BB, BB->end(), DL, MCID); 3249bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 3257db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 32691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 32791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and sets up the first 32865b660743ccce5393f70d3667ac4e2b0b76e5236Daniel Dunbar/// operand as a destination virtual register. 3299cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 330c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 3319bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 332e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 3339bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 334e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return BuildMI(*BB, BB->end(), DL, MCID, DestReg); 3359bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 3369cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner 337587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDefRegState(bool B) { 338587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Define : 0; 339587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 340587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getImplRegState(bool B) { 341587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Implicit : 0; 342587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 343587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getKillRegState(bool B) { 344587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Kill : 0; 345587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 346587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDeadRegState(bool B) { 347587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Dead : 0; 348587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 3494784f1fc73abf6005b7b7262d395af71b57b1255Evan Chenginline unsigned getUndefRegState(bool B) { 3504784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng return B ? RegState::Undef : 0; 3514784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng} 3524efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooperinline unsigned getInternalReadRegState(bool B) { 3534efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper return B ? RegState::InternalRead : 0; 3544efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper} 3557f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Oleseninline unsigned getDebugRegState(bool B) { 3567f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen return B ? RegState::Debug : 0; 3577f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen} 358587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling 359c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 360c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// Helper class for constructing bundles of MachineInstrs. 361c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// 362c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// MIBundleBuilder can create a bundle from scratch by inserting new 363c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// MachineInstrs one at a time, or it can create a bundle from a sequence of 364c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// existing MachineInstrs in a basic block. 365c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesenclass MIBundleBuilder { 366c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock &MBB; 367c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator Begin; 368c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator End; 369c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 370c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesenpublic: 371c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Create an MIBundleBuilder that inserts instructions into a new bundle in 372c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// BB above the bundle or instruction at Pos. 373c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder(MachineBasicBlock &BB, 374c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator Pos) 375c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen : MBB(BB), Begin(Pos.getInstrIterator()), End(Begin) {} 376c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 377c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Create a bundle from the sequence of instructions between B and E. 378c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder(MachineBasicBlock &BB, 379c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator B, 380c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator E) 381c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen : MBB(BB), Begin(B.getInstrIterator()), End(E.getInstrIterator()) { 382c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen assert(B != E && "No instructions to bundle"); 383c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen ++B; 384c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen while (B != E) { 385c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineInstr *MI = B; 386c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen ++B; 387c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MI->bundleWithPred(); 388c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 389c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 390c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 3915d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Create an MIBundleBuilder representing an existing instruction or bundle 3925d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// that has MI as its head. 3935d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen explicit MIBundleBuilder(MachineInstr *MI) 3945d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen : MBB(*MI->getParent()), Begin(MI) { 3955d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MachineBasicBlock::iterator I = MI; 3965d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen ++I; 3975d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen End = I.getInstrIterator(); 3985d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 3995d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 4005d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Return a reference to the basic block containing this bundle. 4015d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MachineBasicBlock &getMBB() const { return MBB; } 4025d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 403c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return true if no instructions have been inserted in this bundle yet. 404c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Empty bundles aren't representable in a MachineBasicBlock. 405c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen bool empty() const { return Begin == End; } 406c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 407c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return an iterator to the first bundled instruction. 408c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator begin() const { return Begin; } 409c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 410c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return an iterator beyond the last bundled instruction. 411c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator end() const { return End; } 412c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 4135d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Insert MI into this bundle before I which must point to an instruction in 4145d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// the bundle, or end(). 4155d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MIBundleBuilder &insert(MachineBasicBlock::instr_iterator I, 4165d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MachineInstr *MI) { 4175d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MBB.insert(I, MI); 4185d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (I == Begin) { 4195d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (!empty()) 4205d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->bundleWithSucc(); 4215d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen Begin = MI; 4225d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4235d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4245d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (I == End) { 4255d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->bundleWithPred(); 4265d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4275d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4285d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen // MI was inserted in the middle of the bundle, so its neighbors' flags are 4295d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen // already fine. Update MI's bundle flags manually. 4305d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->setFlag(MachineInstr::BundledPred); 4315d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->setFlag(MachineInstr::BundledSucc); 4325d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4335d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4345d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 435c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Insert MI into MBB by prepending it to the instructions in the bundle. 436c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// MI will become the first instruction in the bundle. 437c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder &prepend(MachineInstr *MI) { 4385d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return insert(begin(), MI); 439c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 440c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 441c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Insert MI into MBB by appending it to the instructions in the bundle. 442c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// MI will become the last instruction in the bundle. 443c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder &append(MachineInstr *MI) { 4445d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return insert(end(), MI); 445c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 446c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen}; 447c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 448d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 449d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 450f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif 451