[LLVMdev] Incorrect loop optimization when building the Linux kernel

David Majnemer david.majnemer at gmail.com
Mon Dec 8 02:03:28 PST 2014

Nick, consider:

char a[0];
char b[0];

at run-time:
(gdb) p &a
$1 = (char (*)[]) 0x60103c
(gdb) p &b
$2 = (char (*)[]) 0x60103c

Even if this is not safe at the C or C++ level, this comparison could
return equal or not equal depending on what the linker chooses to do.

Do we have a bug in the constant folder?

On Sun, Dec 7, 2014 at 11:16 PM, Nick Lewycky <nicholas at mxc.ca> wrote:

> Chengyu Song wrote:
>> It's difficult to say without a full example, but I'm very suspicious
>>> of those global declarations. I think the compiler would be entirely
>>> justified in assuming you could *never* get from __start_builtin_fw to
>>> __end_builtin_fw, let alone on the first iteration: they're distinct
>>> array objects and by definition (within C99) can't overlap.
>> I think this should be the root cause. Once I changed the declaration to
>> pointers (instead of arrays):
>> extern struct builtin_fw* __start_builtin_fw;
>> extern struct builtin_fw* __end_builtin_fw;
>> The generated code will not skip the first comparison.
>> Sadly, Linux kernel may contain more such declarations.
> That's a great point. Maybe clang could issue a warning on these, any for
> loop that declares a pointer to the address of a non-weak object, compares
> it to a different object, and increments only the pointer (without doing
> other changes to the pointer inside the loop body). We know that's a buggy
> pattern. Could you file a feature request for this on llvm.org/bugs ?
> Nick
> _______________________________________________
> 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/20141208/e264a3c0/attachment.html>

More information about the llvm-dev mailing list