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