This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: question on inconsistent generated codes for builtin calls


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.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]