[LLVMdev] struct with signed bitfield (PR17827)
Henrique Santos
henrique.nazare.santos at gmail.com
Fri Nov 15 20:18:00 PST 2013
I actually think it is a problem with the optimizer like Kay first thought.
-instcombine seems turning "((x and 6) shl 5) slt 32" into "(x and 6) slt
1". If the comparison were unsigned or the shl had a nsw flag, I think this
would be okay. Since none of these is true, I don't think this
transformation is correct.
H.
On Sat, Nov 16, 2013 at 1:41 AM, Mark Lacey <mark.lacey at apple.com> wrote:
>
> 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
>
>
>
> _______________________________________________
> 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/20131116/173f9ab3/attachment.html>
More information about the llvm-dev
mailing list