114e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//===-- LiveIntervalUnion.cpp - Live interval union data structure --------===//
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 represents a coalesced set of live intervals. This may be
1114e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick// used during coalescing to represent a congruence class, or during register
1214e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick// allocation to model liveness of a physical register.
1314e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//
1414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick//===----------------------------------------------------------------------===//
1514e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
161ead68d769f27f6d68d4aaeffe4199fa2cacbc95Jakob Stoklund Olesen#include "llvm/CodeGen/LiveIntervalUnion.h"
17071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick#include "llvm/ADT/SparseBitVector.h"
1814e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick#include "llvm/Support/Debug.h"
1914e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick#include "llvm/Support/raw_ostream.h"
204a84cce3ed0008baf72ccc6831a046215addd2d7Jakob Stoklund Olesen#include "llvm/Target/TargetRegisterInfo.h"
21b638c789be6db2a42f5c6f4de5263021da1942a3Lang Hames#include <algorithm>
22b638c789be6db2a42f5c6f4de5263021da1942a3Lang Hames
2314e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trickusing namespace llvm;
2414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "regalloc"
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
27e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick
2814e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick// Merge a LiveInterval's segments. Guarantee no overlaps.
29ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid LiveIntervalUnion::unify(LiveInterval &VirtReg, const LiveRange &Range) {
30ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (Range.empty())
31953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    return;
324f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen  ++Tag;
3318c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick
3418c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick  // Insert each of the virtual register's live segments into the map.
35ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  LiveRange::const_iterator RegPos = Range.begin();
36ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  LiveRange::const_iterator RegEnd = Range.end();
37953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  SegmentIter SegPos = Segments.find(RegPos->start);
38953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen
3911983cd861614cd5593c628268542d2688bbe15aJakob Stoklund Olesen  while (SegPos.valid()) {
40953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    SegPos.insert(RegPos->start, RegPos->end, &VirtReg);
41953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    if (++RegPos == RegEnd)
42953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen      return;
43953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    SegPos.advanceTo(RegPos->start);
4414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  }
4511983cd861614cd5593c628268542d2688bbe15aJakob Stoklund Olesen
4611983cd861614cd5593c628268542d2688bbe15aJakob Stoklund Olesen  // We have reached the end of Segments, so it is no longer necessary to search
4711983cd861614cd5593c628268542d2688bbe15aJakob Stoklund Olesen  // for the insertion position.
4811983cd861614cd5593c628268542d2688bbe15aJakob Stoklund Olesen  // It is faster to insert the end first.
4911983cd861614cd5593c628268542d2688bbe15aJakob Stoklund Olesen  --RegEnd;
5011983cd861614cd5593c628268542d2688bbe15aJakob Stoklund Olesen  SegPos.insert(RegEnd->start, RegEnd->end, &VirtReg);
5111983cd861614cd5593c628268542d2688bbe15aJakob Stoklund Olesen  for (; RegPos != RegEnd; ++RegPos, ++SegPos)
5211983cd861614cd5593c628268542d2688bbe15aJakob Stoklund Olesen    SegPos.insert(RegPos->start, RegPos->end, &VirtReg);
5314e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick}
5414e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
55e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick// Remove a live virtual register's segments from this union.
56ebe69fe11e48d322045d5949c83283927a0d790bStephen Hinesvoid LiveIntervalUnion::extract(LiveInterval &VirtReg, const LiveRange &Range) {
57ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  if (Range.empty())
58953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    return;
594f6364fd3f2af74330b1bc4e545173af074707a5Jakob Stoklund Olesen  ++Tag;
6018c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick
61e141a4960f702bef957b28abde3801ec64e32d87Andrew Trick  // Remove each of the virtual register's live segments from the map.
62ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  LiveRange::const_iterator RegPos = Range.begin();
63ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines  LiveRange::const_iterator RegEnd = Range.end();
64953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  SegmentIter SegPos = Segments.find(RegPos->start);
65953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen
66953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  for (;;) {
67953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    assert(SegPos.value() == &VirtReg && "Inconsistent LiveInterval");
68953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    SegPos.erase();
69953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    if (!SegPos.valid())
70953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen      return;
71953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen
72953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    // Skip all segments that may have been coalesced.
73ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    RegPos = Range.advanceTo(RegPos, SegPos.start());
74953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    if (RegPos == RegEnd)
75953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen      return;
76953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen
77953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    SegPos.advanceTo(RegPos->start);
7814e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick  }
7914e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick}
8014e8d71cc945034d4ee6e76be00e00f14efac62fAndrew Trick
81071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trickvoid
824a84cce3ed0008baf72ccc6831a046215addd2d7Jakob Stoklund OlesenLiveIntervalUnion::print(raw_ostream &OS, const TargetRegisterInfo *TRI) const {
83bfce678de7b509a497ac6d91f29e749adab7e40cJakob Stoklund Olesen  if (empty()) {
84bfce678de7b509a497ac6d91f29e749adab7e40cJakob Stoklund Olesen    OS << " empty\n";
85bfce678de7b509a497ac6d91f29e749adab7e40cJakob Stoklund Olesen    return;
86bfce678de7b509a497ac6d91f29e749adab7e40cJakob Stoklund Olesen  }
874a84cce3ed0008baf72ccc6831a046215addd2d7Jakob Stoklund Olesen  for (LiveSegments::const_iterator SI = Segments.begin(); SI.valid(); ++SI) {
884314268128be6d54c9a7f0709680e5a5b40f3ab3Jakob Stoklund Olesen    OS << " [" << SI.start() << ' ' << SI.stop() << "):"
894314268128be6d54c9a7f0709680e5a5b40f3ab3Jakob Stoklund Olesen       << PrintReg(SI.value()->reg, TRI);
90071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick  }
91bfce678de7b509a497ac6d91f29e749adab7e40cJakob Stoklund Olesen  OS << '\n';
92bfce678de7b509a497ac6d91f29e749adab7e40cJakob Stoklund Olesen}
93bfce678de7b509a497ac6d91f29e749adab7e40cJakob Stoklund Olesen
94071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick#ifndef NDEBUG
95071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick// Verify the live intervals in this union and add them to the visited set.
9618c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trickvoid LiveIntervalUnion::verify(LiveVirtRegBitSet& VisitedVRegs) {
97953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen  for (SegmentIter SI = Segments.begin(); SI.valid(); ++SI)
98953af2c3c560a13bd5eeb676c128b7e362dca684Jakob Stoklund Olesen    VisitedVRegs.set(SI.value()->reg);
99071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick}
100071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick#endif //!NDEBUG
101071d1c063f1080c70a7141d947a96cf511a1ba45Andrew Trick
10218c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick// Scan the vector of interfering virtual registers in this union. Assume it's
103f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick// quite small.
10418c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trickbool LiveIntervalUnion::Query::isSeenInterference(LiveInterval *VirtReg) const {
105f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick  SmallVectorImpl<LiveInterval*>::const_iterator I =
10618c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick    std::find(InterferingVRegs.begin(), InterferingVRegs.end(), VirtReg);
10718c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick  return I != InterferingVRegs.end();
108f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick}
109f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick
1109b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen// Collect virtual registers in this union that interfere with this
11118c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick// query's live virtual register.
11218c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick//
1139b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen// The query state is one of:
1149b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen//
1159b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen// 1. CheckedFirstInterference == false: Iterators are uninitialized.
1169b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen// 2. SeenAllInterferences == true: InterferingVRegs complete, iterators unused.
1179b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen// 3. Iterators left at the last seen intersection.
118f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick//
119f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trickunsigned LiveIntervalUnion::Query::
12051458ed09e6db0e424cd528e10b879f59915abe4Jakob Stoklund OlesencollectInterferingVRegs(unsigned MaxInterferingRegs) {
121fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen  // Fast path return if we already have the desired information.
122fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen  if (SeenAllInterferences || InterferingVRegs.size() >= MaxInterferingRegs)
1239942ba9c0ed45c77298cdeb7a9326f04745d5709Jakob Stoklund Olesen    return InterferingVRegs.size();
124fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen
125fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen  // Set up iterators on the first call.
126fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen  if (!CheckedFirstInterference) {
127fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen    CheckedFirstInterference = true;
128fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen
129fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen    // Quickly skip interference check for empty sets.
130fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen    if (VirtReg->empty() || LiveUnion->empty()) {
1319b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen      SeenAllInterferences = true;
1329b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen      return 0;
133fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen    }
1349b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen
1359b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    // In most cases, the union will start before VirtReg.
1369b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    VirtRegI = VirtReg->begin();
1379b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    LiveUnionI.setMap(LiveUnion->getMap());
1389b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    LiveUnionI.find(VirtRegI->start);
139fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen  }
140fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen
14118c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick  LiveInterval::iterator VirtRegEnd = VirtReg->end();
142dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LiveInterval *RecentReg = nullptr;
1439b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen  while (LiveUnionI.valid()) {
1449b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    assert(VirtRegI != VirtRegEnd && "Reached end of VirtReg");
1459b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen
1469b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    // Check for overlapping interference.
1479b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    while (VirtRegI->start < LiveUnionI.stop() &&
1489b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen           VirtRegI->end > LiveUnionI.start()) {
1499b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen      // This is an overlap, record the interfering register.
1509b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen      LiveInterval *VReg = LiveUnionI.value();
1519b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen      if (VReg != RecentReg && !isSeenInterference(VReg)) {
1529b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen        RecentReg = VReg;
1539b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen        InterferingVRegs.push_back(VReg);
1549b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen        if (InterferingVRegs.size() >= MaxInterferingRegs)
1559b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen          return InterferingVRegs.size();
1569b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen      }
1579b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen      // This LiveUnion segment is no longer interesting.
1589b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen      if (!(++LiveUnionI).valid()) {
1599b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen        SeenAllInterferences = true;
1609b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen        return InterferingVRegs.size();
1619b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen      }
1629b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    }
163f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick
1649b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    // The iterators are now not overlapping, LiveUnionI has been advanced
1659b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    // beyond VirtRegI.
1669b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    assert(VirtRegI->end <= LiveUnionI.start() && "Expected non-overlap");
167f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick
1689b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    // Advance the iterator that ends first.
169fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen    VirtRegI = VirtReg->advanceTo(VirtRegI, LiveUnionI.start());
170fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen    if (VirtRegI == VirtRegEnd)
171f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick      break;
172f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick
1739b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    // Detect overlap, handle above.
1749b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    if (VirtRegI->start < LiveUnionI.stop())
175f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick      continue;
1769b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen
1779b7ff12dd1e5e93d3305b366f79896308bed4a60Jakob Stoklund Olesen    // Still not overlapping. Catch up LiveUnionI.
178fe026e182993a94381d197f140b19b999c3e17ecJakob Stoklund Olesen    LiveUnionI.advanceTo(VirtRegI->start);
179f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick  }
18018c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick  SeenAllInterferences = true;
18118c57a8a09a7c79fbcf4348b0ad8135246ab984fAndrew Trick  return InterferingVRegs.size();
182f4baeaf8485f01beda46d29fd55753199dc68070Andrew Trick}
183ff2e9b4225ab55ee049b33158a9cce1ef138c2f7Jakob Stoklund Olesen
1840e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesenvoid LiveIntervalUnion::Array::init(LiveIntervalUnion::Allocator &Alloc,
1850e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen                                    unsigned NSize) {
1860e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  // Reuse existing allocation.
1870e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  if (NSize == Size)
1880e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    return;
1890e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  clear();
1900e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  Size = NSize;
1910e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  LIUs = static_cast<LiveIntervalUnion*>(
1920e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    malloc(sizeof(LiveIntervalUnion)*NSize));
1930e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  for (unsigned i = 0; i != Size; ++i)
1940e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    new(LIUs + i) LiveIntervalUnion(Alloc);
1950e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen}
1960e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen
1970e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesenvoid LiveIntervalUnion::Array::clear() {
1980e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  if (!LIUs)
1990e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    return;
2000e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  for (unsigned i = 0; i != Size; ++i)
2010e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen    LIUs[i].~LiveIntervalUnion();
2020e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  free(LIUs);
2030e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen  Size =  0;
204dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  LIUs = nullptr;
2050e5a60b4ebc06a4fe6bb58f0200acf130d7be685Jakob Stoklund Olesen}
206