[cfe-dev] Clang incorrectly optimizing out for conditional in Linux kernel

Derrick McKee via cfe-dev cfe-dev at lists.llvm.org
Mon Apr 3 08:33:57 PDT 2017


Hi,

I am trying to get the Linux kernel to compile and boot using clang.  The
code compiles fine, but the kernel does not boot.  It looks like the
following macro in mm/vmalloc.c (line 650) is optimizing out the exit
condition on the for loop:

#define llist_for_each_entry(pos, node, member)             \
    for ((pos) = llist_entry((node), typeof(*(pos)), member);   \
         &(pos)->member != NULL;                    \
         (pos) = llist_entry((pos)->member.next, typeof(*(pos)), member))

Here's the disassembly:

LLVM 4.0

ffffffff811874c3:   48 87 04 25 60 a0 0e    xchg   %rax,0xffffffff820ea060
ffffffff811874ca:   82
ffffffff811874cb:   eb 07                   jmp    ffffffff811874d4
<__purge_vmap_area_lazy+0x294>
ffffffff811874cd:   0f 1f 00                nopl   (%rax)
ffffffff811874d0:   48 8b 40 40             mov    0x40(%rax),%rax
ffffffff811874d4:   48 83 c0 c0             add    $0xffffffffffffffc0,%rax
ffffffff811874d8:   48 8b 08                mov    (%rax),%rcx
ffffffff811874db:   49 3b 4d 00             cmp    0x0(%r13),%rcx
ffffffff811874df:   73 04                   jae    ffffffff811874e5
<__purge_vmap_area_lazy+0x2a5>
ffffffff811874e1:   49 89 4d 00             mov    %rcx,0x0(%r13)
ffffffff811874e5:   48 8b 48 08             mov    0x8(%rax),%rcx
ffffffff811874e9:   49 3b 0e                cmp    (%r14),%rcx
ffffffff811874ec:   76 e2                   jbe    ffffffff811874d0
<__purge_vmap_area_lazy+0x290>
ffffffff811874ee:   49 89 0e                mov    %rcx,(%r14)
ffffffff811874f1:   eb dd                   jmp    ffffffff811874d0
<__purge_vmap_area_lazy+0x290>

GCC

ffffffff811772d6:   48 87 05 2b e7 f6 00    xchg   %rax,0xf6e72b(%rip)
  # ffffffff820e5a08 <vmap_purge_list>
ffffffff811772dd:   48 8d 58 c0             lea    -0x40(%rax),%rbx
ffffffff811772e1:   31 c9                   xor    %ecx,%ecx
ffffffff811772e3:   48 85 c0                test   %rax,%rax # <==== init
test
ffffffff811772e6:   48 89 da                mov    %rbx,%rdx
ffffffff811772e9:   0f 84 31 02 00 00       je     ffffffff81177520
<__purge_vmap_area_lazy+0x280>
ffffffff811772ef:   90                      nop
ffffffff811772f0:   48 8b 02                mov    (%rdx),%rax
ffffffff811772f3:   49 3b 45 00             cmp    0x0(%r13),%rax
ffffffff811772f7:   73 04                   jae    ffffffff811772fd
<__purge_vmap_area_lazy+0x5d>
ffffffff811772f9:   49 89 45 00             mov    %rax,0x0(%r13)
ffffffff811772fd:   48 8b 42 08             mov    0x8(%rdx),%rax
ffffffff81177301:   49 3b 06                cmp    (%r14),%rax
ffffffff81177304:   76 07                   jbe    ffffffff8117730d
<__purge_vmap_area_lazy+0x6d>
ffffffff81177306:   49 89 06                mov    %rax,(%r14)
ffffffff81177309:   48 8b 42 08             mov    0x8(%rdx),%rax
ffffffff8117730d:   48 2b 02                sub    (%rdx),%rax
ffffffff81177310:   48 c1 e8 0c             shr    $0xc,%rax
ffffffff81177314:   01 c1                   add    %eax,%ecx
ffffffff81177316:   48 8b 42 40             mov    0x40(%rdx),%rax
ffffffff8117731a:   48 85 c0                test   %rax,%rax  # <==== loop
test
ffffffff8117731d:   48 8d 50 c0             lea    -0x40(%rax),%rdx
ffffffff81177321:   75 cd                   jne    ffffffff811772f0
<__purge_vmap_area_lazy+0x50>
-- 
Derrick McKee
Ph.D. Student at Purdue University
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20170403/98424f23/attachment.html>


More information about the cfe-dev mailing list