FYI, done. ;] I'll save attaching a brand new patch.<div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Jul 6, 2012 at 1:57 AM, Benjamin Kramer <span dir="ltr"><<a href="mailto:benny.kra@gmail.com" target="_blank">benny.kra@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
On 06.07.2012, at 10:28, Chandler Carruth wrote:<br>
<br>
> diff --git a/lib/CodeGen/LiveInterval.cpp b/lib/CodeGen/LiveInterval.cpp<br>
> index 3d34c08..54d120a 100644<br>
> --- a/lib/CodeGen/LiveInterval.cpp<br>
> +++ b/lib/CodeGen/LiveInterval.cpp<br>
> @@ -458,44 +458,94 @@ void LiveInterval::join(LiveInterval &Other,<br>
>    }<br>
>  }<br>
><br>
> +/// \brief Helper function for merging in another LiveInterval's ranges.<br>
> +///<br>
> +/// This is a helper routine implementing an efficient merge of another<br>
> +/// LiveIntervals ranges into the current interval. It accepts an optional<br>
> +/// value number constraint for the RHS, and a new value number to assign to<br>
> +/// each range merged into the interval.<br>
> +void LiveInterval::mergeIntervalRanges(const LiveInterval &RHS,<br>
> +                                       VNInfo *LHSValNo,<br>
> +                                       const VNInfo *RHSValNo) {<br>
> +  if (RHS.begin() == RHS.end())<br>
> +    return;<br>
> +<br>
> +  SmallVector<LiveRange, 4> NewRanges;<br>
> +  const_iterator LI = begin(), LE = end(), RI = RHS.begin(), RE = RHS.end();<br>
> +  while (true) {<br>
> +    if (LI == LE) {<br>
> +      for (; RI != RE; ++RI)<br>
> +        if (!RHSValNo || RI->valno == RHSValNo) {<br>
> +          NewRanges.push_back(*RI);<br>
> +          NewRanges.back().valno = LHSValNo;<br>
> +        }<br>
> +      break;<br>
> +    }<br>
> +    if (RI == RE) {<br>
> +      std::copy(LI, LE, std::back_inserter(NewRanges));<br>
<br>
NewRanges.append(LI, LE) would be cleaner.<br>
<br>
- Ben<br>
<br>
> +      break;<br>
> +    }<br>
> +    assert(LI != LE && RI != RE);<br>
> +<br>
> +    // Skip incoming ranges with the wrong value.<br>
> +    if (RHSValNo && RI->valno != RHSValNo) {<br>
> +      ++RI;<br>
> +      continue;<br>
> +    }<br>
> +<br>
> +    // Select the first range. We pick the earliest start point, and then the<br>
> +    // largest range.<br>
> +    bool MergeRight = *RI < *LI;<br>
> +    LiveRange R = MergeRight ? *RI : *LI;<br>
> +    if (MergeRight)<br>
> +      R.valno = LHSValNo;<br>
> +    ++(MergeRight ? RI : LI);<br>
> +<br>
> +    // Check if we have any ranges that this one might merge with.<br>
> +    if (!NewRanges.empty()) {<br>
> +      LiveRange &LastR = NewRanges.back();<br>
> +      if (R.valno == LastR.valno) {<br>
> +        // Try to merge this range into the last one.<br>
> +        if (R.start <= LastR.end) {<br>
> +          LastR.end = std::max(LastR.end, R.end);<br>
> +          continue;<br>
> +        }<br>
> +      } else {<br>
> +        // We can't merge ranges across a value number.<br>
> +        assert(R.start >= LastR.end &&<br>
> +               "Cannot overlap two LiveRanges with differing ValID's"<br>
> +               " (did you def the same reg twice in a MachineInstr?)");<br>
> +      }<br>
> +    }<br>
> +<br>
> +    // If all else fails, just append the range.<br>
> +    NewRanges.push_back(R);<br>
> +  }<br>
> +<br>
> +  // Swap the new ranges with our current ranges.<br>
> +  NewRanges.swap(ranges);<br>
> +}<br>
<div class="HOEnZb"><div class="h5">> +<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>