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: 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines MachineInstrBuilder() : MF(nullptr), MI(nullptr) {} 50433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen 51433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen /// Create a MachineInstrBuilder for manipulating an existing instruction. 52cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// 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 operator MachineInstr*() const { return MI; } 5707e7998f09195806e9fe0430a2d5769020dd5dd0Chris Lattner MachineInstr *operator->() const { return MI; } 58024e91f6f6b9c65d767efe507df213c5c53744c7Chris Lattner operator MachineBasicBlock::iterator() const { return MI; } 59f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// If conversion operators fail, use this method to get the MachineInstr 6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// explicitly. 6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MachineInstr *getInstr() const { return MI; } 6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 64cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// Add a new virtual register operand. 65cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const MachineInstrBuilder &addReg(unsigned RegNo, unsigned flags = 0, 66cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned SubReg = 0) const { 67587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling assert((flags & 0x1) == 0 && 68587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling "Passing in 'true' to addReg is forbidden! Use enums instead."); 697f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen MI->addOperand(*MF, MachineOperand::CreateReg(RegNo, 707f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Define, 717f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Implicit, 727f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Kill, 737f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Dead, 747f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Undef, 757f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::EarlyClobber, 767f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen SubReg, 777f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::Debug, 787f4bb1b9f0c1a4b5191c4e4892356fa5c75a0aaaJakob Stoklund Olesen flags & RegState::InternalRead)); 79f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 80f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 81f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 82cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// Add a new immediate operand. 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)); 1730c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar assert((MI->isDebugValue() ? static_cast<bool>(MI->getDebugVariable()) 1740c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar : true) && 1756948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar "first MDNode argument of a DBG_VALUE not a variable"); 1765f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen return *this; 1775f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen } 17836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 17936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const MachineInstrBuilder &addCFIIndex(unsigned CFIIndex) const { 18036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines MI->addOperand(*MF, MachineOperand::CreateCFIIndex(CFIIndex)); 18136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return *this; 18236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 18336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 184cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const MachineInstrBuilder &addSym(MCSymbol *Sym, 185cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned char TargetFlags = 0) const { 186cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MI->addOperand(*MF, MachineOperand::CreateMCSymbol(Sym, TargetFlags)); 1873889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner return *this; 1883889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner } 189320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 19094c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlags(unsigned Flags) const { 19194c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlags(Flags); 19294c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 19394c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 19494c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 19594c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlag(MachineInstr::MIFlag Flag) const { 19694c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlag(Flag); 19794c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 19894c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 19994c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 200320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman // Add a displacement from an existing MachineOperand with an added offset. 201a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng const MachineInstrBuilder &addDisp(const MachineOperand &Disp, int64_t off, 202a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng unsigned char TargetFlags = 0) const { 203cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // If caller specifies new TargetFlags then use it, otherwise the 204cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // default behavior is to copy the target flags from the existing 205cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // MachineOperand. This means if the caller wants to clear the 206cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // target flags it needs to do so explicitly. 207cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (0 == TargetFlags) 208cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar TargetFlags = Disp.getTargetFlags(); 209cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 210320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman switch (Disp.getType()) { 211320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman default: 212320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman llvm_unreachable("Unhandled operand type in addDisp()"); 213320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman case MachineOperand::MO_Immediate: 214320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return addImm(Disp.getImm() + off); 215cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case MachineOperand::MO_ConstantPoolIndex: 216cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return addConstantPoolIndex(Disp.getIndex(), Disp.getOffset() + off, 217cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar TargetFlags); 218cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar case MachineOperand::MO_GlobalAddress: 219a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off, 220cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar TargetFlags); 221320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 222320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 223be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen 224be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen /// Copy all the implicit operands from OtherMI onto this one. 225cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const MachineInstrBuilder & 226cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar copyImplicitOps(const MachineInstr *OtherMI) const { 227be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen MI->copyImplicitOps(*MF, OtherMI); 228be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen return *this; 229be06aacaa9a270384599bbfa850b967e9996b9fbJakob Stoklund Olesen } 230f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}; 231f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 232cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// Builder interface. Specify how to create the initial instruction itself. 2338e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmaninline MachineInstrBuilder BuildMI(MachineFunction &MF, 2349bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 235e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 236433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MF.CreateMachineInstr(MCID, DL)); 237f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 238f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 239cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// This version of the builder sets up the first operand as a 240c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// destination virtual register. 2419bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendlinginline MachineInstrBuilder BuildMI(MachineFunction &MF, 2429bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 243e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 2449bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 245433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MF.CreateMachineInstr(MCID, DL)) 246587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(DestReg, RegState::Define); 247367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner} 248367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 249cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// This version of the builder inserts the newly-built instruction before 250cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// the given position in the given MachineBasicBlock, and sets up the first 251cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// operand as a destination virtual register. 252c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 253c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2549bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 255e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 2569bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 257433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 258433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 259c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 260433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI).addReg(DestReg, RegState::Define); 261c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 262c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 263ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 264ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator I, 265ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 266ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID, 267ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned DestReg) { 268433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 269433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 270ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng BB.insert(I, MI); 271433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI).addReg(DestReg, RegState::Define); 272ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 273ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 274ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 275ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *I, 276ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 277ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID, 278ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned DestReg) { 279ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (I->isInsideBundle()) { 280cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MachineBasicBlock::instr_iterator MII(I); 281ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID, DestReg); 282ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 283ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 284ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::iterator MII = I; 285ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID, DestReg); 286ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 287ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 288cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// This version of the builder inserts the newly-built instruction before the 289cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// given position in the given MachineBasicBlock, and does NOT take a 290cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// destination register. 291c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 292c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2939bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 294e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 295433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 296433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 297c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 298433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI); 299c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 300c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 301ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 302ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator I, 303ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 304ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID) { 305433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineFunction &MF = *BB.getParent(); 306433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen MachineInstr *MI = MF.CreateMachineInstr(MCID, DL); 307ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng BB.insert(I, MI); 308433cb080bac56b4fac56f7625e07e17b4824ce8aJakob Stoklund Olesen return MachineInstrBuilder(MF, MI); 309ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 310ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 311ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 312ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *I, 313ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 314ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID) { 315ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (I->isInsideBundle()) { 316cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar MachineBasicBlock::instr_iterator MII(I); 317ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID); 318ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 319ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 320ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::iterator MII = I; 321ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID); 322ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 323ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 324cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// This version of the builder inserts the newly-built instruction at the end 325cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// of the given MachineBasicBlock, and does NOT take a destination register. 326c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 3279bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 328e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 329e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return BuildMI(*BB, BB->end(), DL, MCID); 3309bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 3317db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 332cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// This version of the builder inserts the newly-built instruction at the 333cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// end of the given MachineBasicBlock, and sets up the first operand as a 334cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// destination virtual register. 335c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 3369bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 337e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 3389bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 339e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return BuildMI(*BB, BB->end(), DL, MCID, DestReg); 3409bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 3419cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner 342cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// This version of the builder builds a DBG_VALUE intrinsic 3433517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// for either a value in a register or a register-indirect+offset 3443517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// address. The convention is that a DBG_VALUE is indirect iff the 3453517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// second operand is an immediate. 34637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesinline MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, 34737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const MCInstrDesc &MCID, bool IsIndirect, 34837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned Reg, unsigned Offset, 34937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const MDNode *Variable, const MDNode *Expr) { 3506948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(isa<DILocalVariable>(Variable) && "not a variable"); 3516948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(cast<DIExpression>(Expr)->isValid() && "not an expression"); 3526948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(cast<DILocalVariable>(Variable)->isValidLocationForIntrinsic(DL) && 3530c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar "Expected inlined-at fields to agree"); 3543517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl if (IsIndirect) 3553517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl return BuildMI(MF, DL, MCID) 35637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines .addReg(Reg, RegState::Debug) 35737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines .addImm(Offset) 35837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines .addMetadata(Variable) 35937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines .addMetadata(Expr); 3603517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl else { 3613517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl assert(Offset == 0 && "A direct address cannot have an offset."); 3623517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl return BuildMI(MF, DL, MCID) 36337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines .addReg(Reg, RegState::Debug) 36437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines .addReg(0U, RegState::Debug) 36537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines .addMetadata(Variable) 36637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines .addMetadata(Expr); 3673517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl } 3683517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl} 3693517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl 370cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar/// This version of the builder builds a DBG_VALUE intrinsic 3713517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// for either a value in a register or a register-indirect+offset 3723517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl/// address and inserts it at position I. 3733517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantlinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 37437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MachineBasicBlock::iterator I, DebugLoc DL, 37537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const MCInstrDesc &MCID, bool IsIndirect, 37637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines unsigned Reg, unsigned Offset, 37737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const MDNode *Variable, const MDNode *Expr) { 3786948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(isa<DILocalVariable>(Variable) && "not a variable"); 3796948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar assert(cast<DIExpression>(Expr)->isValid() && "not an expression"); 3803517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl MachineFunction &MF = *BB.getParent(); 38137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines MachineInstr *MI = 38237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines BuildMI(MF, DL, MCID, IsIndirect, Reg, Offset, Variable, Expr); 3833517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl BB.insert(I, MI); 3843517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl return MachineInstrBuilder(MF, MI); 3853517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl} 3863517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl 3873517640443f0b5224e2a6414c246ac60016ee9d4Adrian Prantl 388587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDefRegState(bool B) { 389587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Define : 0; 390587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 391587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getImplRegState(bool B) { 392587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Implicit : 0; 393587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 394587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getKillRegState(bool B) { 395587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Kill : 0; 396587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 397587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDeadRegState(bool B) { 398587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Dead : 0; 399587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 4004784f1fc73abf6005b7b7262d395af71b57b1255Evan Chenginline unsigned getUndefRegState(bool B) { 4014784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng return B ? RegState::Undef : 0; 4024784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng} 4034efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooperinline unsigned getInternalReadRegState(bool B) { 4044efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper return B ? RegState::InternalRead : 0; 4054efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper} 4067f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Oleseninline unsigned getDebugRegState(bool B) { 4077f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen return B ? RegState::Debug : 0; 4087f6ece8a93021fb42a5f2e42507c9b2681e32f32Jakob Stoklund Olesen} 409587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling 410c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 411c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// Helper class for constructing bundles of MachineInstrs. 412c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// 413c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// MIBundleBuilder can create a bundle from scratch by inserting new 414c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// MachineInstrs one at a time, or it can create a bundle from a sequence of 415c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// existing MachineInstrs in a basic block. 416c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesenclass MIBundleBuilder { 417c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock &MBB; 418c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator Begin; 419c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator End; 420c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 421c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesenpublic: 422c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Create an MIBundleBuilder that inserts instructions into a new bundle in 423c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// BB above the bundle or instruction at Pos. 424c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder(MachineBasicBlock &BB, 425c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator Pos) 426c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen : MBB(BB), Begin(Pos.getInstrIterator()), End(Begin) {} 427c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 428c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Create a bundle from the sequence of instructions between B and E. 429c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder(MachineBasicBlock &BB, 430c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator B, 431c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator E) 432c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen : MBB(BB), Begin(B.getInstrIterator()), End(E.getInstrIterator()) { 433c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen assert(B != E && "No instructions to bundle"); 434c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen ++B; 435c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen while (B != E) { 436c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineInstr *MI = B; 437c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen ++B; 438c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MI->bundleWithPred(); 439c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 440c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 441c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 4425d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Create an MIBundleBuilder representing an existing instruction or bundle 4435d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// that has MI as its head. 4445d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen explicit MIBundleBuilder(MachineInstr *MI) 445d700a2f9c54e3312d28c132663bf60f81662b7f7Jakob Stoklund Olesen : MBB(*MI->getParent()), Begin(MI), End(getBundleEnd(MI)) {} 4465d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 4475d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Return a reference to the basic block containing this bundle. 4485d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MachineBasicBlock &getMBB() const { return MBB; } 4495d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 450c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return true if no instructions have been inserted in this bundle yet. 451c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Empty bundles aren't representable in a MachineBasicBlock. 452c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen bool empty() const { return Begin == End; } 453c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 454c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return an iterator to the first bundled instruction. 455c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator begin() const { return Begin; } 456c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 457c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return an iterator beyond the last bundled instruction. 458c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator end() const { return End; } 459c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 4605d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// Insert MI into this bundle before I which must point to an instruction in 4615d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen /// the bundle, or end(). 4625d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MIBundleBuilder &insert(MachineBasicBlock::instr_iterator I, 4635d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MachineInstr *MI) { 4645d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MBB.insert(I, MI); 4655d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (I == Begin) { 4665d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (!empty()) 4675d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->bundleWithSucc(); 468cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Begin = MI->getIterator(); 4695d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4705d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4715d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen if (I == End) { 4725d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->bundleWithPred(); 4735d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4745d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4755d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen // MI was inserted in the middle of the bundle, so its neighbors' flags are 4765d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen // already fine. Update MI's bundle flags manually. 4775d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->setFlag(MachineInstr::BundledPred); 4785d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen MI->setFlag(MachineInstr::BundledSucc); 4795d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return *this; 4805d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen } 4815d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen 482c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Insert MI into MBB by prepending it to the instructions in the bundle. 483c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// MI will become the first instruction in the bundle. 484c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder &prepend(MachineInstr *MI) { 4855d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return insert(begin(), MI); 486c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 487c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 488c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Insert MI into MBB by appending it to the instructions in the bundle. 489c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// MI will become the last instruction in the bundle. 490c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder &append(MachineInstr *MI) { 4915d7802ceccdaaaec1b7612ef4adb90dbaa278eceJakob Stoklund Olesen return insert(end(), MI); 492c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 493c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen}; 494c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 495d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 496d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 497f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif 498