[llvm-dev] How to change CLang struct alignment behaviour?
Tim Northover via llvm-dev
llvm-dev at lists.llvm.org
Mon May 13 11:09:23 PDT 2019
On Mon, 13 May 2019 at 18:01, Joan Lluch <joan.lluch at icloud.com> wrote:
> After looking at it a bit further, I think this is a Clang thing. Clang issues “align 2” if the struct has at least one int (2 bytes), but also if the entire struct size is multiple of 2. For example a struct with 4 char members. In these cases the LLVM backend correctly creates word sized load/stores (2 bytes).
I'm slightly surprised that it happens based purely on size, but
either way LLVM should be able to cope.
> The LLVM backend just follows what’s dictated by Clang regarding alignment and thus it creates 2 byte or 1 byte load/stores instructions accordingly. I have not found a way to override this in LLVM. Any suggestions are appreciated.
That sounds right, but I don't think it explains the shifts you
described before. It should work out a lot better than what you're
seeing. Specifically, a 3 byte struct (for example) ought to either
load i16, load i8 + stores if your target can do misaligned i16 operations.
load i8, load i8, load i8 + stores if not.
Neither of those involve shifting operations. I'd suggest breaking
just after getMemcpyLoadsAndStores and using SelectionDAG::dump to see
exactly what it's created. Then try to work out where that gets
pessimized to shifts, because it's not normal.
More information about the llvm-dev