[PATCH] Add a case to LiveIntervalAnalysis::HandleMoveUp
Andrew Trick
atrick at apple.com
Tue Feb 12 15:10:08 PST 2013
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
More information about the llvm-commits
mailing list