MachineInstrBuilder.h revision c8ce7a4bb58b9078e1ea0e362b3935f4de501e8f
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 { 45f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner MachineInstr *MI; 469d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattnerpublic: 47f9dc699c42a11a60ec299970c8fb0093d51e993bChris Lattner MachineInstrBuilder() : MI(0) {} 48423c2260f95883f7c84ac962e58ac66c3a11efacDan Gohman explicit MachineInstrBuilder(MachineInstr *mi) : MI(mi) {} 49f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 50f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// Allow automatic conversion to the machine instruction we are working on. 51f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 52f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner operator MachineInstr*() const { return MI; } 5307e7998f09195806e9fe0430a2d5769020dd5dd0Chris Lattner MachineInstr *operator->() const { return MI; } 54024e91f6f6b9c65d767efe507df213c5c53744c7Chris Lattner operator MachineBasicBlock::iterator() const { return MI; } 55f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 569ed63ee0fcaa6730eb1df8c1ddbf5f46d8c81329Chris Lattner /// addReg - Add a new virtual register operand... 57f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner /// 587ce45783531cfa81bfd7be561ea7e4738e8c6ca8Evan Cheng const 59587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling MachineInstrBuilder &addReg(unsigned RegNo, unsigned flags = 0, 60587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling unsigned SubReg = 0) const { 61587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling assert((flags & 0x1) == 0 && 62587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling "Passing in 'true' to addReg is forbidden! Use enums instead."); 63587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling MI->addOperand(MachineOperand::CreateReg(RegNo, 64587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling flags & RegState::Define, 65587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling flags & RegState::Implicit, 66587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling flags & RegState::Kill, 67587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling flags & RegState::Dead, 684784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng flags & RegState::Undef, 694784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng flags & RegState::EarlyClobber, 70a65aa0f0bba1ef2322d63d05c074a92168684c63Dale Johannesen SubReg, 714efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper flags & RegState::Debug, 724efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper flags & RegState::InternalRead)); 73f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner return *this; 74f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner } 75f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 766a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// addImm - Add a new immediate operand. 776a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner /// 782d90ac7ca6117d3b160dde8a4f322c1079a6ffceChris Lattner const MachineInstrBuilder &addImm(int64_t Val) const { 79c8313f1d7957843d6032170573716cf8e6aeb93cChris Lattner MI->addOperand(MachineOperand::CreateImm(Val)); 806a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner return *this; 816a8a9b4413cd595c8322e7ebb7d42cbb04ca6933Chris Lattner } 82f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 838594d429e02c688d428036f8563f09572da3fbffDevang Patel const MachineInstrBuilder &addCImm(const ConstantInt *Val) const { 848594d429e02c688d428036f8563f09572da3fbffDevang Patel MI->addOperand(MachineOperand::CreateCImm(Val)); 858594d429e02c688d428036f8563f09572da3fbffDevang Patel return *this; 868594d429e02c688d428036f8563f09572da3fbffDevang Patel } 878594d429e02c688d428036f8563f09572da3fbffDevang Patel 884fbd796a1251a27e6590765a0a34876f436a0af9Dan Gohman const MachineInstrBuilder &addFPImm(const ConstantFP *Val) const { 894b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman MI->addOperand(MachineOperand::CreateFPImm(Val)); 904b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman return *this; 914b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman } 924b6e7069c3ac98179e8cdc0a896f5f434670dafcDan Gohman 939a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB, 949a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 959a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner MI->addOperand(MachineOperand::CreateMBB(MBB, TargetFlags)); 968cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner return *this; 978cbfc75d17ee1c274116dc1aca3bc8e8ed2326c9Chris Lattner } 98aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner 997fcbfe38d24fb556c231b24f226247a543e51c9dJim Grosbach const MachineInstrBuilder &addFrameIndex(int Idx) const { 10039697a83b5ebb857263fc8b9a83ea1834e9d7fe4Chris Lattner MI->addOperand(MachineOperand::CreateFI(Idx)); 101aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner return *this; 102aa0e277f310fab67df6a8bd8dfb45b6f2730c17eChris Lattner } 1039d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 104404cb4f9fa2df50eac4d84b8a77c84a92188c6d5Evan Cheng const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx, 1059a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner int Offset = 0, 1069a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1079a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner MI->addOperand(MachineOperand::CreateCPI(Idx, Offset, TargetFlags)); 1089d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1099d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1109d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1110b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen const MachineInstrBuilder &addTargetIndex(unsigned Idx, int64_t Offset = 0, 1120b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen unsigned char TargetFlags = 0) const { 1130b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen MI->addOperand(MachineOperand::CreateTargetIndex(Idx, Offset, TargetFlags)); 1140b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen return *this; 1150b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen } 1160b40d09ff6b1facd0fe81e50ee0271e035488520Jakob Stoklund Olesen 1179a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner const MachineInstrBuilder &addJumpTableIndex(unsigned Idx, 1189a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1199a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner MI->addOperand(MachineOperand::CreateJTI(Idx, TargetFlags)); 120ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng return *this; 121ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng } 122ccdcdf3e2e5e9e30e0e2a99e40ac7199afcd9025Evan Cheng 12346510a73e977273ec67747eb34cbdb43f815e451Dan Gohman const MachineInstrBuilder &addGlobalAddress(const GlobalValue *GV, 1249a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner int64_t Offset = 0, 1259a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 1269a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner MI->addOperand(MachineOperand::CreateGA(GV, Offset, TargetFlags)); 1279d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1289d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1299d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner 1306520e20e4fb31f2e65e25c38b372b19d33a83df4Dan Gohman const MachineInstrBuilder &addExternalSymbol(const char *FnName, 1319a96c425db72bc6e879e8445e3a3bf1f1e556b56Chris Lattner unsigned char TargetFlags = 0) const { 13231e2c7b4c13c2f31774614b1124533628958d0cdDaniel Dunbar MI->addOperand(MachineOperand::CreateES(FnName, TargetFlags)); 1339d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner return *this; 1349d4f9b990222ed46959cd0a1aef07c0923d346e6Chris Lattner } 1358cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman 1367739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen const MachineInstrBuilder &addRegMask(const uint32_t *Mask) const { 1377739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen MI->addOperand(MachineOperand::CreateRegMask(Mask)); 1387739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen return *this; 1397739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen } 1407739cad69d2590f556afc9fc3048f967b5a3f4f6Jakob Stoklund Olesen 141c76909abfec876c6b751d693ebd3df07df686aa0Dan Gohman const MachineInstrBuilder &addMemOperand(MachineMemOperand *MMO) const { 1428cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman MI->addMemOperand(*MI->getParent()->getParent(), MMO); 1438cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman return *this; 1448cf77137533f1d83f9ea0085b5ca6d241f4bab9aDan Gohman } 14597357614b5957cc167c261d3be54713802715d9aDan Gohman 146320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman const MachineInstrBuilder &setMemRefs(MachineInstr::mmo_iterator b, 147320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MachineInstr::mmo_iterator e) const { 148320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman MI->setMemRefs(b, e); 149320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return *this; 150320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 151320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 152320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 15397357614b5957cc167c261d3be54713802715d9aDan Gohman const MachineInstrBuilder &addOperand(const MachineOperand &MO) const { 154b1fb84dee9c3797ec2f2bfd2c9cf8e6ee0436487Chris Lattner MI->addOperand(MO); 15597357614b5957cc167c261d3be54713802715d9aDan Gohman return *this; 15697357614b5957cc167c261d3be54713802715d9aDan Gohman } 1575f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen 15891c38417cf11ce56b13a7434de76306f665c88c5Dale Johannesen const MachineInstrBuilder &addMetadata(const MDNode *MD) const { 1595f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen MI->addOperand(MachineOperand::CreateMetadata(MD)); 1605f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen return *this; 1615f72a5ebc84a1935878b5b2d3166a505c520cdfcDale Johannesen } 1623889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner 1633889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner const MachineInstrBuilder &addSym(MCSymbol *Sym) const { 1643889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner MI->addOperand(MachineOperand::CreateMCSymbol(Sym)); 1653889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner return *this; 1663889fac428d559e5a0b6bcbcd8a55047d3e0663eChris Lattner } 167320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman 16894c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlags(unsigned Flags) const { 16994c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlags(Flags); 17094c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 17194c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 17294c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 17394c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov const MachineInstrBuilder &setMIFlag(MachineInstr::MIFlag Flag) const { 17494c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov MI->setFlag(Flag); 17594c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov return *this; 17694c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov } 17794c1b08033b69495387a85124ca888d3c62f78c7Anton Korobeynikov 178320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman // Add a displacement from an existing MachineOperand with an added offset. 179a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng const MachineInstrBuilder &addDisp(const MachineOperand &Disp, int64_t off, 180a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng unsigned char TargetFlags = 0) const { 181320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman switch (Disp.getType()) { 182320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman default: 183320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman llvm_unreachable("Unhandled operand type in addDisp()"); 184320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman case MachineOperand::MO_Immediate: 185320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman return addImm(Disp.getImm() + off); 186a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng case MachineOperand::MO_GlobalAddress: { 187a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // If caller specifies new TargetFlags then use it, otherwise the 188a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // default behavior is to copy the target flags from the existing 189a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // MachineOperand. This means if the caller wants to clear the 190a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng // target flags it needs to do so explicitly. 191a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng if (TargetFlags) 192a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off, 193a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng TargetFlags); 194a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off, 195a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng Disp.getTargetFlags()); 196a395f4df5b6d9c2feb661091ca75be2500d07cb0Evan Cheng } 197320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 198320afb8c818b5cd5b9d4fcd0dba83ba3384ed4b4Dan Gohman } 199f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner}; 200f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 201f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// BuildMI - Builder interface. Specify how to create the initial instruction 202c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// itself. 203f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner/// 2048e5f2c6f65841542e2a7092553fe42a00048e4c7Dan Gohmaninline MachineInstrBuilder BuildMI(MachineFunction &MF, 2059bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 206e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 207e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return MachineInstrBuilder(MF.CreateMachineInstr(MCID, DL)); 208f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner} 209f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner 21091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder sets up the first operand as a 211c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Cheng/// destination virtual register. 212367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner/// 2139bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendlinginline MachineInstrBuilder BuildMI(MachineFunction &MF, 2149bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 215e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 2169bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 217e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return MachineInstrBuilder(MF.CreateMachineInstr(MCID, DL)) 218587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling .addReg(DestReg, RegState::Define); 219367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner} 220367ccab06e77247eb38b0e666425913e39b82cf0Chris Lattner 22191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 22291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 22391ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// sets up the first operand as a destination virtual register. 22491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 225c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 226c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2279bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 228e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 2299bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 230e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng MachineInstr *MI = BB.getParent()->CreateMachineInstr(MCID, DL); 231c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 232587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return MachineInstrBuilder(MI).addReg(DestReg, RegState::Define); 233c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 234c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 235ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 236ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator I, 237ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 238ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID, 239ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned DestReg) { 240ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *MI = BB.getParent()->CreateMachineInstr(MCID, DL); 241ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng BB.insert(I, MI); 242ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return MachineInstrBuilder(MI).addReg(DestReg, RegState::Define); 243ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 244ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 245ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 246ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *I, 247ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 248ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID, 249ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng unsigned DestReg) { 250ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (I->isInsideBundle()) { 251ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator MII = I; 252ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID, DestReg); 253ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 254ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 255ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::iterator MII = I; 256ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID, DestReg); 257ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 258ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 25991ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 26091ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction before the given position in the given MachineBasicBlock, and 26191ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// does NOT take a destination register. 26291ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// 263c3c106ca59e44032041414c72ce584451f1d885fChris Lattnerinline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 264c3c106ca59e44032041414c72ce584451f1d885fChris Lattner MachineBasicBlock::iterator I, 2659bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 266e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 267e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng MachineInstr *MI = BB.getParent()->CreateMachineInstr(MCID, DL); 268c3c106ca59e44032041414c72ce584451f1d885fChris Lattner BB.insert(I, MI); 269c3c106ca59e44032041414c72ce584451f1d885fChris Lattner return MachineInstrBuilder(MI); 270c3c106ca59e44032041414c72ce584451f1d885fChris Lattner} 271c3c106ca59e44032041414c72ce584451f1d885fChris Lattner 272ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 273ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator I, 274ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 275ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID) { 276ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *MI = BB.getParent()->CreateMachineInstr(MCID, DL); 277ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng BB.insert(I, MI); 278ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return MachineInstrBuilder(MI); 279ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 280ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 281ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock &BB, 282ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineInstr *I, 283ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng DebugLoc DL, 284ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng const MCInstrDesc &MCID) { 285ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng if (I->isInsideBundle()) { 286ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::instr_iterator MII = I; 287ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID); 288ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng } 289ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 290ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng MachineBasicBlock::iterator MII = I; 291ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng return BuildMI(BB, MII, DL, MCID); 292ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng} 293ddfd1377d2e4154d44dc3ad217735adc15af2e3fEvan Cheng 29491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 29591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and does NOT take a 29691ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// destination register. 2979cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 298c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 2999bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 300e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID) { 301e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return BuildMI(*BB, BB->end(), DL, MCID); 3029bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 3037db458fb0768059f050d3a0f1a26818fa8e22712Chris Lattner 30491ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// BuildMI - This version of the builder inserts the newly-built 30591ad59d75e46eafbea63fe7d4807cc1d22fac565Brian Gaeke/// instruction at the end of the given MachineBasicBlock, and sets up the first 30665b660743ccce5393f70d3667ac4e2b0b76e5236Daniel Dunbar/// operand as a destination virtual register. 3079cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner/// 308c0f64ffab93d11fb27a3b8a0707b77400918a20eEvan Chenginline MachineInstrBuilder BuildMI(MachineBasicBlock *BB, 3099bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling DebugLoc DL, 310e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng const MCInstrDesc &MCID, 3119bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling unsigned DestReg) { 312e837dead3c8dc3445ef6a0e2322179c57e264a13Evan Cheng return BuildMI(*BB, BB->end(), DL, MCID, DestReg); 3139bc96a57206cbebaa9b0ba9979f949eb10c1592cBill Wendling} 3149cc361579b6a0aad9a71dc617eedd4d909d48acfChris Lattner 315587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDefRegState(bool B) { 316587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Define : 0; 317587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 318587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getImplRegState(bool B) { 319587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Implicit : 0; 320587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 321587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getKillRegState(bool B) { 322587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Kill : 0; 323587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 324587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendlinginline unsigned getDeadRegState(bool B) { 325587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling return B ? RegState::Dead : 0; 326587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling} 3274784f1fc73abf6005b7b7262d395af71b57b1255Evan Chenginline unsigned getUndefRegState(bool B) { 3284784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng return B ? RegState::Undef : 0; 3294784f1fc73abf6005b7b7262d395af71b57b1255Evan Cheng} 3304efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooperinline unsigned getInternalReadRegState(bool B) { 3314efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper return B ? RegState::InternalRead : 0; 3324efea94fa54d0e8687b965fdf3ba46022c8e15c4Pete Cooper} 333587daedce2d6c2b2d380b6a5843a6f8b6cfc79e4Bill Wendling 334c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 335c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// Helper class for constructing bundles of MachineInstrs. 336c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// 337c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// MIBundleBuilder can create a bundle from scratch by inserting new 338c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// MachineInstrs one at a time, or it can create a bundle from a sequence of 339c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen/// existing MachineInstrs in a basic block. 340c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesenclass MIBundleBuilder { 341c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock &MBB; 342c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator Begin; 343c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator End; 344c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 345c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesenpublic: 346c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Create an MIBundleBuilder that inserts instructions into a new bundle in 347c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// BB above the bundle or instruction at Pos. 348c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder(MachineBasicBlock &BB, 349c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator Pos) 350c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen : MBB(BB), Begin(Pos.getInstrIterator()), End(Begin) {} 351c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 352c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Create a bundle from the sequence of instructions between B and E. 353c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder(MachineBasicBlock &BB, 354c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator B, 355c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::iterator E) 356c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen : MBB(BB), Begin(B.getInstrIterator()), End(E.getInstrIterator()) { 357c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen assert(B != E && "No instructions to bundle"); 358c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen ++B; 359c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen while (B != E) { 360c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineInstr *MI = B; 361c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen ++B; 362c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MI->bundleWithPred(); 363c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 364c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 365c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 366c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return true if no instructions have been inserted in this bundle yet. 367c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Empty bundles aren't representable in a MachineBasicBlock. 368c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen bool empty() const { return Begin == End; } 369c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 370c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return an iterator to the first bundled instruction. 371c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator begin() const { return Begin; } 372c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 373c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Return an iterator beyond the last bundled instruction. 374c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MachineBasicBlock::instr_iterator end() const { return End; } 375c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 376c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Insert MI into MBB by prepending it to the instructions in the bundle. 377c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// MI will become the first instruction in the bundle. 378c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder &prepend(MachineInstr *MI) { 379c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MBB.insert(Begin, MI); 380c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen if (!empty()) 381c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MI->bundleWithSucc(); 382c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen Begin = MI; 383c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen return *this; 384c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 385c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 386c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// Insert MI into MBB by appending it to the instructions in the bundle. 387c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen /// MI will become the last instruction in the bundle. 388c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MIBundleBuilder &append(MachineInstr *MI) { 389c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MBB.insert(End, MI); 390c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen if (empty()) 391c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen Begin = MI; 392c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen else 393c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen MI->bundleWithPred(); 394c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen return *this; 395c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen } 396c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen}; 397c8ce7a4bb58b9078e1ea0e362b3935f4de501e8fJakob Stoklund Olesen 398d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 399d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 400f0136b376e2ff9b816ab4cbd4ac82df87b5c52b4Chris Lattner#endif 401