This is the mail archive of the
mailing list for the GCC project.
Re: How to control GCC builtin functions optimization
- From: Cao jin <caoj dot fnst at cn dot fujitsu dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: <gcc-help at gcc dot gnu dot org>
- Date: Fri, 11 Jan 2019 19:04:53 +0800
- Subject: Re: How to control GCC builtin functions optimization
- References: <email@example.com> <20190111091201.GG30353@tucnak>
On 1/11/19 5:12 PM, Jakub Jelinek wrote:
> Removing gcc@ , as this is not relevant to GCC development.
> On Fri, Jan 11, 2019 at 11:03:35AM +0800, Cao jin wrote:
>> (pls CC me when replying because I am not subscriber)
>> I met an interesting phenomenon when looking into linux kernel
>> compilation, it can be simply summarized as following: in
>> arch/x86/boot/compressed, memcpy is defined as __builtin_memcpy, while
>> also implemented as a function. But when using memcpy, in some case GCC
>> optimize it to inline code, in other case GCC just emit a call to
>> self-defined memcpy function. This can be confirmed according to the
>> symbol table via `nm bluh.o`.
>> The compiling flags is, for example:
>> cmd_arch/x86/boot/compressed/pgtable_64.o := gcc
>> -Wp,-MD,arch/x86/boot/compressed/.pgtable_64.o.d -nostdinc -isystem
>> /usr/lib/gcc/x86_64-redhat-linux/8/include -I./arch/x86/include
>> -I./arch/x86/include/gene rated -I./include
>> -I./arch/x86/include/uapi -I./arch/x86/include/generated/uapi
>> -I./include/uapi -I./include/generated/uapi -include
>> ./include/linux/kconfig.h -include ./include/linux/compiler_types.h
>> -D__KERNEL__ -DCONFIG_CC_STACKPROTECTOR -m64 -O2 -fno-strict-aliasing
>> -fPIE -DDISABLE_BRANCH_PROFILING -mcmodel=small -mno-mmx -mno-sse
>> -ffreestanding -fno-stack-protector -DKBUILD_BASENAME='"pgtable_64"'
>> -DKBUILD_MODNAME='"pgtable_64"' -c -o
>> arch/x86/boot/compressed/pgtable_64.o arch/x86/boot/compressed/pgtable_64.c
>> Now the questions is: from code-reading, it is kind of non-intuitive, is
>> there any explicit way to control the optimization behavior accurately?
> memcpy and __builtin_memcpy are the same thing, ditto for other builtins
> that have a library counterpart. The difference in between them is in
> 1) __builtin_* doesn't need to be prototyped
> 2) __builtin_* works even with -fno-builtin-memcpy or -fno-builtin
> Otherwise, if memcpy acts as a builtin, they do the same thing.
> You can control how memcpy is expanded through various command line
> switches, -Os affects it, on x86 e.g. -mstringop-strategy=,
> -mmemcpy-strategy=, -mtune= etc., on various other architectures other
Thanks very much! I tried the -mmemcpy-strategy=byte_loop, it seems
worked! The .o used to emit call to self-defined memcpy() now has no
memcpy entry in the nm output!