question on inconsistent generated codes for builtin calls
Richard Guenther
richard.guenther@gmail.com
Fri Jan 13 14:17:00 GMT 2012
On Fri, Jan 13, 2012 at 9:04 AM, Amker.Cheng <amker.cheng@gmail.com> wrote:
> Hi,
> I noticed gcc generates inconsistent codes for same function for builtin calls.
>
> compile following program:
> ----------------------------------------------
> #include <math.h>
> int a(float x) {
> return sqrtf(x);
> }
> int b(float x) {
> return sqrtf(x);
> }
>
> With command:
> arm-none-eabi-gcc -mthumb -mhard-float -mfpu=fpv4-sp-d16
> -mcpu=cortex-m4 -O0 -S a.c -o a.S
>
> The generated assembly codes is like:
> ----------------------------------------------
> a:
> @ args = 0, pretend = 0, frame = 8
> @ frame_needed = 1, uses_anonymous_args = 0
> push {r7, lr}
> sub sp, sp, #8
> add r7, sp, #0
> fsts s0, [r7, #4]
> flds s15, [r7, #4]
> fsqrts s15, s15
> fcmps s15, s15
> fmstat
> beq .L2
> flds s0, [r7, #4]
> bl sqrtf
> fcpys s15, s0
> .L2:
> ftosizs s15, s15
> fmrs r3, s15 @ int
> mov r0, r3
> add r7, r7, #8
> mov sp, r7
> pop {r7, pc}
> .size a, .-a
> .align 2
> .global b
> .thumb
> .thumb_func
> .type b, %function
> b:
> @ args = 0, pretend = 0, frame = 8
> @ frame_needed = 1, uses_anonymous_args = 0
> push {r7, lr}
> sub sp, sp, #8
> add r7, sp, #0
> fsts s0, [r7, #4]
> flds s0, [r7, #4]
> bl sqrtf
> fcpys s15, s0
> ftosizs s15, s15
> fmrs r3, s15 @ int
> mov r0, r3
> add r7, r7, #8
> mov sp, r7
> pop {r7, pc}
> .size b, .-b
>
>
> The cause is in function expand_builtin, gcc checks following conditions:
> ----------------------------------------------
> /* When not optimizing, generate calls to library functions for a certain
> set of builtins. */
> if (!optimize
> && !called_as_built_in (fndecl)
> && DECL_ASSEMBLER_NAME_SET_P (fndecl)
> && fcode != BUILT_IN_ALLOCA
> && fcode != BUILT_IN_ALLOCA_WITH_ALIGN
> && fcode != BUILT_IN_FREE)
> return expand_call (exp, target, ignore);
>
> The control flow is:
> 1, DECL_ASSEMBLER_NAME_SET_P (fndecl) is false at the first time when
> compiling a;
> 2, It is then set in following codes when expanding sqrtf call in function a;
> 3, When compiling function b, gcc checks DECL_ASSEMBLER_NAME_SET_P (fndecl)
> again and this time it's true;
>
> I am a little confused why we check DECL_ASSEMBLER_NAME_SET_P here.
> Does it have special meaning?
No, I think the check is superfluous and should be removed. I also wonder
why we exempt BUILT_IN_FREE here ... can you dig in SVN history a bit?
For both things?
Thanks,
Richard.
> Thanks in advance.
>
> --
> Best Regards.
More information about the Gcc
mailing list