[PATCH] Add a case to LiveIntervalAnalysis::HandleMoveUp

Vincent Lejeune vljn at ovi.com
Tue Mar 5 11:20:28 PST 2013


I reworked my patch a bit so that it now updates the read-undef flags.
I planned to let MachineScheduler do it however updating the flag inside HandleMove allows to spot error quickier.

Can you have a look at it please ? 

Vincent



----- Mail original -----
> De : Andrew Trick <atrick at apple.com>
> À : Vincent Lejeune <vljn at ovi.com>
> Cc : Jakob Stoklund Olesen <stoklund at 2pi.dk>; "llvm-commits at cs.uiuc.edu" <llvm-commits at cs.uiuc.edu>
> Envoyé le : Mercredi 13 février 2013 0h10
> Objet : Re: [PATCH] Add a case to LiveIntervalAnalysis::HandleMoveUp
> 
> 
> On Feb 9, 2013, at 4:14 PM, Vincent Lejeune <vljn at ovi.com> wrote:
> 
>>  Hi Jakob,
>> 
>>  I'd like to reorder subregisters as part of pre RA scheduling machine 
> instruction, in order to maximise bundling opportunities later.
>>  In R600 there are 128 bits registers, Tn_XYZW, and 4 more times 32 bits 
> registers, Tn_X, Tn_Y, TnZ and Tn_W,  with n between 0 and 127 in both case.
>>  The Tn_X, Tn_Y, Tn_Z and Tn_W register are also subregister of the Tn_XYZW 
> register. They map to what the R600 doc calls "channel", that is T1_X 
> is 
>>  channel Y of register 1.
>>  The main rule to bundle instructions is that 2 instructions in a bundle 
> must write to a different channel (whose determine the ALU which will execute 
> it). 
>>  2 instructions in a bundle don't have to write to the same 128 bits 
> register.
>> 
>>  I have the following machine instructions list :
>>     %vreg234 = COPY (...);
>> 
>>  ...
>> 
>>      %vreg403:sel_x<def,read-undef> = MULADD_IEEE_eg (...); 
>>      %vreg403:sel_y<def> = MULADD_IEEE_eg (...); 
>> 
>>      %vreg234:sel_x<def> = MULADD_IEEE_eg (...);
>>      %vreg234:sel_y<def,read-undef> = MULADD_IEEE_eg (...); 
>> 
>>      %vreg234:sel_z<def,read-undef> = MULADD_IEEE_eg (...); 
>> 
>>      %vreg234:sel_w<def,read-undef> = MULADD_IEEE_eg (...); 
>>      %vreg27:sel_z<def> = COPY %vreg234:sel_z; 
>>      %vreg27:sel_w<def> = COPY %vreg234:sel_z; 
> 
> Somewhat independent from this patch, another issue is that the scheduler, 
> probably via handleMove, needs to update the read-undef flag so it always occurs 
> on the first subreg def. I think the flag is mainly for verification.
> 
> -Andy
> 
>>  If I don't change order of subreg def, this makes 3 bundles at least :
>>  (%vreg403:sel_x = ..., %vreg403:sel_y = ...)
>>  (%vreg234:sel_x = ...,%vreg234:sel_y = ...,%vreg234:sel_z = 
> ...,%vreg234:sel_w = ...) 
>>  (%vreg27:sel_z = ..., %vreg27:sel_w = ...)
>> 
>>  It is possible to use only 2 bundles if it is possible to reorder subreg 
> definition :
>> 
>>      %vreg403:sel_x<def,read-undef> = MULADD_IEEE_eg (...); 
>>      %vreg403:sel_y<def> = MULADD_IEEE_eg (...); 
>> 
>>      %vreg234:sel_z<def,read-undef> = MULADD_IEEE_eg (...); 
>>      %vreg234:sel_w<def,read-undef> = MULADD_IEEE_eg (...); 
>> 
>>  and
>> 
>> 
>>      %vreg234:sel_x<def> = MULADD_IEEE_eg (...); 
>>      %vreg234:sel_y<def,read-undef> = MULADD_IEEE_eg (...); 
>> 
>>      %vreg27:sel_z<def> = COPY %vreg234:sel_z;
>>      %vreg27:sel_w<def> = COPY %vreg234:sel_z; 
>> 
>> 
>>  which means moving the 5th and 6th instructions right before the 3rd one).
>> 
>>  However LiveIntervalAnalysis::HandleMove does not allow this move and 
> crashes with an
>>  assertion failure (either I->start <= I->end or I->end <= 
> llvm::next(I)->start is not verified ).
>>  With this patch I'd like to make HandleMove support such modification
>>  (I'd like to preserve LiveIntervalAnalysis before RA).
>> 
>> 
>>  Thank,
>>  Vincent
>> 
>> 
>>  ----- Mail original -----
>>>  De : Jakob Stoklund Olesen <stoklund at 2pi.dk>
>>>  À : Vincent Lejeune <vljn at ovi.com>
>>>  Cc : llvm-commits at cs.uiuc.edu
>>>  Envoyé le : Samedi 9 février 2013 18h19
>>>  Objet : Re: [PATCH] Add a case to LiveIntervalAnalysis::HandleMoveUp
>>> 
>>> 
>>>  On Feb 8, 2013, at 2:31 PM, Vincent Lejeune <vljn at ovi.com> wrote:
>>> 
>>>>    Some target like R600 may want to swap LiveRange order for a same 
> register.
>>>>    This happens for instance if several subregisters can be 
> independantly 
>>>  written
>>>>    to ; for instance in the case of R600, a 128 bits register is 
> composed of 4 
>>>  32
>>>>    bits subregisters that have no write order restriction. To 
> maximise VLIW 
>>>  bundle
>>>>    size and thus increase parrallelism the R600 target may swap 
> subreg 
>>>  definitions.
>>>>    This patch allows LiveIntervals to support such changes.
>>> 
>>>  Hi Vincent,
>>> 
>>>  Thanks for working on this, I think it is a useful feature.
>>> 
>>>  The live intervals maintain an SSA form on the side - all live ranges 
> must be 
>>>  dominated by their VNInfo def. That makes it a bit complicated to move 
> defs 
>>>  across other defs.
>>> 
>>>  Could you give an example of what you're trying to do, including 
>>>  before/after live intervals? Make sure your virtual register is 
> live-out of the 
>>>  basic block.
>>> 
>>>  (And please use proper punctuation in your comments).
>>> 
>>>  Thanks,
>>>  /jakob
>>> 
>> 
>>  _______________________________________________
>>  llvm-commits mailing list
>>  llvm-commits at cs.uiuc.edu
>>  http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Add-a-case-to-LiveIntervalAnalysis-HandleMove.patch
Type: application/octet-stream
Size: 7179 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130305/b787b2f0/attachment.obj>


More information about the llvm-commits mailing list