Hi Jakub.
> On Thu, Dec 08, 2022 at 11:59:44AM +0100, Jose E. Marchesi via Gcc-patches > wrote: >> gcc/ChangeLog >> >> * expr.cc (expand_expr_divmod): Avoid side-effects of trying >> sequences involving funcalls in optimization. > > That looks wrong. > The globals for mentioned calls just shouldn't be emitted during expansion, > especially if it is bigger annoyance than just having some extra symbols > in the symbol table. > expand_expr_divmod is definitely not the only place where something is > expanded and later not used, lots of other places in the expander do that, > and more importantly, there are over 80 optimization passes after expansion, > many of them can remove code determined to be dead, and while lots of dead > code is removed in GIMPLE optimizations already, definitely not all. > So, rather than add hacks for this in a single spot, much better is to emit > the globals only for stuff that is actually needed (so during final or > immediately before it). Yeah I see the point. The culprit of the leadked .global seems to be a call to assemble_external_libcall in emit_library_call_value_1: expand_expr_divmod expand_divmod -> This will result in libcall sign_expand_divmod emit_library_call_value emit_library_call_value_1 ... /* If this machine requires an external definition for library functions, write one out. */ assemble_external_libcall (fun); ... The documented purpose of assemble_external_libcall is, as stated in output.h, to "Assemble a string constant". So, it seems to me that emit_library_call_value should not assemble anything, since it is used by expand functions whose expansions may be eventually discarded. However, simply removing that call to assemble_external_libcall makes .global declarations to not be emitted even when the funcall is actually emitted in final: For: int foo(unsigned int len) { return ((long)len) * 234 / 5; } we get: .file "foo.c" .text <------------- NO .global __divdi3 .align 3 .global foo .type foo, @function foo: mov32 %r1,%r1 mov %r2,5 mul %r1,234 call __divdi3 exit .size foo, .-foo .ident "GCC: (GNU) 13.0.0 20221207 (experimental)" Note that BPF lacks signed division instructions. So, I guess the right fix would be to call assemble_external_libcall during final? The `.global FOO' directive would be generated immediately before the call sequence, but I guess that would be ok. WDYT?