MachineInstrBuilder.h revision d700a2f9c54e3312d28c132663bf60f81662b7f7
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" 21d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen#include "llvm/CodeGen/MachineInstrBundle.h" 22320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman#include "llvm/Support/ErrorHandling.h" 23f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 26e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Chengclass MCInstrDesc; 275f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesenclass MDNode; 28c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng 29587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlingnamespace RegState { 30587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling enum { 31587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Define = 0x2, 32587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Implicit = 0x4, 33587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Kill = 0x8, 34587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling Dead = 0x10, 354784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng Undef = 0x20, 364784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng EarlyClobber = 0x40, 37a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen Debug = 0x80, 384efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper InternalRead = 0x100, 39fce711cb65716f86b4e150f42cbb597bbecf7dbeJakob Stoklund Olesen DefineNoRead = Define | Undef, 40587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling ImplicitDefine = Implicit | Define, 41587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling ImplicitKill = Implicit | Kill 42587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling }; 43587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 44587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling 459d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerclass MachineInstrBuilder { 46433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction *MF; 47f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MachineInstr *MI; 489d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic: 49433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstrBuilder() : MF(0), MI(0) {} 50433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen 51433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen /// Create a MachineInstrBuilder for manipulating an existing instruction. 52433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen /// F must be the machine function that was used to allocate I. 53433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstrBuilder(MachineFunction &F, MachineInstr *I) : MF(&F), MI(I) {} 54f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 55f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// Allow automatic conversion to the machine instruction we are working on. 56f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 57f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner operator MachineInstr*() const { return MI; } 5807e7998f09195806e9fe0430a2d5769020dd5dd0Chris Lattner MachineInstr *operator->() const { return MI; } 59024e91f6f6b9c65d767efe507df213c5c53744c7Chris Lattner operator MachineBasicBlock::iterator() const { return MI; } 60f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 619ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// addReg - Add a new virtual register operand... 62f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 637ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng const 64587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling MachineInstrBuilder &addReg(unsigned RegNo, unsigned flags = 0, 65587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling unsigned SubReg = 0) const { 66587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling assert((flags & 0x1) == 0 && 67587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling "Passing in 'true' to addReg is forbidden! Use enums instead."); 687f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateReg(RegNo, 697f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Define, 707f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Implicit, 717f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Kill, 727f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Dead, 737f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Undef, 747f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::EarlyClobber, 757f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen SubReg, 767f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Debug, 777f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::InternalRead)); 78f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 79f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 80f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 816a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// addImm - Add a new immediate operand. 826a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// 832d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner const MachineInstrBuilder &addImm(int64_t Val) const { 847f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateImm(Val)); 856a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner return *this; 866a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner } 87f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 888594d429e02c688d428036f8563f09572da3fbffDevang Patel const MachineInstrBuilder &addCImm(const ConstantInt *Val) const { 897f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateCImm(Val)); 908594d429e02c688d428036f8563f09572da3fbffDevang Patel return *this; 918594d429e02c688d428036f8563f09572da3fbffDevang Patel } 928594d429e02c688d428036f8563f09572da3fbffDevang Patel 934fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman const MachineInstrBuilder &addFPImm(const ConstantFP *Val) const { 947f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateFPImm(Val)); 954b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman return *this; 964b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman } 974b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman 989a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB, 999a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1007f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateMBB(MBB, TargetFlags)); 1018cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return *this; 1028cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 103aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner 1047fcbfe38d24fb556c231b24f226247a543e51c9dJim Grosbach const MachineInstrBuilder &addFrameIndex(int Idx) const { 1057f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateFI(Idx)); 106aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner return *this; 107aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner } 1089d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 109404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx, 1109a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner int Offset = 0, 1119a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1127f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateCPI(Idx, Offset, TargetFlags)); 1139d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1149d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1159d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1160b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen const MachineInstrBuilder &addTargetIndex(unsigned Idx, int64_t Offset = 0, 1170b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen unsigned char TargetFlags = 0) const { 1187f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateTargetIndex(Idx, Offset, 1197f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen TargetFlags)); 1200b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen return *this; 1210b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen } 1220b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen 1239a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner const MachineInstrBuilder &addJumpTableIndex(unsigned Idx, 1249a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1257f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateJTI(Idx, TargetFlags)); 126ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng return *this; 127ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng } 128ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng 12946510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const MachineInstrBuilder &addGlobalAddress(const GlobalValue *GV, 1309a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner int64_t Offset = 0, 1319a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1327f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateGA(GV, Offset, TargetFlags)); 1339d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1349d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1359d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1366520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman const MachineInstrBuilder &addExternalSymbol(const char *FnName, 1379a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1387f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateES(FnName, TargetFlags)); 1399d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1409d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1418cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman 1427f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen const MachineInstrBuilder &addBlockAddress(const BlockAddress *BA, 1437f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen int64_t Offset = 0, 1447f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen unsigned char TargetFlags = 0) const { 1457f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateBA(BA, Offset, TargetFlags)); 1467f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen return *this; 1477f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen } 1487f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen 1497739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen const MachineInstrBuilder &addRegMask(const uint32_t *Mask) const { 1507f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateRegMask(Mask)); 1517739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen return *this; 1527739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen } 1537739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen 154c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman const MachineInstrBuilder &addMemOperand(MachineMemOperand *MMO) const { 1557f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addMemOperand(*MF, MMO); 1568cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman return *this; 1578cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman } 15897357614b5957cc167c261d3be54713802715d9aDan Gohman 159320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman const MachineInstrBuilder &setMemRefs(MachineInstr::mmo_iterator b, 160320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MachineInstr::mmo_iterator e) const { 161320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MI->setMemRefs(b, e); 162320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return *this; 163320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 164320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 165320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 16697357614b5957cc167c261d3be54713802715d9aDan Gohman const MachineInstrBuilder &addOperand(const MachineOperand &MO) const { 1677f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MO); 16897357614b5957cc167c261d3be54713802715d9aDan Gohman return *this; 16997357614b5957cc167c261d3be54713802715d9aDan Gohman } 1705f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen 17191c38417cf11ce56b13a7434de76306f665c88c5Dale Johannesen const MachineInstrBuilder &addMetadata(const MDNode *MD) const { 1727f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateMetadata(MD)); 1735f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen return *this; 1745f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen } 1753889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner 1763889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner const MachineInstrBuilder &addSym(MCSymbol *Sym) const { 1777f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateMCSymbol(Sym)); 1783889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner return *this; 1793889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner } 180320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 18194c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlags(unsigned Flags) const { 18294c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlags(Flags); 18394c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 18494c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 18594c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 18694c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlag(MachineInstr::MIFlag Flag) const { 18794c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlag(Flag); 18894c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 18994c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 19094c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 191320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman // Add a displacement from an existing MachineOperand with an added offset. 192a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng const MachineInstrBuilder &addDisp(const MachineOperand &Disp, int64_t off, 193a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng unsigned char TargetFlags = 0) const { 194320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman switch (Disp.getType()) { 195320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman default: 196320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman llvm_unreachable("Unhandled operand type in addDisp()"); 197320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman case MachineOperand::MO_Immediate: 198320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return addImm(Disp.getImm() + off); 199a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng case MachineOperand::MO_GlobalAddress: { 200a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // If caller specifies new TargetFlags then use it, otherwise the 201a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // default behavior is to copy the target flags from the existing 202a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // MachineOperand. This means if the caller wants to clear the 203a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // target flags it needs to do so explicitly. 204a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng if (TargetFlags) 205a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off, 206a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng TargetFlags); 207a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off, 208a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng Disp.getTargetFlags()); 209a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng } 210320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 211320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 212be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen 213be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen /// Copy all the implicit operands from OtherMI onto this one. 214be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen const MachineInstrBuilder ©ImplicitOps(const MachineInstr *OtherMI) { 215be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen MI->copyImplicitOps(*MF, OtherMI); 216be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen return *this; 217be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen } 218f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}; 219f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 220f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface. Specify how to create the initial instruction 221c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// itself. 222f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// 2238e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmaninline MachineInstrBuilder BuildMI(MachineFunction &MF, 2249bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 225e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 226433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MF.CreateMachineInstr(MCID, DL)); 227f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 228f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 22991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder sets up the first operand as a 230c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// destination virtual register. 231367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// 2329bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendlinginline MachineInstrBuilder BuildMI(MachineFunction &MF, 2339bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 234e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 2359bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 236433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MF.CreateMachineInstr(MCID, DL)) 237587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(DestReg, RegState::Define); 238367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner} 239367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 24091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 24191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 24291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// sets up the first operand as a destination virtual register. 24391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 244c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 245c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2469bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 247e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 2489bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 249433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 250433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 251c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 252433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI).addReg(DestReg, RegState::Define); 253c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 254c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 255ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 256ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator I, 257ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 258ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID, 259ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned DestReg) { 260433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 261433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 262ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng BB.insert(I, MI); 263433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI).addReg(DestReg, RegState::Define); 264ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 265ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 266ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 267ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *I, 268ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 269ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID, 270ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned DestReg) { 271ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (I->isInsideBundle()) { 272ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator MII = I; 273ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID, DestReg); 274ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 275ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 276ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::iterator MII = I; 277ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID, DestReg); 278ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 279ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 28091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 28191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 28291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// does NOT take a destination register. 28391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 284c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 285c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2869bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 287e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 288433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 289433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 290c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 291433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI); 292c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 293c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 294ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 295ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator I, 296ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 297ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID) { 298433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 299433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 300ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng BB.insert(I, MI); 301433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI); 302ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 303ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 304ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 305ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *I, 306ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 307ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID) { 308ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (I->isInsideBundle()) { 309ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator MII = I; 310ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID); 311ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 312ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 313ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::iterator MII = I; 314ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID); 315ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 316ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 31791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 31891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and does NOT take a 31991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// destination register. 3209cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 321c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 3229bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 323e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 324e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return BuildMI(*BB, BB->end(), DL, MCID); 3259bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 3267db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 32791ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 32891ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and sets up the first 32965b660743ccce5393f70d3667ac4e2b0b76e5236Daniel Dunbar/// operand as a destination virtual register. 3309cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 331c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 3329bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 333e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 3349bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 335e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return BuildMI(*BB, BB->end(), DL, MCID, DestReg); 3369bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 3379cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner 338587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDefRegState(bool B) { 339587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Define : 0; 340587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 341587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getImplRegState(bool B) { 342587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Implicit : 0; 343587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 344587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getKillRegState(bool B) { 345587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Kill : 0; 346587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 347587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDeadRegState(bool B) { 348587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Dead : 0; 349587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 3504784f1fc73abf6005b7b7262d395af71b57b1255Evan Chenginline unsigned getUndefRegState(bool B) { 3514784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng return B ? RegState::Undef : 0; 3524784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng} 3534efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooperinline unsigned getInternalReadRegState(bool B) { 3544efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper return B ? RegState::InternalRead : 0; 3554efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper} 3567f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Oleseninline unsigned getDebugRegState(bool B) { 3577f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen return B ? RegState::Debug : 0; 3587f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen} 359587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling 360c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 361c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// Helper class for constructing bundles of MachineInstrs. 362c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// 363c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// MIBundleBuilder can create a bundle from scratch by inserting new 364c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// MachineInstrs one at a time, or it can create a bundle from a sequence of 365c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// existing MachineInstrs in a basic block. 366c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesenclass MIBundleBuilder { 367c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock &MBB; 368c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator Begin; 369c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator End; 370c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 371c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesenpublic: 372c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Create an MIBundleBuilder that inserts instructions into a new bundle in 373c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// BB above the bundle or instruction at Pos. 374c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder(MachineBasicBlock &BB, 375c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator Pos) 376c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen : MBB(BB), Begin(Pos.getInstrIterator()), End(Begin) {} 377c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 378c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Create a bundle from the sequence of instructions between B and E. 379c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder(MachineBasicBlock &BB, 380c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator B, 381c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator E) 382c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen : MBB(BB), Begin(B.getInstrIterator()), End(E.getInstrIterator()) { 383c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen assert(B != E && "No instructions to bundle"); 384c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen ++B; 385c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen while (B != E) { 386c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineInstr *MI = B; 387c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen ++B; 388c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MI->bundleWithPred(); 389c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 390c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 391c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 3925d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Create an MIBundleBuilder representing an existing instruction or bundle 3935d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// that has MI as its head. 3945d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen explicit MIBundleBuilder(MachineInstr *MI) 395d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen : MBB(*MI->getParent()), Begin(MI), End(getBundleEnd(MI)) {} 3965d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 3975d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Return a reference to the basic block containing this bundle. 3985d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MachineBasicBlock &getMBB() const { return MBB; } 3995d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 400c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return true if no instructions have been inserted in this bundle yet. 401c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Empty bundles aren't representable in a MachineBasicBlock. 402c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen bool empty() const { return Begin == End; } 403c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 404c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return an iterator to the first bundled instruction. 405c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator begin() const { return Begin; } 406c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 407c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return an iterator beyond the last bundled instruction. 408c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator end() const { return End; } 409c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 4105d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Insert MI into this bundle before I which must point to an instruction in 4115d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// the bundle, or end(). 4125d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MIBundleBuilder &insert(MachineBasicBlock::instr_iterator I, 4135d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MachineInstr *MI) { 4145d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MBB.insert(I, MI); 4155d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (I == Begin) { 4165d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (!empty()) 4175d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->bundleWithSucc(); 4185d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen Begin = MI; 4195d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4205d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4215d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (I == End) { 4225d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->bundleWithPred(); 4235d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4245d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4255d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen // MI was inserted in the middle of the bundle, so its neighbors' flags are 4265d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen // already fine. Update MI's bundle flags manually. 4275d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->setFlag(MachineInstr::BundledPred); 4285d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->setFlag(MachineInstr::BundledSucc); 4295d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4305d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4315d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 432c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Insert MI into MBB by prepending it to the instructions in the bundle. 433c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// MI will become the first instruction in the bundle. 434c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder &prepend(MachineInstr *MI) { 4355d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return insert(begin(), MI); 436c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 437c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 438c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Insert MI into MBB by appending it to the instructions in the bundle. 439c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// MI will become the last instruction in the bundle. 440c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder &append(MachineInstr *MI) { 4415d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return insert(end(), MI); 442c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 443c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen}; 444c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 445d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 446d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 447f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif 448