CodeGen: Turn on sentinel tracking for MachineInstr iterators
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Sun, 11 Sep 2016 16:38:18 +0000 (16:38 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Sun, 11 Sep 2016 16:38:18 +0000 (16:38 +0000)
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

llvm/include/llvm/CodeGen/MachineBasicBlock.h
llvm/include/llvm/CodeGen/MachineInstr.h
llvm/include/llvm/CodeGen/MachineInstrBundleIterator.h
llvm/lib/CodeGen/MachineBasicBlock.cpp
llvm/unittests/CodeGen/MachineInstrBundleIteratorTest.cpp

index 4f949a6..47f8dd5 100644 (file)
@@ -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;
index 0a5c7de..3870a1f 100644 (file)
@@ -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;
 
index e4c46df..6da1ef3 100644 (file)
 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;
 };
index d50f4e7..d9eef55 100644 (file)
@@ -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...");
index 857994a..738d07d 100644 (file)
@@ -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; }
 };