mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-23 06:35:25 +00:00
Tighten up the erase/remove API for bundled instructions.
Most code is oblivious to bundles and uses the MBB::iterator which only visits whole bundles. MBB::erase() operates on whole bundles at a time as before. MBB::remove() now refuses to remove bundled instructions. It is not safe to remove all instructions in a bundle without deleting them since there is no way of returning pointers to all the removed instructions. MBB::remove_instr() and MBB::erase_instr() will now update bundle flags correctly, lifting individual instructions out of bundles while leaving the remaining bundle intact. The MachineInstr convenience functions are updated so eraseFromParent() erases a whole bundle as before eraseFromBundle() erases a single instruction, leaving the rest of its bundle. removeFromParent() refuses to operate on bundled instructions, and removeFromBundle() lifts a single instruction out of its bundle. These functions will no longer accidentally split or coalesce bundles - bundle flags are updated to preserve the existing bundling, and explicit bundleWith* / unbundleFrom* functions should be used to change the instruction bundling. This API update is still a work in progress. I am going to update APIs first so they maintain bundle flags automatically when possible. Then I'll add stricter verification of the bundle flags. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@170384 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -838,46 +838,25 @@ bool MachineInstr::isIdenticalTo(const MachineInstr *Other,
|
||||
return true;
|
||||
}
|
||||
|
||||
/// removeFromParent - This method unlinks 'this' from the containing basic
|
||||
/// block, and returns it, but does not delete it.
|
||||
MachineInstr *MachineInstr::removeFromParent() {
|
||||
assert(getParent() && "Not embedded in a basic block!");
|
||||
|
||||
// If it's a bundle then remove the MIs inside the bundle as well.
|
||||
if (isBundle()) {
|
||||
MachineBasicBlock *MBB = getParent();
|
||||
MachineBasicBlock::instr_iterator MII = *this; ++MII;
|
||||
MachineBasicBlock::instr_iterator E = MBB->instr_end();
|
||||
while (MII != E && MII->isInsideBundle()) {
|
||||
MachineInstr *MI = &*MII;
|
||||
++MII;
|
||||
MBB->remove(MI);
|
||||
}
|
||||
}
|
||||
getParent()->remove(this);
|
||||
return this;
|
||||
return getParent()->remove(this);
|
||||
}
|
||||
|
||||
MachineInstr *MachineInstr::removeFromBundle() {
|
||||
assert(getParent() && "Not embedded in a basic block!");
|
||||
return getParent()->remove_instr(this);
|
||||
}
|
||||
|
||||
/// eraseFromParent - This method unlinks 'this' from the containing basic
|
||||
/// block, and deletes it.
|
||||
void MachineInstr::eraseFromParent() {
|
||||
assert(getParent() && "Not embedded in a basic block!");
|
||||
// If it's a bundle then remove the MIs inside the bundle as well.
|
||||
if (isBundle()) {
|
||||
MachineBasicBlock *MBB = getParent();
|
||||
MachineBasicBlock::instr_iterator MII = *this; ++MII;
|
||||
MachineBasicBlock::instr_iterator E = MBB->instr_end();
|
||||
while (MII != E && MII->isInsideBundle()) {
|
||||
MachineInstr *MI = &*MII;
|
||||
++MII;
|
||||
MBB->erase(MI);
|
||||
}
|
||||
}
|
||||
// Erase the individual instruction, which may itself be inside a bundle.
|
||||
getParent()->erase_instr(this);
|
||||
getParent()->erase(this);
|
||||
}
|
||||
|
||||
void MachineInstr::eraseFromBundle() {
|
||||
assert(getParent() && "Not embedded in a basic block!");
|
||||
getParent()->erase_instr(this);
|
||||
}
|
||||
|
||||
/// getNumExplicitOperands - Returns the number of non-implicit operands.
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user