CodeGen: Turn on sentinel tracking for MachineInstr iterators
This is a prep commit before fixing MachineBasicBlock::reverse_iterator invalidation semantics, ala r281167 for ilist::reverse_iterator. This changes MachineBasicBlock::Instructions to track which node is the sentinel regardless of LLVM_ENABLE_ABI_BREAKING_CHECKS. There's almost no functionality change (aside from ABI). However, in the rare configuration: #if !defined(NDEBUG) && !defined(LLVM_ENABLE_ABI_BREAKING_CHECKS) the isKnownSentinel() assertions in ilist_iterator<>::operator* suddenly have teeth for MachineInstr. If these assertions start firing for your out-of-tree backend, have a look at the suggestions in the commit message for r279314, and at some of the commits leading up to it that avoid dereferencing the end() iterator. llvm-svn: 281168
This commit is contained in:
parent
085bbf1e2f
commit
cc9edace0c
|
@ -43,12 +43,14 @@ private:
|
|||
friend class MachineBasicBlock; // Set by the owning MachineBasicBlock.
|
||||
MachineBasicBlock *Parent;
|
||||
|
||||
typedef simple_ilist<MachineInstr, ilist_sentinel_tracking<true>>::iterator
|
||||
instr_iterator;
|
||||
|
||||
public:
|
||||
void addNodeToList(MachineInstr *N);
|
||||
void removeNodeFromList(MachineInstr *N);
|
||||
void transferNodesFromList(ilist_traits &OldList,
|
||||
simple_ilist<MachineInstr>::iterator First,
|
||||
simple_ilist<MachineInstr>::iterator Last);
|
||||
void transferNodesFromList(ilist_traits &OldList, instr_iterator First,
|
||||
instr_iterator Last);
|
||||
|
||||
void deleteNode(MachineInstr *MI);
|
||||
// Leave out createNode...
|
||||
|
@ -70,7 +72,7 @@ public:
|
|||
};
|
||||
|
||||
private:
|
||||
typedef ilist<MachineInstr> Instructions;
|
||||
typedef ilist<MachineInstr, ilist_sentinel_tracking<true>> Instructions;
|
||||
Instructions Insts;
|
||||
const BasicBlock *BB;
|
||||
int Number;
|
||||
|
|
|
@ -50,7 +50,8 @@ class MachineMemOperand;
|
|||
/// without having their destructor called.
|
||||
///
|
||||
class MachineInstr
|
||||
: public ilist_node_with_parent<MachineInstr, MachineBasicBlock> {
|
||||
: public ilist_node_with_parent<MachineInstr, MachineBasicBlock,
|
||||
ilist_sentinel_tracking<true>> {
|
||||
public:
|
||||
typedef MachineMemOperand **mmo_iterator;
|
||||
|
||||
|
|
|
@ -20,12 +20,12 @@
|
|||
namespace llvm {
|
||||
|
||||
template <class T> struct MachineInstrBundleIteratorTraits {
|
||||
typedef simple_ilist<T> list_type;
|
||||
typedef simple_ilist<T, ilist_sentinel_tracking<true>> list_type;
|
||||
typedef typename list_type::iterator instr_iterator;
|
||||
typedef typename list_type::iterator nonconst_instr_iterator;
|
||||
};
|
||||
template <class T> struct MachineInstrBundleIteratorTraits<const T> {
|
||||
typedef simple_ilist<T> list_type;
|
||||
typedef simple_ilist<T, ilist_sentinel_tracking<true>> list_type;
|
||||
typedef typename list_type::const_iterator instr_iterator;
|
||||
typedef typename list_type::iterator nonconst_instr_iterator;
|
||||
};
|
||||
|
|
|
@ -118,9 +118,9 @@ void ilist_traits<MachineInstr>::removeNodeFromList(MachineInstr *N) {
|
|||
|
||||
/// When moving a range of instructions from one MBB list to another, we need to
|
||||
/// update the parent pointers and the use/def lists.
|
||||
void ilist_traits<MachineInstr>::transferNodesFromList(
|
||||
ilist_traits &FromList, simple_ilist<MachineInstr>::iterator First,
|
||||
simple_ilist<MachineInstr>::iterator Last) {
|
||||
void ilist_traits<MachineInstr>::transferNodesFromList(ilist_traits &FromList,
|
||||
instr_iterator First,
|
||||
instr_iterator Last) {
|
||||
assert(Parent->getParent() == FromList.Parent->getParent() &&
|
||||
"MachineInstr parent mismatch!");
|
||||
assert(this != &FromList && "Called without a real transfer...");
|
||||
|
|
|
@ -15,7 +15,8 @@ using namespace llvm;
|
|||
|
||||
namespace {
|
||||
|
||||
struct MyBundledInstr : public ilist_node<MyBundledInstr> {
|
||||
struct MyBundledInstr
|
||||
: public ilist_node<MyBundledInstr, ilist_sentinel_tracking<true>> {
|
||||
bool isBundledWithPred() const { return true; }
|
||||
bool isBundledWithSucc() const { return true; }
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue