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

            Bug ID: 81433
           Summary: missing strlen optimization for strncpy
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

GCC can track the length of some strings created dynamically by calling strcpy
(among other functions) but it's missing the same optimization for the related
strncpy function.

The test case below shows two equivalent functions, where the first is
optimized while the second is not.  The tree-sssa-strlen pass has no support
for strncpy.  Since strncpy is often used as a replacement for strcpy, adding
such support where possible (i.e., in cases where the length of the source
string is known to be less than the specified size) is a potentially
significant optimization opportunity.

$ cat a.c && gcc -O2 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout a.c
void f (void)
{
  char a[7];
  __builtin_strcpy (a, "123");
  if (__builtin_strlen (a) != 3)
    __builtin_abort ();
}

void g (void)
{
  char a[7];
  __builtin_strncpy (a, "123", sizeof a);
  if (__builtin_strlen (a) != 3)
    __builtin_abort ();
}


;; Function f (f, funcdef_no=0, decl_uid=1814, cgraph_uid=0, symbol_order=0)

f ()
{
  <bb 2> [100.00%] [count: INV]:
  return;

}



;; Function g (g, funcdef_no=1, decl_uid=1818, cgraph_uid=1, symbol_order=1)

g ()
{
  char a[7];
  long unsigned int _1;

  <bb 2> [100.00%] [count: INV]:
  __builtin_strncpy (&a, "123", 7);
  _1 = __builtin_strlen (&a);
  if (_1 != 3)
    goto <bb 3>; [0.04%] [count: 0]
  else
    goto <bb 4>; [99.96%] [count: INV]

  <bb 3> [0.04%] [count: 0]:
  __builtin_abort ();

  <bb 4> [99.96%] [count: INV]:
  a ={v} {CLOBBER};
  return;

}

Reply via email to