[LLVMdev] Custom GEP lowering

Scott Michel scottm at aero.org
Tue Aug 28 18:15:17 PDT 2007


On Aug 28, 2007, at 7:02 AM, Dan Gohman wrote:

> On Mon, Aug 27, 2007 at 07:26:55PM -0700, Scott Michel wrote:
>> It looks like I need to be able to intercept GEP lowering (in
>> SelectionDAGLowering::visitGetElementPtr) and insert something else
>> other than the shifts and adds. The basic problem is that CellSPU
>> loads and stores on 16-byte boundaries. Consequently, the SPU backend
>> has to do the load or store differently than most normal
>> architectures that have byte-addressable operations.
>
> In TOT, load and store instructions have an alignment attribute  
> which is
> useful for addressing similar needs on other architectures. For  
> example,
> this attribute is used on x86, which also has a bunch of instructions
> which require 16-byte alignment. x86 uses it quite late, after  
> legalize,
> and I don't know if that's appropriate for the CellSPU target, but
> wherever you're doing the lowering, could you use the load and store
> alignment attribute?

I'm aware of this attribute, but it doesn't help. The underlying  
problem is that CellSPU does not know how to natively perform byte- 
level addressing. For example, here's an indexed stack instruction to  
load register $3:

	ldq	$3, 4($sp)

In reality, the "4($sp)" doesn't mean what you think it means in the  
PPC and x86 worlds: that's 4 x 16 -- load quadword (ldq) appends four  
zero bits to the right of the offset. To get at the 4th byte requires  
loading from 0($sp) and some vector shuffling. (Dan: Think about  
older Cray hardware... you'll immediately understand!)

I could try custom lowering loads and stores as an interim step and  
detect if one of the operands is really a frameindex (or global  
variable or external variable or ... <insert exhaustive list of edge  
cases here>) added to some offset. Ultimately, custom lowering GEPs  
is probably the better idea (if not a lot more work).

If I go ahead and shuffle around some code (no pun intended), would  
it worth my while to prototype some refactoring of the legalize/ 
promote/custom mess, since I'll have to touch it anyway for custom  
GEP lowering?


-scooter



More information about the llvm-dev mailing list