https://gcc.gnu.org/bugzilla/show_bug.cgi?id=59552

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |msebor at gcc dot gnu.org

--- Comment #2 from Martin Sebor <msebor at gcc dot gnu.org> ---
The request refers to arguments of non-trivial types but I think it's just as
applicable to trivial types, if not more.  A test case for an expensive-to-copy
trivial type might look something like this.  The caller of f0() must make a
copy of x but the caller of g0() need not, and GCC just passes the address of x
to it.  Since the definition of f0() doesn't change the argument, it would be
more efficient if the caller didn't have to make the copy.  In C++, GCC could
suggest to declare f0() to take its argument by const reference instead.  (In
C, it could suggest to take it by const pointer.)  In addition, declaring the
const reference or pointer argument restrict would make it clear that the
callee doesn't change the argument when it's passed by reference (this
optimization is the subject of pr81009).

typedef struct Big {
  char a[32];
} Big;

int __attribute__ ((noclone, noinline))
f0 (Big x)   // suggest to declare f0 (const Big&) instead
{ return __builtin_strlen (x.a); }

int __attribute__ ((noclone, noinline))
g0 (const Big *x) { return __builtin_strlen (x->a); }

extern Big x;

int f1 (void)
{
  int n = f0 (x);
  return n + 1;
}

int g1 (void)
{
  int n = g0 (&x);
  return n + 1;
}

I suspect the request for a warning for non-trivial types is based on the
assumption that such a type is expensive to copy.  That may or may not be true
depending on the definition of the type but regardless, I think there is an
opportunity here for GCC to help users write more efficient code.

Reply via email to