[Bug tree-optimization/86427] New: strlen not folded after strcpy into a zeroed-out local array

msebor at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Jul 6 20:20:00 GMT 2018


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

            Bug ID: 86427
           Summary: strlen not folded after strcpy into a zeroed-out local
                    array
           Product: gcc
           Version: 9.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 eliminates a call to strlen() on a local copy into an uninitialized array
and from a character string of known length, but doesn't do the same when local
array is first zeroed-out.

$ cat c.c && gcc -O2 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout c.c
const char a[] = "123";

int f (void)
{
  char d[8];

  __builtin_strcpy (d, a);       // eliminated
  return __builtin_strlen (d);   // folded
}

int g (void)
{
  char d[8] = "";

  __builtin_strcpy (d, a);       // not eliminated
  return __builtin_strlen (d);   // not folded
}


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

f ()
{
  <bb 2> [local count: 1073741825]:
  return 3;

}



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

g ()
{
  char d[8];
  long unsigned int _1;
  int _5;

  <bb 2> [local count: 1073741825]:
  d = "";
  MEM[(char * {ref-all})&d] = MEM[(char * {ref-all})&a];
  _1 = __builtin_strlen (&d);
  _5 = (int) _1;
  d ={v} {CLOBBER};
  return _5;

}


More information about the Gcc-bugs mailing list