[LLVMdev] Multiple connected components in live interval

Jonas Paulsson jonas.paulsson at ericsson.com
Fri Apr 17 07:17:05 PDT 2015


Hi,

thanks for answering, but the COPY is there already from after isel. It 
is a copy of a subreg, after a a call returning 64 bits.

     call <ga:@safe_div_func_uint64_t_u_u>
         %vreg45<def> = COPY %r0
         %vreg46<def> = COPY %r1
         %vreg3<def> = COPY %vreg46 <<<<<<<<<<<<<<<<<<
         ST %vreg46, %vreg0
         ST %vreg46, %vreg1
         brr_uncond <BB#4>

Does this ring any bell? Could there be any place that misses something 
about the resulting LiveInterval due to a phys reg copy?

thanks

/Jonas

PS Quentin, as I said I could not reproduce this error on any in-tree 
target.


On 2015-04-17 01:25, Quentin Colombet wrote:
> Hi Jonas,
>
> Could you file a PR with your test case please?
>
> Thanks,
> -Quentin
>> On Apr 16, 2015, at 3:50 PM, Andrew Trick <atrick at apple.com 
>> <mailto:atrick at apple.com>> wrote:
>>
>>>
>>> On Apr 16, 2015, at 6:58 AM, Jonas Paulsson 
>>> <jonas.paulsson at ericsson.com <mailto:jonas.paulsson at ericsson.com>> 
>>> wrote:
>>>
>>> Hi,
>>>
>>> I have come across a csmith generated test case that made the 
>>> MachineVerifier spit out:
>>>
>>> *** Bad machine code: Multiple connected components in live interval ***
>>>
>>> Having looked at what this might mean, it seems that 
>>> ConnectedVNInfoEqClasses::Classify() was called on the LI in 
>>> question by the verifier, and that it returned two equivalence 
>>> classes, instead of just one, which is demanded by the verifier. 
>>> Does this mean that there should never be
>>> any ValNos in a LiveInterval that are not connected? In other words 
>>> should such an LI never exist, but rather two different LIs?
>>
>> That’s right. It looks like a copy was inserted,
>>
>>> %vreg3<def> = COPY %vreg46
>>
>>
>> breaking the live interval, and a new LI was not created. Maybe the 
>> splitter did it? You would need to look at debug-only=regalloc.
>>
>> Andy
>>
>>>
>>> I have tried to run this on in-tree targets, but unfortunately they 
>>> did not reproduce the condition.
>>> I will therefore try to explain:
>>>
>>> The options to llc are -optimize-regalloc -O0. The function is 
>>> meaningless - with -O3 it just returns zero.
>>> It contains two nested loops, with a call inside the inner loop, 
>>> which is a CFG-diamond.
>>>
>>> The PHI-nodes look like this in the inner loop:
>>>
>>> BB#5:  // Inner loop header
>>>  Predecessors according to CFG: BB#1 BB#4
>>>    vreg7<def> = PHI %vreg29, <BB#1>, %vreg4, <BB#4>
>>>    ...
>>>  Successors according to CFG: BB#2 BB#6
>>>
>>> BB#2:
>>>  Predecessors according to CFG: BB#5
>>>  ...
>>>  Successors according to CFG: BB#3 BB#4
>>>
>>> BB#3:
>>>  Predecessors according to CFG: BB#2
>>>    call()
>>>     %vreg46<def> = COPY %return_reg
>>>     %vreg3<def> = COPY %vreg46;
>>>     use of %vreg 46
>>>
>>>  Successors according to CFG: BB#4
>>>
>>> BB#4:
>>>  Predecessors according to CFG: BB#2 BB#3
>>>    %vreg4<def> = PHI %vreg7, <BB#2>, %vreg3, <BB#3>
>>>  Successors according to CFG: BB#5
>>>
>>> The observation I made here is that %vreg7 and %vreg4 are sort of 
>>> nested PHI nodes, while there are no other users of the registers 
>>> than the PHI nodes themselves. There is however a use of %vreg46, 
>>> which later gets coalesced with %vreg64, which will include as well 
>>> the two PHI nodes.
>>>
>>> This is the code with the two equivalence classes, when verifier aborts:
>>>
>>> 2272B   BB#1: derived from LLVM BB %bb3
>>>           Predecessors according to CFG: BB#8
>>> 2304B           %vreg64<def> = mov 0
>>> 2448B           jmp <BB#5>
>>>           Successors according to CFG: BB#5
>>>
>>> 2592B   BB#3: derived from LLVM BB %bb6
>>>           Predecessors according to CFG: BB#2
>>> 2704B           callr <ga:@safe_div_func_uint64_t_u_u>
>>> 2736B           %vreg64<def> = COPY %return_reg
>>> 2768B           use of %vreg64
>>> 2784B           use of %vreg64
>>> 2816B           jmp <BB#4>
>>>           Successors according to CFG: BB#4
>>>
>>> *** Bad machine code: Multiple connected components in live interval ***
>>> - function:    func_61
>>> - interval:    %vreg64 [2304r,2336r:0)[2736r,2784r:3) 0 at 2304r 1 at x 
>>> 2 at x 3 at 2736r
>>> 0: valnos 0
>>> 1: valnos 1 2 3
>>> LLVM ERROR: Found 1 machine code errors.
>>>
>>> Two small live ranges of %vreg64 (originated from %vreg7 and 
>>> %vreg4), which look ok to me, but the verifier does not like it.
>>>
>>> Can anyone give me any background or any hint on what might be the 
>>> problem here?
>>>
>>> thanks,
>>>
>>> Jonas Paulsson
>>>
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu> http://llvm.cs.uiuc.edu
>>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu 
>> <mailto:LLVMdev at cs.uiuc.edu>http://llvm.cs.uiuc.edu 
>> <http://llvm.cs.uiuc.edu/>
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150417/531e02a3/attachment.html>


More information about the llvm-dev mailing list