[cfe-dev] Alignment of bitfield structs

David Majnemer david.majnemer at gmail.com
Mon Apr 20 13:23:38 PDT 2015


I'm having trouble reproducing.  Can you please give the IR you are feeding
to InstCombine?

On Mon, Apr 20, 2015 at 6:57 AM, Bradley Smith <bradley.smith at arm.com>
wrote:

> Hi,
>
> I'm trying to fix what appears to be incorrect codegen to do with alignment
> of bitfield structs, but have hit a wall as to how to approach this. With
> the following testcase:
>
> extern struct T {
>   int b0 : 8;
>   int b1 : 24;
>   int b2 : 1;
> } g;
>
> int foo() {
>   return g.b1;
> }
>
> before optimization, Clang produces the following (for ARM, but I believe
> this is just as valid elsewhere):
>
> %struct.T = type { i40 }
>
> @g = external global %struct.T
>
> define arm_aapcscc i32 @foo() #0 {
> entry:
>   %bf.load = load i64, i64* bitcast (%struct.T* @g to i64*), align 4
>    ...
>
> This in itself seems correct, Clang has combined the bitfields into an i40
> but also noted an alignment of 4 to preserve the ABI alignment on the
> bitfield. The record layout being as below, which again, seems correct.
>
> Layout: <CGRecordLayout
>   LLVMType:%struct.T = type { i40 }
>   IsZeroInitializable:1
>   BitFields:[
>     <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:64
> StorageAlignment:4>
>     <CGBitFieldInfo Offset:8 Size:24 IsSigned:1 StorageSize:64
> StorageAlignment:4>
>     <CGBitFieldInfo Offset:32 Size:1 IsSigned:1 StorageSize:64
> StorageAlignment:4>
> ]>
>
> However, when this IR goes down to LLVM there is no context of the
> bitfields
> left so LLVM just sees an i64 load from an i40. InstCombine sees this and
> blindly (but correctly I believe, based on the information it has) converts
> this load to the ABI alignment of i64, which is now incorrect.
>
> From what I can tell there are only 2 ways to fix this, either have clang
> not combine the bitfield into an i40, or somehow pass the bitfield layout
> down to LLVM. Neither of these seem particularly easy to do, what are
> others
> thoughts on this, have I missed something? Thanks.
>
> Regards,
> Bradley Smith
>
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150420/8935bd24/attachment.html>


More information about the cfe-dev mailing list