[LLVMdev] Req-sequence, partial defs

Jakob Stoklund Olesen stoklund at 2pi.dk
Tue Jan 24 19:16:48 PST 2012


On Jan 24, 2012, at 7:44 AM, Jonas Paulsson wrote:

>  
> Hi,
>  
> I'm having an issue with subregisters on my target.
>  
> With a pseudo that writes to a 32 bit reg:
>  
>         %vreg20<def> = toHi16_low0_pseudo %vreg2; reg32:%vreg20 hi16:%vreg2
>  
> expands to
>  
>         %vreg2<def> = COPY %a2h; hi16:%vreg2
>         %vreg43<def> = mov 0, pred:0, pred:%noreg, %ac0<imp-use>, %ac1<imp-use>; lo16:%vreg43
>         %vreg20<def> = REG_SEQUENCE %vreg2, hi16, %vreg43, lo16; reg32:%vreg20 hi16:%vreg2 lo16:%vreg43
>  
> Becomes
>  
> 16L             %vreg20:hi16<def,undef> = COPY %a2h<kill>, %vreg20<imp-def>; reg32:%vreg20
> 368L            %vreg20:lo16<def> = mov 0, pred:0, pred:%noreg, %ac0<imp-use>, %ac1<imp-use>; reg32:%vreg20
>  
> Becomes
>  
> Live Ins: %a0h %a1_32 %a2h %a3_32
>         ... (COPY coalesced as a2h is live in)
>         %a2l<def> = mov 0, pred:0, pred:%noreg, %ac0<imp-use>, %ac1<imp-use>, %a2_32<imp-use>
>  
> results in:
>  
> ** Bad machine code: Using an undefined physical register ***
> - function:    lfixedconv8
> - basic block:  0x91a1940 (BB#0)
> - instruction: %a2l<def> = mov 0, pred:0, pred:%noreg, %ac0<imp-use>, %ac1<imp-use>, %a2_32<imp-use>
> - operand 6:   %a2_32<imp-use>
>  
>  
> I cannot quite figure what's wrong here - the a2_32<imp-use> operand was added by the VirtualRegRewriter, because the partial def was not marked undef. The reason for this was that the LiveIntervalsAnalysis pass cleaned up after REG_SEQUENCE lowering by making the first occurence - when the interval for the reg was empty and thus created - an <def,undef>, but then it does not do the same for the other subreg, as at that time the interval for the reg is not empty.
>  
> Can anyone say what went wrong?

The COPY with additional <imp-def> operands shouldn't have been deleted. It should have been turned into a KILL pseudo-instruction instead, preserving the operands and the liveness of the super-register.

This bug was fixed by deleting VirtRegRewriter ;-)

/jakob

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120124/08c6f696/attachment.html>


More information about the llvm-dev mailing list