https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112296
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Ever confirmed|0 |1 Status|UNCONFIRMED |ASSIGNED Last reconfirmed| |2023-10-31 Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org --- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> --- The issue is that we're inlining "optimized" bodies but somehow "optimize" direct() already in the frontend to ;; Function int direct(Span) (null) ;; enabled by -tree-original <<cleanup_point return <retval> = 0>>; that's because we have builtins.cc:fold_builtin_constant_p /* If this expression has side effects, show we don't know it to be a constant. Likewise if it's a pointer or aggregate type since in those case we only want literals, since those are only optimized when generating RTL, not later. And finally, if we are compiling an initializer, not code, we need to return a definite result now; there's not going to be any more optimization done. */ if (TREE_SIDE_EFFECTS (arg) || AGGREGATE_TYPE_P (TREE_TYPE (arg)) || POINTER_TYPE_P (TREE_TYPE (arg)) || cfun == 0 || folding_initializer || force_folding_builtin_constant_p) return integer_zero_node; and the CALL_EXPR we have as argument has side-effects. That all looks like from prehistoric times, but I'm only going to remove the TREE_SIDE_EFFECTS check which makes the direct and indirect cases produce the same result.