mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-27 17:31:33 +00:00
Add higher-level API for dealing with bundled MachineInstrs.
This is still a work in progress. The purpose is to make bundling and unbundling operations explicit, and to catch errors where bundles are broken or created inadvertently. The old IsInsideBundle flag is replaced by two MI flags: BundledPred which has the same meaning as IsInsideBundle, and BundledSucc which is set on instructions that are bundled with a successor. Having two flags provdes redundancy to detect when a bundle is inadvertently torn by a splice() or insert(), and it makes it possible to write bundle iterators that don't need to peek at adjacent instructions. The new flags can't be manipulated directly (once setIsInsideBundle is gone). Instead there are MI functions to make and break bundle bonds. The setIsInsideBundle function will be removed in a future commit. It should be replaced by bundleWithPred(). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@169583 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
f3c0c77bc3
commit
fad649a5b1
@ -58,8 +58,8 @@ public:
|
||||
NoFlags = 0,
|
||||
FrameSetup = 1 << 0, // Instruction is used as a part of
|
||||
// function frame setup code.
|
||||
InsideBundle = 1 << 1 // Instruction is inside a bundle (not
|
||||
// the first MI in a bundle)
|
||||
BundledPred = 1 << 1, // Instruction has bundled predecessors.
|
||||
BundledSucc = 1 << 2 // Instruction has bundled successors.
|
||||
};
|
||||
private:
|
||||
const MCInstrDesc *MCID; // Instruction descriptor.
|
||||
@ -195,22 +195,44 @@ public:
|
||||
/// The first instruction has the special opcode "BUNDLE". It's not "inside"
|
||||
/// a bundle, but the next three MIs are.
|
||||
bool isInsideBundle() const {
|
||||
return getFlag(InsideBundle);
|
||||
return getFlag(BundledPred);
|
||||
}
|
||||
|
||||
/// setIsInsideBundle - Set InsideBundle bit.
|
||||
///
|
||||
void setIsInsideBundle(bool Val = true) {
|
||||
if (Val)
|
||||
setFlag(InsideBundle);
|
||||
setFlag(BundledPred);
|
||||
else
|
||||
clearFlag(InsideBundle);
|
||||
clearFlag(BundledPred);
|
||||
}
|
||||
|
||||
/// isBundled - Return true if this instruction part of a bundle. This is true
|
||||
/// if either itself or its following instruction is marked "InsideBundle".
|
||||
bool isBundled() const;
|
||||
|
||||
/// Return true if this instruction is part of a bundle, and it is not the
|
||||
/// first instruction in the bundle.
|
||||
bool isBundledWithPred() const { return getFlag(BundledPred); }
|
||||
|
||||
/// Return true if this instruction is part of a bundle, and it is not the
|
||||
/// last instruction in the bundle.
|
||||
bool isBundledWithSucc() const { return getFlag(BundledSucc); }
|
||||
|
||||
/// Bundle this instruction with its predecessor. This can be an unbundled
|
||||
/// instruction, or it can be the first instruction in a bundle.
|
||||
void bundleWithPred();
|
||||
|
||||
/// Bundle this instruction with its successor. This can be an unbundled
|
||||
/// instruction, or it can be the last instruction in a bundle.
|
||||
void bundleWithSucc();
|
||||
|
||||
/// Break bundle above this instruction.
|
||||
void unbundleFromPred();
|
||||
|
||||
/// Break bundle below this instruction.
|
||||
void unbundleFromSucc();
|
||||
|
||||
/// getDebugLoc - Returns the debug location id of this MachineInstr.
|
||||
///
|
||||
DebugLoc getDebugLoc() const { return debugLoc; }
|
||||
|
@ -894,6 +894,38 @@ unsigned MachineInstr::getNumExplicitOperands() const {
|
||||
return NumOperands;
|
||||
}
|
||||
|
||||
void MachineInstr::bundleWithPred() {
|
||||
assert(!isBundledWithPred() && "MI is already bundled with its predecessor");
|
||||
setFlag(BundledPred);
|
||||
MachineBasicBlock::instr_iterator Pred = this;
|
||||
--Pred;
|
||||
Pred->setFlag(BundledSucc);
|
||||
}
|
||||
|
||||
void MachineInstr::bundleWithSucc() {
|
||||
assert(!isBundledWithSucc() && "MI is already bundled with its successor");
|
||||
setFlag(BundledSucc);
|
||||
MachineBasicBlock::instr_iterator Succ = this;
|
||||
++Succ;
|
||||
Succ->setFlag(BundledPred);
|
||||
}
|
||||
|
||||
void MachineInstr::unbundleFromPred() {
|
||||
assert(isBundledWithPred() && "MI isn't bundled with its predecessor");
|
||||
clearFlag(BundledPred);
|
||||
MachineBasicBlock::instr_iterator Pred = this;
|
||||
--Pred;
|
||||
Pred->clearFlag(BundledSucc);
|
||||
}
|
||||
|
||||
void MachineInstr::unbundleFromSucc() {
|
||||
assert(isBundledWithSucc() && "MI isn't bundled with its successor");
|
||||
clearFlag(BundledSucc);
|
||||
MachineBasicBlock::instr_iterator Succ = this;
|
||||
--Succ;
|
||||
Succ->clearFlag(BundledPred);
|
||||
}
|
||||
|
||||
/// isBundled - Return true if this instruction part of a bundle. This is true
|
||||
/// if either itself or its following instruction is marked "InsideBundle".
|
||||
bool MachineInstr::isBundled() const {
|
||||
|
Loading…
x
Reference in New Issue
Block a user