LiveIntervalUnion.h revision 0e5a60b4ebc06a4fe6bb58f0200acf130d7be685
114e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//===-- LiveIntervalUnion.h - Live interval union data struct --*- C++ -*--===//
214e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//
314e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//                     The LLVM Compiler Infrastructure
414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//
514e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick// This file is distributed under the University of Illinois Open Source
614e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick// License. See LICENSE.TXT for details.
714e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//
814e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//===----------------------------------------------------------------------===//
914e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//
1014e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick// LiveIntervalUnion is a union of live segments across multiple live virtual
1114e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick// registers. This may be used during coalescing to represent a congruence
1214e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick// class, or during register allocation to model liveness of a physical
1314e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick// register.
1414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//
1514e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//===----------------------------------------------------------------------===//
1614e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
1714e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick#ifndef LLVM_CODEGEN_LIVEINTERVALUNION
1814e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick#define LLVM_CODEGEN_LIVEINTERVALUNION
1914e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
20953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen#include "llvm/ADT/IntervalMap.h"
2114e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick#include "llvm/CodeGen/LiveInterval.h"
2214e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
2314e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Tricknamespace llvm {
2414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
25ff2e9b4225ab55ee049b33158a9cce1ef138c2f7Jakob Stoklund Olesenclass MachineLoopRange;
264a84cce3ed0008baf72ccc6831a046215addd2d7Jakob Stoklund Olesenclass TargetRegisterInfo;
274a84cce3ed0008baf72ccc6831a046215addd2d7Jakob Stoklund Olesen
28071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick#ifndef NDEBUG
29071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick// forward declaration
30071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Tricktemplate <unsigned Element> class SparseBitVector;
3118c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Tricktypedef SparseBitVector<128> LiveVirtRegBitSet;
32071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick#endif
33071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick
34953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen/// Compare a live virtual register segment to a LiveIntervalUnion segment.
35953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Oleseninline bool
36953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesenoverlap(const LiveRange &VRSeg,
37953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen        const IntervalMap<SlotIndex, LiveInterval*>::const_iterator &LUSeg) {
38953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  return VRSeg.start < LUSeg.stop() && LUSeg.start() < VRSeg.end;
39953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen}
40953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen
4114e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick/// Union of live intervals that are strong candidates for coalescing into a
4214e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick/// single register (either physical or virtual depending on the context).  We
4314e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick/// expect the constituent live intervals to be disjoint, although we may
4414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick/// eventually make exceptions to handle value-based interference.
4514e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trickclass LiveIntervalUnion {
4614e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  // A set of live virtual register segments that supports fast insertion,
4718c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick  // intersection, and removal.
48953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  // Mapping SlotIndex intervals to virtual register numbers.
49953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  typedef IntervalMap<SlotIndex, LiveInterval*> LiveSegments;
5014e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
5114e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trickpublic:
5214e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  // SegmentIter can advance to the next segment ordered by starting position
5314e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  // which may belong to a different live virtual register. We also must be able
5414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  // to reach the current segment's containing virtual register.
5514e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  typedef LiveSegments::iterator SegmentIter;
5614e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
57953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  // LiveIntervalUnions share an external allocator.
58953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  typedef LiveSegments::Allocator Allocator;
59953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen
6014e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  class Query;
6114e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
6214e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trickprivate:
634f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen  unsigned Tag;           // unique tag for current contents.
64953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  LiveSegments Segments;  // union of virtual reg segments
6514e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
6614e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trickpublic:
672fd0923593c4d30691a45ade1e8b0bd484896c3fJakob Stoklund Olesen  explicit LiveIntervalUnion(Allocator &a) : Tag(0), Segments(a) {}
6814e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
69e16eecc323879744dcff4f359ba9ccdb25bd6909Andrew Trick  // Iterate over all segments in the union of live virtual registers ordered
70e16eecc323879744dcff4f359ba9ccdb25bd6909Andrew Trick  // by their starting position.
7118c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick  SegmentIter begin() { return Segments.begin(); }
7218c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick  SegmentIter end() { return Segments.end(); }
73a35cce1a14d8eee7e250e02b03903a5096d22c2fJakob Stoklund Olesen  SegmentIter find(SlotIndex x) { return Segments.find(x); }
74bfce678de7b509a497ac6d91f29e749adab7e40cJakob Stoklund Olesen  bool empty() const { return Segments.empty(); }
75bfce678de7b509a497ac6d91f29e749adab7e40cJakob Stoklund Olesen  SlotIndex startIndex() const { return Segments.start(); }
7614e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
77ff2e9b4225ab55ee049b33158a9cce1ef138c2f7Jakob Stoklund Olesen  // Provide public access to the underlying map to allow overlap iteration.
78ff2e9b4225ab55ee049b33158a9cce1ef138c2f7Jakob Stoklund Olesen  typedef LiveSegments Map;
79ff2e9b4225ab55ee049b33158a9cce1ef138c2f7Jakob Stoklund Olesen  const Map &getMap() { return Segments; }
80ff2e9b4225ab55ee049b33158a9cce1ef138c2f7Jakob Stoklund Olesen
814f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen  /// getTag - Return an opaque tag representing the current state of the union.
824f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen  unsigned getTag() const { return Tag; }
834f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen
844f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen  /// changedSince - Return true if the union change since getTag returned tag.
854f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen  bool changedSince(unsigned tag) const { return tag != Tag; }
864f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen
87e16eecc323879744dcff4f359ba9ccdb25bd6909Andrew Trick  // Add a live virtual register to this union and merge its segments.
8818c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick  void unify(LiveInterval &VirtReg);
8914e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
90e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick  // Remove a live virtual register's segments from this union.
91953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  void extract(LiveInterval &VirtReg);
9214e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
93560ab9ebf78532df11188770c916c4eb6dcce1b2Jakob Stoklund Olesen  // Remove all inserted virtual registers.
94560ab9ebf78532df11188770c916c4eb6dcce1b2Jakob Stoklund Olesen  void clear() { Segments.clear(); ++Tag; }
95560ab9ebf78532df11188770c916c4eb6dcce1b2Jakob Stoklund Olesen
964a84cce3ed0008baf72ccc6831a046215addd2d7Jakob Stoklund Olesen  // Print union, using TRI to translate register names
974a84cce3ed0008baf72ccc6831a046215addd2d7Jakob Stoklund Olesen  void print(raw_ostream &OS, const TargetRegisterInfo *TRI) const;
98071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick
99071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick#ifndef NDEBUG
100071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick  // Verify the live intervals in this union and add them to the visited set.
10118c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick  void verify(LiveVirtRegBitSet& VisitedVRegs);
102071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick#endif
103071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick
10414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  /// Query interferences between a single live virtual register and a live
10514e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  /// interval union.
10614e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  class Query {
10718c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    LiveIntervalUnion *LiveUnion;
10818c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    LiveInterval *VirtReg;
109fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen    LiveInterval::iterator VirtRegI; // current position in VirtReg
110fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen    SegmentIter LiveUnionI;          // current position in LiveUnion
11118c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    SmallVector<LiveInterval*,4> InterferingVRegs;
112a35cce1a14d8eee7e250e02b03903a5096d22c2fJakob Stoklund Olesen    bool CheckedFirstInterference;
11318c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    bool SeenAllInterferences;
11418c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    bool SeenUnspillableVReg;
1152926733240d0766fbd45df6eb609ad2328f0307dJakob Stoklund Olesen    unsigned Tag, UserTag;
11614e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
11714e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  public:
118314a3ef502c67e9be7a67c9be7ea3ecffce8298bJakob Stoklund Olesen    Query(): LiveUnion(), VirtReg(), Tag(0), UserTag(0) {}
119e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick
12018c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    Query(LiveInterval *VReg, LiveIntervalUnion *LIU):
121a0382c629093a2edd175dc256750667c296d3a43Jakob Stoklund Olesen      LiveUnion(LIU), VirtReg(VReg), CheckedFirstInterference(false),
122a0382c629093a2edd175dc256750667c296d3a43Jakob Stoklund Olesen      SeenAllInterferences(false), SeenUnspillableVReg(false)
12318c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    {}
124e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick
125e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick    void clear() {
12618c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      LiveUnion = NULL;
12718c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      VirtReg = NULL;
12818c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      InterferingVRegs.clear();
129a35cce1a14d8eee7e250e02b03903a5096d22c2fJakob Stoklund Olesen      CheckedFirstInterference = false;
13018c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      SeenAllInterferences = false;
13118c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      SeenUnspillableVReg = false;
1324f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen      Tag = 0;
1332926733240d0766fbd45df6eb609ad2328f0307dJakob Stoklund Olesen      UserTag = 0;
134e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick    }
13518c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick
1362926733240d0766fbd45df6eb609ad2328f0307dJakob Stoklund Olesen    void init(unsigned UTag, LiveInterval *VReg, LiveIntervalUnion *LIU) {
137a0382c629093a2edd175dc256750667c296d3a43Jakob Stoklund Olesen      assert(VReg && LIU && "Invalid arguments");
1382926733240d0766fbd45df6eb609ad2328f0307dJakob Stoklund Olesen      if (UserTag == UTag && VirtReg == VReg &&
1392926733240d0766fbd45df6eb609ad2328f0307dJakob Stoklund Olesen          LiveUnion == LIU && !LIU->changedSince(Tag)) {
140e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick        // Retain cached results, e.g. firstInterference.
141e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick        return;
142e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick      }
14318c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      clear();
14418c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      LiveUnion = LIU;
14518c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      VirtReg = VReg;
1464f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen      Tag = LIU->getTag();
1472926733240d0766fbd45df6eb609ad2328f0307dJakob Stoklund Olesen      UserTag = UTag;
148e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick    }
14914e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
15018c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    LiveInterval &virtReg() const {
15118c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      assert(VirtReg && "uninitialized");
15218c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      return *VirtReg;
15318c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    }
15414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
15518c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    // Does this live virtual register interfere with the union?
1569942ba9c0ed45c77298cdeb7a9326f04745d5709Jakob Stoklund Olesen    bool checkInterference() { return collectInterferingVRegs(1); }
15714e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
158f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick    // Count the virtual registers in this union that interfere with this
159f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick    // query's live virtual register, up to maxInterferingRegs.
16051458ed09e6db0e424cd528e10b879f59915abe4Jakob Stoklund Olesen    unsigned collectInterferingVRegs(unsigned MaxInterferingRegs = UINT_MAX);
161f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick
162f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick    // Was this virtual register visited during collectInterferingVRegs?
16318c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    bool isSeenInterference(LiveInterval *VReg) const;
16418c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick
16518c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    // Did collectInterferingVRegs collect all interferences?
16618c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    bool seenAllInterferences() const { return SeenAllInterferences; }
167f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick
168f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick    // Did collectInterferingVRegs encounter an unspillable vreg?
16918c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    bool seenUnspillableVReg() const { return SeenUnspillableVReg; }
170f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick
171f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick    // Vector generated by collectInterferingVRegs.
172f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick    const SmallVectorImpl<LiveInterval*> &interferingVRegs() const {
17318c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick      return InterferingVRegs;
174f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick    }
17518c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick
176ff2e9b4225ab55ee049b33158a9cce1ef138c2f7Jakob Stoklund Olesen    /// checkLoopInterference - Return true if there is interference overlapping
177ff2e9b4225ab55ee049b33158a9cce1ef138c2f7Jakob Stoklund Olesen    /// Loop.
178ff2e9b4225ab55ee049b33158a9cce1ef138c2f7Jakob Stoklund Olesen    bool checkLoopInterference(MachineLoopRange*);
179ff2e9b4225ab55ee049b33158a9cce1ef138c2f7Jakob Stoklund Olesen
18014e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  private:
1818a83d54528c197675ba0f21ebe95ac30fa3d8841Andrew Trick    Query(const Query&);          // DO NOT IMPLEMENT
1828a83d54528c197675ba0f21ebe95ac30fa3d8841Andrew Trick    void operator=(const Query&); // DO NOT IMPLEMENT
18314e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  };
1840e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen
1850e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  // Array of LiveIntervalUnions.
1860e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  class Array {
1870e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    unsigned Size;
1880e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    LiveIntervalUnion *LIUs;
1890e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  public:
1900e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    Array() : Size(0), LIUs(0) {}
1910e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    ~Array() { clear(); }
1920e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen
1930e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    // Initialize the array to have Size entries.
1940e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    // Reuse an existing allocation if the size matches.
1950e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    void init(LiveIntervalUnion::Allocator&, unsigned Size);
1960e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen
1970e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    unsigned size() const { return Size; }
1980e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen
1990e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    void clear();
2000e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen
2010e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    LiveIntervalUnion& operator[](unsigned idx) {
2020e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen      assert(idx <  Size && "idx out of bounds");
2030e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen      return LIUs[idx];
2040e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    }
2050e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  };
20614e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick};
20714e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
20814e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick} // end namespace llvm
20914e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
21014e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick#endif // !defined(LLVM_CODEGEN_LIVEINTERVALUNION)
211