efriedma-quic wrote:

We need to enter the "-fno-builtins" world to make interprocedural 
optimizations with libc safe.

Most optimizations you care about can be preserved in other ways.  For example, 
if malloc called some intrinsic "llvm.allocate_memory"/"llvm.free_memory" to 
create/destroy provenance, we can preserve most aliasing-related optimizations. 
 If your libc does runtime CPU detection, we can come up with some way to 
accurately model aliasing on those globals.  But we need a different IR 
representation to make this work; we can't just treat the implementations as 
opaque.

If you want to run certain optimizations before we enter the "-fno-builtins" 
world, you need some pass that transitions IR from the "builtins" world to the 
"nobuiltins" world.

It might be possible for us to invent a "partial-builtin" mode which treats 
functions which are called as builtins, but doesn't allow generating calls to 
functions which aren't already used.  Which would allow LTO to accurately to 
more accurately compute which libc functions are used.  But I'm not sure how 
useful this would actually be in practice; if you're not LTO'ing libc, the 
dependencies don't really need to be accurate.

---------------------

There's a smaller set of functions which have more subtle ABI rules: those we 
call even with -fno-builtins.  These are mostly listed  in RuntimeLibcalls.def. 
 But memcmp is not one of those functions.

https://github.com/llvm/llvm-project/pull/135706
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to