summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/ADT/ilist_iterator.h3
-rw-r--r--llvm/include/llvm/CodeGen/MachineInstrBundleIterator.h59
-rw-r--r--llvm/unittests/CodeGen/MachineInstrBundleIteratorTest.cpp16
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
OpenPOWER on IntegriCloud