<div dir="ltr">I'm having trouble reproducing.  Can you please give the IR you are feeding to InstCombine?</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Apr 20, 2015 at 6:57 AM, Bradley Smith <span dir="ltr"><<a href="mailto:bradley.smith@arm.com" target="_blank">bradley.smith@arm.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi,<br>
<br>
I'm trying to fix what appears to be incorrect codegen to do with alignment<br>
of bitfield structs, but have hit a wall as to how to approach this. With<br>
the following testcase:<br>
<br>
extern struct T {<br>
  int b0 : 8;<br>
  int b1 : 24;<br>
  int b2 : 1;<br>
} g;<br>
<br>
int foo() {<br>
  return g.b1;<br>
}<br>
<br>
before optimization, Clang produces the following (for ARM, but I believe<br>
this is just as valid elsewhere):<br>
<br>
%struct.T = type { i40 }<br>
<br>
@g = external global %struct.T<br>
<br>
define arm_aapcscc i32 @foo() #0 {<br>
entry:<br>
  %bf.load = load i64, i64* bitcast (%struct.T* @g to i64*), align 4<br>
   ...<br>
<br>
This in itself seems correct, Clang has combined the bitfields into an i40<br>
but also noted an alignment of 4 to preserve the ABI alignment on the<br>
bitfield. The record layout being as below, which again, seems correct.<br>
<br>
Layout: <CGRecordLayout<br>
  LLVMType:%struct.T = type { i40 }<br>
  IsZeroInitializable:1<br>
  BitFields:[<br>
    <CGBitFieldInfo Offset:0 Size:8 IsSigned:1 StorageSize:64<br>
StorageAlignment:4><br>
    <CGBitFieldInfo Offset:8 Size:24 IsSigned:1 StorageSize:64<br>
StorageAlignment:4><br>
    <CGBitFieldInfo Offset:32 Size:1 IsSigned:1 StorageSize:64<br>
StorageAlignment:4><br>
]><br>
<br>
However, when this IR goes down to LLVM there is no context of the bitfields<br>
left so LLVM just sees an i64 load from an i40. InstCombine sees this and<br>
blindly (but correctly I believe, based on the information it has) converts<br>
this load to the ABI alignment of i64, which is now incorrect.<br>
<br>
>From what I can tell there are only 2 ways to fix this, either have clang<br>
not combine the bitfield into an i40, or somehow pass the bitfield layout<br>
down to LLVM. Neither of these seem particularly easy to do, what are others<br>
thoughts on this, have I missed something? Thanks.<br>
<br>
Regards,<br>
Bradley Smith<br>
<br>
<br>
<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@cs.uiuc.edu">cfe-dev@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br></div>