[llvm-dev] Incorrect LiveRange overlap

Steve Montgomery via llvm-dev llvm-dev at lists.llvm.org
Mon Feb 1 02:21:10 PST 2016

I think there is a bug in the the code that checks whether two LiveRanges have overlapping segments that are not coalescable.

I’ve got two ranges [608r,656r:0)[656r,672r:1) and [0B,32r)[672r,688r). I don’t believe that these overlap and that is confirmed if I use LiveRange::overlaps(SlotIndex Start, SlotIndex End) to check.

However, the version of LiveRange::overlaps that takes a CoalescerPair and checks for coalescable segments thinks that these ranges _do_ overlap.

I think the problem is in the loop that advances the iterator that ends earliest. I think it should advance until J->end > I->start, not >=. That way, I think it would have the same effect as LiveRange::find() which is what I believe the code is aiming to do, just more efficiently than find().

This is causing me a problem because I sometimes get the greedy register allocator running out of registers because of spurious interference.

I’ve attached a patch which fixes things for me and would be grateful for another opinion on whether there’s a real bug here, or whether I’m misunderstanding.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: LiveInterval.cpp.diff
Type: application/octet-stream
Size: 775 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160201/6e02c534/attachment.obj>

More information about the llvm-dev mailing list