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