[llvm-dev] "Earlyclobber" but for a subset of the inputs

Quentin Colombet via llvm-dev llvm-dev at lists.llvm.org
Mon May 4 12:29:11 PDT 2020


Hi Roger,

> On May 4, 2020, at 7:58 AM, Roger Ferrer Ibáñez via llvm-dev <llvm-dev at lists.llvm.org> wrote:
> 
> Hi all,
> 
> I'm working on a target whose registers have equal-sized subregisters and all of those subregisters can be named (or the other way round: registers can be grouped into super registers).
> 
> So for instance we've got 16 registers W (as in wide) W0..W15 and 32 registers N (as in narrow) N0..N31. This way, W0 is made by grouping N0 and N1, W1 is N2 and N3, W2 is N4 and N5, ..., W15 is N30 and N31.
> 
> The target has some widening instructions that take a number of N registers and output a W register. Possible combinations are
> 
> Wdest = widen-op Nsrc1, Nsrc2
> Wdest = widen-op Wsrc1, Nsrc2
> 
> The target constraints that the output register of these instructions cannot overlap, physically, an input of a different kind (W vs N).
> 
> For instance:
> 
> W1 = widen-op N4, N5  [this is ok, W1 is (N2, N3), so no overlap]
> W1 = widen-op N3, N4 [this is wrong because W1 is (N2, N3), thus overlap]
> W1 = widen-op W1, N4 [this is OK, W1 does not overlap with N4]

It sounds like you only need the earlyclobber description for the N, N variant.
In other words, as long as you use different opcodes for widen-op NN and widen-op WN, you model exactly what you want.

What am I missing?

Cheers,
-Quentin 

> 
> I can model these constraints using @earlyclobber and it works great for the `Wdest = widen-op Nsrc1, Nsrc2` case. While correct, this is suboptimal for the `Wdest = widen-op Wsrc1, Nsrc2` case because RA will never assign registers as in:
> 
> W1 = widen-op W1, N4 [RegAlloc would do something like W3 = widen-op W1, N4]
> 
> Has anyone encountered a similar situation? Perhaps all this can be modelled in a more obvious way?
> 
> Thank you very much,
> 
> -- 
> Roger Ferrer Ibáñez
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev



More information about the llvm-dev mailing list