<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Mar 24, 2011, at 11:59 AM, Marc de Kruijf wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Hi,<div><br></div><div>I have a question on why gcc and llvm-gcc compile the following simple code snippet differently:</div><div><br></div><div><font class="Apple-style-span" face="'courier new', monospace">extern int a;</font></div>

<div><div><font class="Apple-style-span" face="'courier new', monospace">extern int *b;</font></div><div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div><font class="Apple-style-span" face="'courier new', monospace">void foo() {</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">  int i;</font></div><div><font class="Apple-style-span" face="'courier new', monospace">  for (i = 1; i < 100; ++i) </font></div><div>

<font class="Apple-style-span" face="'courier new', monospace">    a += b[i];</font></div><div><font class="Apple-style-span" face="'courier new', monospace">}</font></div><div><br></div></div><div>gcc compiles this function hoisting the load of the global variable "b" outside of the loop, while llvm-gcc keeps it inside the loop.  This results in slower code on the part of llvm-gcc, and I'm wondering why this choice is made?  Is it because of the memory consistency model?  With respect to memory consistency, does the C standard say whether a global variable used inside a function is loaded at the point of the use(s), or whether it can be loaded by the compiler earlier in the function?  I had always thought that it was legal to hoist the load of a global variable outside of the loop as long as it was not declared volatile....</div></blockquote><div><br></div>The difference here is that llvm-gcc doesn't support the "-fstrict-aliasing" flag.  If you pass  -fno-strict-aliasing to gcc, you'll probably get similar code to llvm-gcc.  Note that clang does support -fstrict-aliasing.</div><div><br></div><div>-Chris</div><div><br><blockquote type="cite">

<div><br></div><div>Here is the x86 assembly code generated by gcc 4.5.2.  The load of "b" is highlighted:</div><div><font class="Apple-style-span" face="'courier new', monospace"><br></font></div><div>
<div>
<font class="Apple-style-span" face="'courier new', monospace">        .file   "foo.c"</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        .text</font></div><div>

<font class="Apple-style-span" face="'courier new', monospace">        .p2align 4,,15</font></div><div><font class="Apple-style-span" face="'courier new', monospace">.globl foo</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        .type   foo, @function</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">foo:</font></div><div><font class="Apple-style-span" face="'courier new', monospace" color="#CC0000"><b>        movl    b, %ecx</b></font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        movl    $1, %eax</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        movl    a, %edx</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        pushl   %ebp</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        movl    %esp, %ebp</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        .p2align 4,,7</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        .p2align 3</font></div><div>

<font class="Apple-style-span" face="'courier new', monospace">.L2:</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        addl    (%ecx,%eax,4), %edx</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        addl    $1, %eax</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        cmpl    $100, %eax</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        movl    %edx, a</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        jne     .L2</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        popl    %ebp</font></div><div>

<font class="Apple-style-span" face="'courier new', monospace">        ret</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        .size   foo, .-foo</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        .ident  "GCC: (GNU) 4.5.2"</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        .section        .note.GNU-stack,"",@progbits</font></div></div><div><br></div><div>And here is the code produced by llvm-gcc 4.2.1:</div>

<div><br></div><div><div><font class="Apple-style-span" face="'courier new', monospace">        .file   "foo.c"</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        .text</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        .globl  foo</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        .align  16, 0x90</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        .type   foo,@function</font></div><div><font class="Apple-style-span" face="'courier new', monospace">foo:</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        pushl   %ebp</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        movl    %esp, %ebp</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        movl    $1, %eax</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        movl    a, %ecx</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        .align  16, 0x90</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">.LBB0_1:</font></div><div><font class="Apple-style-span" face="'courier new', monospace" color="#CC0000"><b>        movl    b, %edx</b></font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        addl    (%edx,%eax,4), %ecx</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        movl    %ecx, a</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        incl    %eax</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        cmpl    $100, %eax</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        jne     .LBB0_1</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        popl    %ebp</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        ret</font></div><div><font class="Apple-style-span" face="'courier new', monospace">.Ltmp0:</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        .size   foo, .Ltmp0-foo</font></div>

<div><font class="Apple-style-span" face="'courier new', monospace">        .section        .note.GNU-stack,"",@progbits</font></div><div><font class="Apple-style-span" face="'courier new', monospace">        .ident  "GCC: (GNU) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build)"</font></div>

</div><div><br></div><div><br></div>
_______________________________________________<br>LLVM Developers mailing list<br><a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a><br><a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br></blockquote></div><br></body></html>