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