diff options
author | Evan Cheng <evan.cheng@apple.com> | 2011-12-06 22:12:01 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2011-12-06 22:12:01 +0000 |
commit | 7c2a4a30e0e16762c75adacebd05ec9fcbccf16b (patch) | |
tree | ccd531b26932f56aae8b213493bc6fbbf365cd12 /lib/CodeGen/MachineInstr.cpp | |
parent | 3d5d8f6b768619ed65f79606d5c981c1e056c7e8 (diff) |
First chunk of MachineInstr bundle support.
1. Added opcode BUNDLE
2. Taught MachineInstr class to deal with bundled MIs
3. Changed MachineBasicBlock iterator to skip over bundled MIs; added an iterator to walk all the MIs
4. Taught MachineBasicBlock methods about bundled MIs
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145975 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/MachineInstr.cpp')
-rw-r--r-- | lib/CodeGen/MachineInstr.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/lib/CodeGen/MachineInstr.cpp b/lib/CodeGen/MachineInstr.cpp index b0ef9d401a..abe6645909 100644 --- a/lib/CodeGen/MachineInstr.cpp +++ b/lib/CodeGen/MachineInstr.cpp @@ -735,6 +735,20 @@ void MachineInstr::addMemOperand(MachineFunction &MF, MemRefsEnd = NewMemRefsEnd; } +bool MachineInstr::hasProperty(unsigned short MCFlag) const { + if (getOpcode() != TargetOpcode::BUNDLE) + return getDesc().getFlags() & (1 << MCFlag); + + const MachineBasicBlock *MBB = getParent(); + MachineBasicBlock::const_insn_iterator MII = *this; ++MII; + while (MII != MBB->end() && MII->isInsideBundle()) { + if (MII->getDesc().getFlags() & (1 << MCFlag)) + return true; + ++MII; + } + return false; +} + bool MachineInstr::isIdenticalTo(const MachineInstr *Other, MICheckType Check) const { // If opcodes or number of operands are not the same then the two @@ -789,6 +803,17 @@ bool MachineInstr::isIdenticalTo(const MachineInstr *Other, /// 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 (getOpcode() == TargetOpcode::BUNDLE) { + MachineBasicBlock *MBB = getParent(); + MachineBasicBlock::insn_iterator MII = *this; ++MII; + while (MII != MBB->end() && MII->isInsideBundle()) { + MachineInstr *MI = &*MII; + ++MII; + MBB->remove(MI); + } + } getParent()->remove(this); return this; } @@ -798,6 +823,16 @@ MachineInstr *MachineInstr::removeFromParent() { /// 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 (getOpcode() == TargetOpcode::BUNDLE) { + MachineBasicBlock *MBB = getParent(); + MachineBasicBlock::insn_iterator MII = *this; ++MII; + while (MII != MBB->end() && MII->isInsideBundle()) { + MachineInstr *MI = &*MII; + ++MII; + MBB->erase(MI); + } + } getParent()->erase(this); } |