Index: include/llvm/CodeGen/LiveInterval.h =================================================================== --- include/llvm/CodeGen/LiveInterval.h +++ include/llvm/CodeGen/LiveInterval.h @@ -605,6 +605,33 @@ /// activated in the constructor of the live range. void flushSegmentSet(); + /// Stores indexes from the input index sequence R at which this LiveRange + /// is live to the output O iterator. + /// R is a range of _ascending sorted_ _random_ access iterators + /// to the input indexes. Indexes stored at O are ascending sorted so it + /// can be used directly in the subsequent search (for example for + /// subranges). Returns true if found at least one index. + template + bool findIndexesLiveAt(Range &&R, OutputIt O) const { + assert(std::is_sorted(R.begin(), R.end())); + auto I = R.begin(), E = R.end(); + bool Found = false; + for (auto &S : segments) { + auto Lower = std::lower_bound(I, E, S.start); + if (Lower == E) + break; + auto Upper = std::upper_bound(Lower, E, S.end); + if (Upper != Lower) { + O = std::copy(Lower, Upper, O); + Found = true; + } + if (Upper == E) + break; + I = Upper; + } + return Found; + } + void print(raw_ostream &OS) const; void dump() const;