Steve Montgomery via llvm-dev
2016-Feb-01 10:21 UTC
[llvm-dev] Incorrect LiveRange overlap
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. Steve -------------- 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>