[LLVMdev] struct with signed bitfield (PR17827)

Mark Lacey mark.lacey at apple.com
Fri Nov 15 19:41:34 PST 2013


On Nov 15, 2013, at 3:42 PM, Kay Tiong Khoo <kkhoo at perfwizard.com> wrote:

> I've been diagnosing this bug:
> http://llvm.org/bugs/show_bug.cgi?id=17827
> 
> Summary: I think the following program miscompiles at -O1 because the fact that 'f0' is a signed 3-bit value is lost in the unoptimized LLVM IR. How do we fix this?

I don’t have the C/C++ standards in front of me but IIRC whether a char/short/int/long/long long bitfield is signed or unsigned is implementation defined. You need to explicitly specify signed or unsigned in order to have any guarantee of the signedness, e.g. signed int.

> 
> $ cat bitfield.c
> /* %struct.S = type { i8, [3 x i8] } ??? */
> struct S {
>   int f0:3;
> } a;
> 
> int foo (int p) {
>   struct S c = a;
>   c.f0 = p & 6;
>   return c.f0 < 1;
> }
> 
> int main () {
>   return foo (4);
> }
> 
> 
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20131115/a6fbe46e/attachment.html>


More information about the llvm-dev mailing list