[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