[LLVMdev] GCC vs. LLVM difference on simple code example
Chris Lattner
clattner at apple.com
Fri Mar 25 15:34:43 PDT 2011
On Mar 24, 2011, at 11:59 AM, Marc de Kruijf wrote:
> Hi,
>
> I have a question on why gcc and llvm-gcc compile the following simple code snippet differently:
>
> extern int a;
> extern int *b;
>
> void foo() {
> int i;
> for (i = 1; i < 100; ++i)
> a += b[i];
> }
>
> 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....
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.
-Chris
>
> Here is the x86 assembly code generated by gcc 4.5.2. The load of "b" is highlighted:
>
> .file "foo.c"
> .text
> .p2align 4,,15
> .globl foo
> .type foo, @function
> foo:
> movl b, %ecx
> movl $1, %eax
> movl a, %edx
> pushl %ebp
> movl %esp, %ebp
> .p2align 4,,7
> .p2align 3
> .L2:
> addl (%ecx,%eax,4), %edx
> addl $1, %eax
> cmpl $100, %eax
> movl %edx, a
> jne .L2
> popl %ebp
> ret
> .size foo, .-foo
> .ident "GCC: (GNU) 4.5.2"
> .section .note.GNU-stack,"", at progbits
>
> And here is the code produced by llvm-gcc 4.2.1:
>
> .file "foo.c"
> .text
> .globl foo
> .align 16, 0x90
> .type foo, at function
> foo:
> pushl %ebp
> movl %esp, %ebp
> movl $1, %eax
> movl a, %ecx
> .align 16, 0x90
> .LBB0_1:
> movl b, %edx
> addl (%edx,%eax,4), %ecx
> movl %ecx, a
> incl %eax
> cmpl $100, %eax
> jne .LBB0_1
> popl %ebp
> ret
> .Ltmp0:
> .size foo, .Ltmp0-foo
> .section .note.GNU-stack,"", at progbits
> .ident "GCC: (GNU) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build)"
>
>
> _______________________________________________
> 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/20110325/1efbfe7b/attachment.html>
More information about the llvm-dev
mailing list