aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/CodeGen/MachineInstrBuilder.h
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2012-12-13 00:59:36 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2012-12-13 00:59:36 +0000
commit5d7802ceccdaaaec1b7612ef4adb90dbaa278ece (patch)
treeb2c6a047090ee4966448928fdeec7d59d19a7025 /include/llvm/CodeGen/MachineInstrBuilder.h
parent10bd7264598a806aced15d0b7a3a5fc6803112a1 (diff)
downloadexternal_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/MachineInstrBuilder.h')
-rw-r--r--include/llvm/CodeGen/MachineInstrBuilder.h47
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);
}
};