On Oct 15, 2016, at 3:56 PM, Wolfgang McSneed via llvm-dev <llvm...@lists.llvm.org> wrote:Hi,I am hoping that someone can help me figure out how to prevent the insertion of "memcpy" from the assembly source.My target is an instruction set simulator that doesn't support this.Thank you for your valuable time.WolfHere are my compile commands:$ clang -emit-llvm -fno-builtin -o3 --target=mips -S matrix_float.c -o vl_matrix_float.ll
_______________________________________________
LLVM Developers mailing list
llvm...@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Unless your backend explicitly always inlines memcpy, this is expected.
In a lot of situation, creating a libcall for non-trivial sizes is far
preferable than an inlined loop.
Joerg
Huh? The -fno-builtin is not the problem. The compiler is *expected* to
call certain functions even for -ffreestanding. memcpy and memset are
two of those. It is certainly perfectly valid target lowering for
llvm.memcpy to be turned back into a libcall.
Joerg
Are you intentionally not using static (& const) arrays? The compiler has
to use a copy to initialize a & b, given the size, it will use a memcpy
from a read-only section for that.
On Oct 15, 2016, at 4:07 PM, Joerg Sonnenberger via llvm-dev <llvm...@lists.llvm.org> wrote:On Sat, Oct 15, 2016 at 04:01:36PM -0700, Mehdi Amini via llvm-dev wrote:On Oct 15, 2016, at 3:56 PM, Wolfgang McSneed via llvm-dev <llvm...@lists.llvm.org> wrote:
Hi,
I am hoping that someone can help me figure out how to prevent the insertion of "memcpy" from the assembly source.
My target is an instruction set simulator that doesn't support this.
Thank you for your valuable time.
Wolf
Here are my compile commands:
$ clang -emit-llvm -fno-builtin -o3 --target=mips -S matrix_float.c -o vl_matrix_float.ll
Technically -fno-bultin prevents the compiler from understand the
memset in the original code. The right option to prevent the compiler
from insert libc calls “out-of-the-blue” is -ffreestanding.
Huh? The -fno-builtin is not the problem.
The compiler is *expected* to
call certain functions even for -ffreestanding. memcpy and memset are
two of those. It is certainly perfectly valid target lowering for
llvm.memcpy to be turned back into a libcall.
Yes, LLVM follows the same rules as GCC here:
GCC requires the freestanding environment provide `memcpy', `memmove',
`memset' and `memcmp'.
As I said, target lowering may decide to inline all the llvm.mem*
intrinsics, but it is typically wasteful to do so. Exceptions are e.g.
on x86 when optimising for size, since the function call overhead is
large than the "rep stosb" sequence would be for memset or "rep movsb"
or memcpy.
Just make them static const, so that a & b are effectively read-only
global variables. That way, the function doesn't have to reinitialize
them all the time.
The original code contains no memset (nor memcpy). As such, -fno-builtin
does not change the interpretation of the program as far as lowering to
IR goes. The backend using memset internally is a completely unrelated
problem.
> > The compiler is *expected* to
> > call certain functions even for -ffreestanding. memcpy and memset are
> > two of those. It is certainly perfectly valid target lowering for
> > llvm.memcpy to be turned back into a libcall.
>
> Source?
> AFAICT this is GCC behavior, but not the standard:
> https://gcc.gnu.org/onlinedocs/gcc/Standards.html#Standards
The standard has almost nothing to say about how freestanding really
works. It has a few requirements on what must be working in freestanding
environments, but the precise contract of what the compiler expects as
part of the ABI is outside the scope of the standard. Helper functions
for implementing division in software certainly fall into this scope as
well. The second-to-last paragraph are the lines about requirements GCC
puts on the environment, the same essentially applies to LLVM.