gcc miscompiles csum_tcpudp_magic() on ARMv5
Måns Rullgård
mans at mansr.com
Thu Dec 12 09:58:39 EST 2013
Maxime Bizon <mbizon at freebox.fr> writes:
> On Thu, 2013-12-12 at 14:42 +0000, Måns Rullgård wrote:
>>
>> Again, that's an optimisation that does not alter the semantics of the
>> code. Although the generated code looks very different, it does the
>> same thing.
>>
> It cannot do the same thing as there are possibly nothing to do after
> inline.
>
> static __attribute__((noinline)) unsigned int do_nothing(unsigned char foo)
> {
> foo += 42;
> return 0;
> }
>
> int func(int a)
> {
> return do_nothing(a);
> }
>
> 00000000 <do_nothing>:
> 0: e3a00000 mov r0, #0
> 4: e12fff1e bx lr
>
> 00000008 <func>:
> 8: e52de004 push {lr} ; (str lr, [sp, #-4]!)
> c: e24dd004 sub sp, sp, #4
> 10: e20000ff and r0, r0, #255 ; 0xff
> 14: ebfffff9 bl 0 <do_nothing>
> 18: e28dd004 add sp, sp, #4
> 1c: e8bd8000 ldmfd sp!, {pc}
>
> static inline unsigned int do_nothing(unsigned char foo)
> {
> foo += 42;
> return 0;
> }
>
> int func(int a)
> {
> return do_nothing(a);
> }
>
> 00000000 <func>:
> 0: e3a00000 mov r0, #0
> 4: e12fff1e bx lr
>
> In the first case, the compiler narrows "int a" to char and call the
> uninlined function.
>
> In the second case, there is absolutely no generated code to push any
> arguments as the function that does nothing is inlined into func().
In both cases, the effects on the global state of the program are
exactly the same. That's all that matters.
--
Måns Rullgård
mans at mansr.com
More information about the linux-arm-kernel
mailing list