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