diff options
-rw-r--r-- | llvm/include/llvm/ADT/ilist_iterator.h | 3 | ||||
-rw-r--r-- | llvm/include/llvm/CodeGen/MachineInstrBundleIterator.h | 59 | ||||
-rw-r--r-- | llvm/unittests/CodeGen/MachineInstrBundleIteratorTest.cpp | 16 |
3 files changed, 67 insertions, 11 deletions
diff --git a/llvm/include/llvm/ADT/ilist_iterator.h b/llvm/include/llvm/ADT/ilist_iterator.h index 4582cd5035a..9e855186526 100644 --- a/llvm/include/llvm/ADT/ilist_iterator.h +++ b/llvm/include/llvm/ADT/ilist_iterator.h @@ -160,6 +160,9 @@ public: /// Get the underlying ilist_node. node_pointer getNodePtr() const { return static_cast<node_pointer>(NodePtr); } + + /// Check for end. Only valid if ilist_sentinel_tracking<true>. + bool isEnd() const { return NodePtr ? NodePtr->isSentinel() : false; } }; template <typename From> struct simplify_type; diff --git a/llvm/include/llvm/CodeGen/MachineInstrBundleIterator.h b/llvm/include/llvm/CodeGen/MachineInstrBundleIterator.h index 6da1ef3e1d1..5c81a59e5f8 100644 --- a/llvm/include/llvm/CodeGen/MachineInstrBundleIterator.h +++ b/llvm/include/llvm/CodeGen/MachineInstrBundleIterator.h @@ -23,18 +23,20 @@ template <class T> struct MachineInstrBundleIteratorTraits { 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; + typedef typename list_type::const_iterator const_instr_iterator; }; template <class T> struct MachineInstrBundleIteratorTraits<const T> { 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; + typedef typename list_type::const_iterator const_instr_iterator; }; /// MachineBasicBlock iterator that automatically skips over MIs that are /// inside bundles (i.e. walk top level MIs only). template <typename Ty> class MachineInstrBundleIterator { - typedef typename MachineInstrBundleIteratorTraits<Ty>::instr_iterator - instr_iterator; + typedef MachineInstrBundleIteratorTraits<Ty> Traits; + typedef typename Traits::instr_iterator instr_iterator; instr_iterator MII; public: @@ -48,13 +50,18 @@ public: typedef typename instr_iterator::const_reference const_reference; private: - typedef typename std::remove_const<value_type>::type nonconst_value_type; - typedef typename MachineInstrBundleIteratorTraits<Ty>::nonconst_instr_iterator - nonconst_instr_iterator; - typedef MachineInstrBundleIterator<nonconst_value_type> nonconst_iterator; + typedef typename Traits::nonconst_instr_iterator nonconst_instr_iterator; + typedef typename Traits::const_instr_iterator const_instr_iterator; + typedef MachineInstrBundleIterator< + typename nonconst_instr_iterator::value_type> + nonconst_iterator; public: - MachineInstrBundleIterator(instr_iterator MI) : MII(MI) {} + MachineInstrBundleIterator(instr_iterator MI) : MII(MI) { + assert((!MI.getNodePtr() || MI.isEnd() || !MI->isBundledWithPred()) && + "It's not legal to initialize MachineInstrBundleIterator with a " + "bundled MI"); + } MachineInstrBundleIterator(reference MI) : MII(MI) { assert(!MI.isBundledWithPred() && "It's not legal to initialize " @@ -86,13 +93,27 @@ public: const MachineInstrBundleIterator &R) { return L.MII == R.MII; } + friend bool operator==(const MachineInstrBundleIterator &L, + const const_instr_iterator &R) { + return L.MII == R; // Avoid assertion about validity of R. + } + friend bool operator==(const const_instr_iterator &L, + const MachineInstrBundleIterator &R) { + return L == R.MII; // Avoid assertion about validity of L. + } + friend bool operator==(const MachineInstrBundleIterator &L, + const nonconst_instr_iterator &R) { + return L.MII == R; // Avoid assertion about validity of R. + } + friend bool operator==(const nonconst_instr_iterator &L, + const MachineInstrBundleIterator &R) { + return L == R.MII; // Avoid assertion about validity of L. + } friend bool operator==(const MachineInstrBundleIterator &L, const_pointer R) { - // Avoid assertion about validity of R. - return L.MII == instr_iterator(const_cast<pointer>(R)); + return L == const_instr_iterator(R); // Avoid assertion about validity of R. } friend bool operator==(const_pointer L, const MachineInstrBundleIterator &R) { - // Avoid assertion about validity of L. - return instr_iterator(const_cast<pointer>(L)) == R.MII; + return const_instr_iterator(L) == R; // Avoid assertion about validity of L. } friend bool operator==(const MachineInstrBundleIterator &L, const_reference R) { @@ -107,6 +128,22 @@ public: const MachineInstrBundleIterator &R) { return !(L == R); } + friend bool operator!=(const MachineInstrBundleIterator &L, + const const_instr_iterator &R) { + return !(L == R); + } + friend bool operator!=(const const_instr_iterator &L, + const MachineInstrBundleIterator &R) { + return !(L == R); + } + friend bool operator!=(const MachineInstrBundleIterator &L, + const nonconst_instr_iterator &R) { + return !(L == R); + } + friend bool operator!=(const nonconst_instr_iterator &L, + const MachineInstrBundleIterator &R) { + return !(L == R); + } friend bool operator!=(const MachineInstrBundleIterator &L, const_pointer R) { return !(L == R); } diff --git a/llvm/unittests/CodeGen/MachineInstrBundleIteratorTest.cpp b/llvm/unittests/CodeGen/MachineInstrBundleIteratorTest.cpp index 738d07d06a6..ca61fcbe59f 100644 --- a/llvm/unittests/CodeGen/MachineInstrBundleIteratorTest.cpp +++ b/llvm/unittests/CodeGen/MachineInstrBundleIteratorTest.cpp @@ -74,6 +74,14 @@ TEST(MachineInstrBundleIteratorTest, CompareToBundledMI) { ASSERT_FALSE(CI == &MBI); ASSERT_FALSE(CI == CMBI); ASSERT_FALSE(CI == &CMBI); + ASSERT_FALSE(MBI.getIterator() == I); + ASSERT_FALSE(CMBI.getIterator() == I); + ASSERT_FALSE(I == MBI.getIterator()); + ASSERT_FALSE(I == CMBI.getIterator()); + ASSERT_FALSE(MBI.getIterator() == CI); + ASSERT_FALSE(CMBI.getIterator() == CI); + ASSERT_FALSE(CI == MBI.getIterator()); + ASSERT_FALSE(CI == CMBI.getIterator()); ASSERT_TRUE(MBI != I); ASSERT_TRUE(&MBI != I); ASSERT_TRUE(CMBI != I); @@ -90,6 +98,14 @@ TEST(MachineInstrBundleIteratorTest, CompareToBundledMI) { ASSERT_TRUE(CI != &MBI); ASSERT_TRUE(CI != CMBI); ASSERT_TRUE(CI != &CMBI); + ASSERT_TRUE(MBI.getIterator() != I); + ASSERT_TRUE(CMBI.getIterator() != I); + ASSERT_TRUE(I != MBI.getIterator()); + ASSERT_TRUE(I != CMBI.getIterator()); + ASSERT_TRUE(MBI.getIterator() != CI); + ASSERT_TRUE(CMBI.getIterator() != CI); + ASSERT_TRUE(CI != MBI.getIterator()); + ASSERT_TRUE(CI != CMBI.getIterator()); } } // end namespace |