1 //===- llvm/CodeGen/MachineInstrBundleIterator.h ----------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Defines an iterator class that bundles MachineInstr.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CODEGEN_MACHINEINSTRBUNDLEITERATOR_H
15 #define LLVM_CODEGEN_MACHINEINSTRBUNDLEITERATOR_H
17 #include "llvm/ADT/ilist.h"
22 /// MachineBasicBlock iterator that automatically skips over MIs that are
23 /// inside bundles (i.e. walk top level MIs only).
24 template <typename Ty>
25 class MachineInstrBundleIterator
26 : public std::iterator<std::bidirectional_iterator_tag, Ty, ptrdiff_t> {
27 typedef ilist_iterator<Ty> instr_iterator;
31 MachineInstrBundleIterator(instr_iterator MI) : MII(MI) {}
33 MachineInstrBundleIterator(Ty &MI) : MII(MI) {
34 assert(!MI.isBundledWithPred() && "It's not legal to initialize "
35 "MachineInstrBundleIterator with a "
38 MachineInstrBundleIterator(Ty *MI) : MII(MI) {
39 // FIXME: This conversion should be explicit.
40 assert((!MI || !MI->isBundledWithPred()) && "It's not legal to initialize "
41 "MachineInstrBundleIterator "
44 // Template allows conversion from const to nonconst.
45 template <class OtherTy>
46 MachineInstrBundleIterator(const MachineInstrBundleIterator<OtherTy> &I)
47 : MII(I.getInstrIterator()) {}
48 MachineInstrBundleIterator() : MII(nullptr) {}
50 Ty &operator*() const { return *MII; }
51 Ty *operator->() const { return &operator*(); }
53 // FIXME: This conversion should be explicit.
54 operator Ty *() const { return MII.getNodePtrUnchecked(); }
56 bool operator==(const MachineInstrBundleIterator &X) const {
59 bool operator!=(const MachineInstrBundleIterator &X) const {
60 return !operator==(X);
63 // Increment and decrement operators...
64 MachineInstrBundleIterator &operator--() {
67 while (MII->isBundledWithPred());
70 MachineInstrBundleIterator &operator++() {
71 while (MII->isBundledWithSucc())
76 MachineInstrBundleIterator operator--(int) {
77 MachineInstrBundleIterator Temp = *this;
81 MachineInstrBundleIterator operator++(int) {
82 MachineInstrBundleIterator Temp = *this;
87 instr_iterator getInstrIterator() const { return MII; }
90 } // end namespace llvm