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.

Reply via email to