void IceLiveRange::addSegment(int Start, int End) { #ifdef USE_SET RangeElementType Element(Start, End); RangeType::iterator Next = Range.lower_bound(Element); assert(Next == Range.upper_bound(Element)); // Element not already present // Beginning of code that merges contiguous segments. TODO: change // "if(true)" to "if(false)" to see if this extra optimization code // gives any performance gain, or is just destabilizing. if (true) { RangeType::iterator FirstDelete = Next; RangeType::iterator Prev = Next; bool hasPrev = (Next != Range.begin()); bool hasNext = (Next != Range.end()); if (hasPrev) --Prev; // See if Element and Next should be joined. if (hasNext && End == Next->first) { Element.second = Next->second; ++Next; } // See if Prev and Element should be joined. if (hasPrev && Prev->second == Start) { Element.first = Prev->first; FirstDelete = Prev; } Range.erase(FirstDelete, Next); } // End of code that merges contiguous segments. Range.insert(Next, Element); #else if (Range.empty()) { Range.push_back(RangeElementType(Start, End)); return; } // Special case for faking in-arg liveness. if (End < Range.front().first) { assert(Start < 0); Range.push_front(RangeElementType(Start, End)); return; } int CurrentEnd = Range.back().second; assert(Start >= CurrentEnd); // Check for merge opportunity. if (Start == CurrentEnd) { Range.back().second = End; return; } Range.push_back(RangeElementType(Start, End)); #endif }
void LiveRange::addSegment(InstNumberT Start, InstNumberT End, CfgNode *Node) { if (getFlags().getSplitGlobalVars()) { // Disable merging to make sure a live range 'segment' has a single node. // Might be possible to enable when the target segment has the same node. assert(NodeMap.find(Start) == NodeMap.end()); NodeMap[Start] = Node; } else { if (!Range.empty()) { // Check for merge opportunity. InstNumberT CurrentEnd = Range.back().second; assert(Start >= CurrentEnd); if (Start == CurrentEnd) { Range.back().second = End; return; } } } Range.push_back(RangeElementType(Start, End)); }