diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-12-13 00:59:36 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-12-13 00:59:36 +0000 |
commit | 5d7802ceccdaaaec1b7612ef4adb90dbaa278ece (patch) | |
tree | b2c6a047090ee4966448928fdeec7d59d19a7025 /include/llvm/CodeGen | |
parent | 10bd7264598a806aced15d0b7a3a5fc6803112a1 (diff) | |
download | external_llvm-5d7802ceccdaaaec1b7612ef4adb90dbaa278ece.zip external_llvm-5d7802ceccdaaaec1b7612ef4adb90dbaa278ece.tar.gz external_llvm-5d7802ceccdaaaec1b7612ef4adb90dbaa278ece.tar.bz2 |
Express prepend and append in terms of a more generic insert().
Also add an MIBundleBuilder constructor that takes an existing bundle.
Together these functions make it possible to add instructions to
existing bundles.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170063 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen')
-rw-r--r-- | include/llvm/CodeGen/MachineInstrBuilder.h | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/include/llvm/CodeGen/MachineInstrBuilder.h b/include/llvm/CodeGen/MachineInstrBuilder.h index 408c2a8..c485112 100644 --- a/include/llvm/CodeGen/MachineInstrBuilder.h +++ b/include/llvm/CodeGen/MachineInstrBuilder.h @@ -363,6 +363,18 @@ public: } } + /// Create an MIBundleBuilder representing an existing instruction or bundle + /// that has MI as its head. + explicit MIBundleBuilder(MachineInstr *MI) + : MBB(*MI->getParent()), Begin(MI) { + MachineBasicBlock::iterator I = MI; + ++I; + End = I.getInstrIterator(); + } + + /// Return a reference to the basic block containing this bundle. + MachineBasicBlock &getMBB() const { return MBB; } + /// Return true if no instructions have been inserted in this bundle yet. /// Empty bundles aren't representable in a MachineBasicBlock. bool empty() const { return Begin == End; } @@ -373,25 +385,38 @@ public: /// Return an iterator beyond the last bundled instruction. MachineBasicBlock::instr_iterator end() const { return End; } + /// Insert MI into this bundle before I which must point to an instruction in + /// the bundle, or end(). + MIBundleBuilder &insert(MachineBasicBlock::instr_iterator I, + MachineInstr *MI) { + MBB.insert(I, MI); + if (I == Begin) { + if (!empty()) + MI->bundleWithSucc(); + Begin = MI; + return *this; + } + if (I == End) { + MI->bundleWithPred(); + return *this; + } + // MI was inserted in the middle of the bundle, so its neighbors' flags are + // already fine. Update MI's bundle flags manually. + MI->setFlag(MachineInstr::BundledPred); + MI->setFlag(MachineInstr::BundledSucc); + return *this; + } + /// Insert MI into MBB by prepending it to the instructions in the bundle. /// MI will become the first instruction in the bundle. MIBundleBuilder &prepend(MachineInstr *MI) { - MBB.insert(Begin, MI); - if (!empty()) - MI->bundleWithSucc(); - Begin = MI; - return *this; + return insert(begin(), MI); } /// Insert MI into MBB by appending it to the instructions in the bundle. /// MI will become the last instruction in the bundle. MIBundleBuilder &append(MachineInstr *MI) { - MBB.insert(End, MI); - if (empty()) - Begin = MI; - else - MI->bundleWithPred(); - return *this; + return insert(end(), MI); } }; |