Skip to content

Commit

Permalink
CodeGen: Turn on sentinel tracking for MachineInstr iterators
Browse files Browse the repository at this point in the history
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.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281168 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
dexonsmith committed Sep 11, 2016
1 parent b4bd34e commit 6037e19
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 11 deletions.
10 changes: 6 additions & 4 deletions include/llvm/CodeGen/MachineBasicBlock.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,14 @@ template <> struct ilist_traits<MachineInstr> {
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...
Expand All @@ -70,7 +72,7 @@ class MachineBasicBlock
};

private:
typedef ilist<MachineInstr> Instructions;
typedef ilist<MachineInstr, ilist_sentinel_tracking<true>> Instructions;
Instructions Insts;
const BasicBlock *BB;
int Number;
Expand Down
3 changes: 2 additions & 1 deletion include/llvm/CodeGen/MachineInstr.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
4 changes: 2 additions & 2 deletions include/llvm/CodeGen/MachineInstrBundleIterator.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};
Expand Down
6 changes: 3 additions & 3 deletions lib/CodeGen/MachineBasicBlock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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...");
Expand Down
3 changes: 2 additions & 1 deletion unittests/CodeGen/MachineInstrBundleIteratorTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
};
Expand Down

0 comments on commit 6037e19

Please sign in to comment.