Home | History | Annotate | Download | only in CodeGen
      1 //===-- CodeGen/MachineInstBuilder.h - Simplify creation of MIs -*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file exposes a function named BuildMI, which is useful for dramatically
     11 // simplifying how MachineInstr's are created.  It allows use of code like this:
     12 //
     13 //   M = BuildMI(X86::ADDrr8, 2).addReg(argVal1).addReg(argVal2);
     14 //
     15 //===----------------------------------------------------------------------===//
     16 
     17 #ifndef LLVM_CODEGEN_MACHINEINSTRBUILDER_H
     18 #define LLVM_CODEGEN_MACHINEINSTRBUILDER_H
     19 
     20 #include "llvm/CodeGen/MachineFunction.h"
     21 #include "llvm/CodeGen/MachineInstrBundle.h"
     22 #include "llvm/Support/ErrorHandling.h"
     23 
     24 namespace llvm {
     25 
     26 class MCInstrDesc;
     27 class MDNode;
     28 
     29 namespace RegState {
     30   enum {
     31     Define         = 0x2,
     32     Implicit       = 0x4,
     33     Kill           = 0x8,
     34     Dead           = 0x10,
     35     Undef          = 0x20,
     36     EarlyClobber   = 0x40,
     37     Debug          = 0x80,
     38     InternalRead   = 0x100,
     39     DefineNoRead   = Define | Undef,
     40     ImplicitDefine = Implicit | Define,
     41     ImplicitKill   = Implicit | Kill
     42   };
     43 }
     44 
     45 class MachineInstrBuilder {
     46   MachineFunction *MF;
     47   MachineInstr *MI;
     48 public:
     49   MachineInstrBuilder() : MF(nullptr), MI(nullptr) {}
     50 
     51   /// Create a MachineInstrBuilder for manipulating an existing instruction.
     52   /// F must be the machine function  that was used to allocate I.
     53   MachineInstrBuilder(MachineFunction &F, MachineInstr *I) : MF(&F), MI(I) {}
     54 
     55   /// Allow automatic conversion to the machine instruction we are working on.
     56   ///
     57   operator MachineInstr*() const { return MI; }
     58   MachineInstr *operator->() const { return MI; }
     59   operator MachineBasicBlock::iterator() const { return MI; }
     60 
     61   /// addReg - Add a new virtual register operand...
     62   ///
     63   const
     64   MachineInstrBuilder &addReg(unsigned RegNo, unsigned flags = 0,
     65                               unsigned SubReg = 0) const {
     66     assert((flags & 0x1) == 0 &&
     67            "Passing in 'true' to addReg is forbidden! Use enums instead.");
     68     MI->addOperand(*MF, MachineOperand::CreateReg(RegNo,
     69                                                flags & RegState::Define,
     70                                                flags & RegState::Implicit,
     71                                                flags & RegState::Kill,
     72                                                flags & RegState::Dead,
     73                                                flags & RegState::Undef,
     74                                                flags & RegState::EarlyClobber,
     75                                                SubReg,
     76                                                flags & RegState::Debug,
     77                                                flags & RegState::InternalRead));
     78     return *this;
     79   }
     80 
     81   /// addImm - Add a new immediate operand.
     82   ///
     83   const MachineInstrBuilder &addImm(int64_t Val) const {
     84     MI->addOperand(*MF, MachineOperand::CreateImm(Val));
     85     return *this;
     86   }
     87 
     88   const MachineInstrBuilder &addCImm(const ConstantInt *Val) const {
     89     MI->addOperand(*MF, MachineOperand::CreateCImm(Val));
     90     return *this;
     91   }
     92 
     93   const MachineInstrBuilder &addFPImm(const ConstantFP *Val) const {
     94     MI->addOperand(*MF, MachineOperand::CreateFPImm(Val));
     95     return *this;
     96   }
     97 
     98   const MachineInstrBuilder &addMBB(MachineBasicBlock *MBB,
     99                                     unsigned char TargetFlags = 0) const {
    100     MI->addOperand(*MF, MachineOperand::CreateMBB(MBB, TargetFlags));
    101     return *this;
    102   }
    103 
    104   const MachineInstrBuilder &addFrameIndex(int Idx) const {
    105     MI->addOperand(*MF, MachineOperand::CreateFI(Idx));
    106     return *this;
    107   }
    108 
    109   const MachineInstrBuilder &addConstantPoolIndex(unsigned Idx,
    110                                                   int Offset = 0,
    111                                           unsigned char TargetFlags = 0) const {
    112     MI->addOperand(*MF, MachineOperand::CreateCPI(Idx, Offset, TargetFlags));
    113     return *this;
    114   }
    115 
    116   const MachineInstrBuilder &addTargetIndex(unsigned Idx, int64_t Offset = 0,
    117                                           unsigned char TargetFlags = 0) const {
    118     MI->addOperand(*MF, MachineOperand::CreateTargetIndex(Idx, Offset,
    119                                                           TargetFlags));
    120     return *this;
    121   }
    122 
    123   const MachineInstrBuilder &addJumpTableIndex(unsigned Idx,
    124                                           unsigned char TargetFlags = 0) const {
    125     MI->addOperand(*MF, MachineOperand::CreateJTI(Idx, TargetFlags));
    126     return *this;
    127   }
    128 
    129   const MachineInstrBuilder &addGlobalAddress(const GlobalValue *GV,
    130                                               int64_t Offset = 0,
    131                                           unsigned char TargetFlags = 0) const {
    132     MI->addOperand(*MF, MachineOperand::CreateGA(GV, Offset, TargetFlags));
    133     return *this;
    134   }
    135 
    136   const MachineInstrBuilder &addExternalSymbol(const char *FnName,
    137                                           unsigned char TargetFlags = 0) const {
    138     MI->addOperand(*MF, MachineOperand::CreateES(FnName, TargetFlags));
    139     return *this;
    140   }
    141 
    142   const MachineInstrBuilder &addBlockAddress(const BlockAddress *BA,
    143                                              int64_t Offset = 0,
    144                                           unsigned char TargetFlags = 0) const {
    145     MI->addOperand(*MF, MachineOperand::CreateBA(BA, Offset, TargetFlags));
    146     return *this;
    147   }
    148 
    149   const MachineInstrBuilder &addRegMask(const uint32_t *Mask) const {
    150     MI->addOperand(*MF, MachineOperand::CreateRegMask(Mask));
    151     return *this;
    152   }
    153 
    154   const MachineInstrBuilder &addMemOperand(MachineMemOperand *MMO) const {
    155     MI->addMemOperand(*MF, MMO);
    156     return *this;
    157   }
    158 
    159   const MachineInstrBuilder &setMemRefs(MachineInstr::mmo_iterator b,
    160                                         MachineInstr::mmo_iterator e) const {
    161     MI->setMemRefs(b, e);
    162     return *this;
    163   }
    164 
    165 
    166   const MachineInstrBuilder &addOperand(const MachineOperand &MO) const {
    167     MI->addOperand(*MF, MO);
    168     return *this;
    169   }
    170 
    171   const MachineInstrBuilder &addMetadata(const MDNode *MD) const {
    172     MI->addOperand(*MF, MachineOperand::CreateMetadata(MD));
    173     return *this;
    174   }
    175 
    176   const MachineInstrBuilder &addCFIIndex(unsigned CFIIndex) const {
    177     MI->addOperand(*MF, MachineOperand::CreateCFIIndex(CFIIndex));
    178     return *this;
    179   }
    180 
    181   const MachineInstrBuilder &addSym(MCSymbol *Sym) const {
    182     MI->addOperand(*MF, MachineOperand::CreateMCSymbol(Sym));
    183     return *this;
    184   }
    185 
    186   const MachineInstrBuilder &setMIFlags(unsigned Flags) const {
    187     MI->setFlags(Flags);
    188     return *this;
    189   }
    190 
    191   const MachineInstrBuilder &setMIFlag(MachineInstr::MIFlag Flag) const {
    192     MI->setFlag(Flag);
    193     return *this;
    194   }
    195 
    196   // Add a displacement from an existing MachineOperand with an added offset.
    197   const MachineInstrBuilder &addDisp(const MachineOperand &Disp, int64_t off,
    198                                      unsigned char TargetFlags = 0) const {
    199     switch (Disp.getType()) {
    200       default:
    201         llvm_unreachable("Unhandled operand type in addDisp()");
    202       case MachineOperand::MO_Immediate:
    203         return addImm(Disp.getImm() + off);
    204       case MachineOperand::MO_GlobalAddress: {
    205         // If caller specifies new TargetFlags then use it, otherwise the
    206         // default behavior is to copy the target flags from the existing
    207         // MachineOperand. This means if the caller wants to clear the
    208         // target flags it needs to do so explicitly.
    209         if (TargetFlags)
    210           return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off,
    211                                   TargetFlags);
    212         return addGlobalAddress(Disp.getGlobal(), Disp.getOffset() + off,
    213                                 Disp.getTargetFlags());
    214       }
    215     }
    216   }
    217 
    218   /// Copy all the implicit operands from OtherMI onto this one.
    219   const MachineInstrBuilder &copyImplicitOps(const MachineInstr *OtherMI) {
    220     MI->copyImplicitOps(*MF, OtherMI);
    221     return *this;
    222   }
    223 };
    224 
    225 /// BuildMI - Builder interface.  Specify how to create the initial instruction
    226 /// itself.
    227 ///
    228 inline MachineInstrBuilder BuildMI(MachineFunction &MF,
    229                                    DebugLoc DL,
    230                                    const MCInstrDesc &MCID) {
    231   return MachineInstrBuilder(MF, MF.CreateMachineInstr(MCID, DL));
    232 }
    233 
    234 /// BuildMI - This version of the builder sets up the first operand as a
    235 /// destination virtual register.
    236 ///
    237 inline MachineInstrBuilder BuildMI(MachineFunction &MF,
    238                                    DebugLoc DL,
    239                                    const MCInstrDesc &MCID,
    240                                    unsigned DestReg) {
    241   return MachineInstrBuilder(MF, MF.CreateMachineInstr(MCID, DL))
    242            .addReg(DestReg, RegState::Define);
    243 }
    244 
    245 /// BuildMI - This version of the builder inserts the newly-built
    246 /// instruction before the given position in the given MachineBasicBlock, and
    247 /// sets up the first operand as a destination virtual register.
    248 ///
    249 inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
    250                                    MachineBasicBlock::iterator I,
    251                                    DebugLoc DL,
    252                                    const MCInstrDesc &MCID,
    253                                    unsigned DestReg) {
    254   MachineFunction &MF = *BB.getParent();
    255   MachineInstr *MI = MF.CreateMachineInstr(MCID, DL);
    256   BB.insert(I, MI);
    257   return MachineInstrBuilder(MF, MI).addReg(DestReg, RegState::Define);
    258 }
    259 
    260 inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
    261                                    MachineBasicBlock::instr_iterator I,
    262                                    DebugLoc DL,
    263                                    const MCInstrDesc &MCID,
    264                                    unsigned DestReg) {
    265   MachineFunction &MF = *BB.getParent();
    266   MachineInstr *MI = MF.CreateMachineInstr(MCID, DL);
    267   BB.insert(I, MI);
    268   return MachineInstrBuilder(MF, MI).addReg(DestReg, RegState::Define);
    269 }
    270 
    271 inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
    272                                    MachineInstr *I,
    273                                    DebugLoc DL,
    274                                    const MCInstrDesc &MCID,
    275                                    unsigned DestReg) {
    276   if (I->isInsideBundle()) {
    277     MachineBasicBlock::instr_iterator MII = I;
    278     return BuildMI(BB, MII, DL, MCID, DestReg);
    279   }
    280 
    281   MachineBasicBlock::iterator MII = I;
    282   return BuildMI(BB, MII, DL, MCID, DestReg);
    283 }
    284 
    285 /// BuildMI - This version of the builder inserts the newly-built
    286 /// instruction before the given position in the given MachineBasicBlock, and
    287 /// does NOT take a destination register.
    288 ///
    289 inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
    290                                    MachineBasicBlock::iterator I,
    291                                    DebugLoc DL,
    292                                    const MCInstrDesc &MCID) {
    293   MachineFunction &MF = *BB.getParent();
    294   MachineInstr *MI = MF.CreateMachineInstr(MCID, DL);
    295   BB.insert(I, MI);
    296   return MachineInstrBuilder(MF, MI);
    297 }
    298 
    299 inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
    300                                    MachineBasicBlock::instr_iterator I,
    301                                    DebugLoc DL,
    302                                    const MCInstrDesc &MCID) {
    303   MachineFunction &MF = *BB.getParent();
    304   MachineInstr *MI = MF.CreateMachineInstr(MCID, DL);
    305   BB.insert(I, MI);
    306   return MachineInstrBuilder(MF, MI);
    307 }
    308 
    309 inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
    310                                    MachineInstr *I,
    311                                    DebugLoc DL,
    312                                    const MCInstrDesc &MCID) {
    313   if (I->isInsideBundle()) {
    314     MachineBasicBlock::instr_iterator MII = I;
    315     return BuildMI(BB, MII, DL, MCID);
    316   }
    317 
    318   MachineBasicBlock::iterator MII = I;
    319   return BuildMI(BB, MII, DL, MCID);
    320 }
    321 
    322 /// BuildMI - This version of the builder inserts the newly-built
    323 /// instruction at the end of the given MachineBasicBlock, and does NOT take a
    324 /// destination register.
    325 ///
    326 inline MachineInstrBuilder BuildMI(MachineBasicBlock *BB,
    327                                    DebugLoc DL,
    328                                    const MCInstrDesc &MCID) {
    329   return BuildMI(*BB, BB->end(), DL, MCID);
    330 }
    331 
    332 /// BuildMI - This version of the builder inserts the newly-built
    333 /// instruction at the end of the given MachineBasicBlock, and sets up the first
    334 /// operand as a destination virtual register.
    335 ///
    336 inline MachineInstrBuilder BuildMI(MachineBasicBlock *BB,
    337                                    DebugLoc DL,
    338                                    const MCInstrDesc &MCID,
    339                                    unsigned DestReg) {
    340   return BuildMI(*BB, BB->end(), DL, MCID, DestReg);
    341 }
    342 
    343 /// BuildMI - This version of the builder builds a DBG_VALUE intrinsic
    344 /// for either a value in a register or a register-indirect+offset
    345 /// address.  The convention is that a DBG_VALUE is indirect iff the
    346 /// second operand is an immediate.
    347 ///
    348 inline MachineInstrBuilder BuildMI(MachineFunction &MF,
    349                                    DebugLoc DL,
    350                                    const MCInstrDesc &MCID,
    351                                    bool IsIndirect,
    352                                    unsigned Reg,
    353                                    unsigned Offset,
    354                                    const MDNode *MD) {
    355   if (IsIndirect)
    356     return BuildMI(MF, DL, MCID)
    357       .addReg(Reg, RegState::Debug)
    358       .addImm(Offset)
    359       .addMetadata(MD);
    360   else {
    361     assert(Offset == 0 && "A direct address cannot have an offset.");
    362     return BuildMI(MF, DL, MCID)
    363       .addReg(Reg, RegState::Debug)
    364       .addReg(0U, RegState::Debug)
    365       .addMetadata(MD);
    366   }
    367 }
    368 
    369 /// BuildMI - This version of the builder builds a DBG_VALUE intrinsic
    370 /// for either a value in a register or a register-indirect+offset
    371 /// address and inserts it at position I.
    372 ///
    373 inline MachineInstrBuilder BuildMI(MachineBasicBlock &BB,
    374                                    MachineBasicBlock::iterator I,
    375                                    DebugLoc DL,
    376                                    const MCInstrDesc &MCID,
    377                                    bool IsIndirect,
    378                                    unsigned Reg,
    379                                    unsigned Offset,
    380                                    const MDNode *MD) {
    381   MachineFunction &MF = *BB.getParent();
    382   MachineInstr *MI = BuildMI(MF, DL, MCID, IsIndirect, Reg, Offset, MD);
    383   BB.insert(I, MI);
    384   return MachineInstrBuilder(MF, MI);
    385 }
    386 
    387 
    388 inline unsigned getDefRegState(bool B) {
    389   return B ? RegState::Define : 0;
    390 }
    391 inline unsigned getImplRegState(bool B) {
    392   return B ? RegState::Implicit : 0;
    393 }
    394 inline unsigned getKillRegState(bool B) {
    395   return B ? RegState::Kill : 0;
    396 }
    397 inline unsigned getDeadRegState(bool B) {
    398   return B ? RegState::Dead : 0;
    399 }
    400 inline unsigned getUndefRegState(bool B) {
    401   return B ? RegState::Undef : 0;
    402 }
    403 inline unsigned getInternalReadRegState(bool B) {
    404   return B ? RegState::InternalRead : 0;
    405 }
    406 inline unsigned getDebugRegState(bool B) {
    407   return B ? RegState::Debug : 0;
    408 }
    409 
    410 
    411 /// Helper class for constructing bundles of MachineInstrs.
    412 ///
    413 /// MIBundleBuilder can create a bundle from scratch by inserting new
    414 /// MachineInstrs one at a time, or it can create a bundle from a sequence of
    415 /// existing MachineInstrs in a basic block.
    416 class MIBundleBuilder {
    417   MachineBasicBlock &MBB;
    418   MachineBasicBlock::instr_iterator Begin;
    419   MachineBasicBlock::instr_iterator End;
    420 
    421 public:
    422   /// Create an MIBundleBuilder that inserts instructions into a new bundle in
    423   /// BB above the bundle or instruction at Pos.
    424   MIBundleBuilder(MachineBasicBlock &BB,
    425                   MachineBasicBlock::iterator Pos)
    426     : MBB(BB), Begin(Pos.getInstrIterator()), End(Begin) {}
    427 
    428   /// Create a bundle from the sequence of instructions between B and E.
    429   MIBundleBuilder(MachineBasicBlock &BB,
    430                   MachineBasicBlock::iterator B,
    431                   MachineBasicBlock::iterator E)
    432     : MBB(BB), Begin(B.getInstrIterator()), End(E.getInstrIterator()) {
    433     assert(B != E && "No instructions to bundle");
    434     ++B;
    435     while (B != E) {
    436       MachineInstr *MI = B;
    437       ++B;
    438       MI->bundleWithPred();
    439     }
    440   }
    441 
    442   /// Create an MIBundleBuilder representing an existing instruction or bundle
    443   /// that has MI as its head.
    444   explicit MIBundleBuilder(MachineInstr *MI)
    445     : MBB(*MI->getParent()), Begin(MI), End(getBundleEnd(MI)) {}
    446 
    447   /// Return a reference to the basic block containing this bundle.
    448   MachineBasicBlock &getMBB() const { return MBB; }
    449 
    450   /// Return true if no instructions have been inserted in this bundle yet.
    451   /// Empty bundles aren't representable in a MachineBasicBlock.
    452   bool empty() const { return Begin == End; }
    453 
    454   /// Return an iterator to the first bundled instruction.
    455   MachineBasicBlock::instr_iterator begin() const { return Begin; }
    456 
    457   /// Return an iterator beyond the last bundled instruction.
    458   MachineBasicBlock::instr_iterator end() const { return End; }
    459 
    460   /// Insert MI into this bundle before I which must point to an instruction in
    461   /// the bundle, or end().
    462   MIBundleBuilder &insert(MachineBasicBlock::instr_iterator I,
    463                           MachineInstr *MI) {
    464     MBB.insert(I, MI);
    465     if (I == Begin) {
    466       if (!empty())
    467         MI->bundleWithSucc();
    468       Begin = MI;
    469       return *this;
    470     }
    471     if (I == End) {
    472       MI->bundleWithPred();
    473       return *this;
    474     }
    475     // MI was inserted in the middle of the bundle, so its neighbors' flags are
    476     // already fine. Update MI's bundle flags manually.
    477     MI->setFlag(MachineInstr::BundledPred);
    478     MI->setFlag(MachineInstr::BundledSucc);
    479     return *this;
    480   }
    481 
    482   /// Insert MI into MBB by prepending it to the instructions in the bundle.
    483   /// MI will become the first instruction in the bundle.
    484   MIBundleBuilder &prepend(MachineInstr *MI) {
    485     return insert(begin(), MI);
    486   }
    487 
    488   /// Insert MI into MBB by appending it to the instructions in the bundle.
    489   /// MI will become the last instruction in the bundle.
    490   MIBundleBuilder &append(MachineInstr *MI) {
    491     return insert(end(), MI);
    492   }
    493 };
    494 
    495 } // End llvm namespace
    496 
    497 #endif
    498