[Bug tree-optimization/101074] New: calloc result not treated as zeroed out

msebor at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Jun 15 00:44:59 GMT 2021


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

            Bug ID: 101074
           Summary: calloc result not treated as zeroed out
           Product: gcc
           Version: 11.1.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 folds malloc + bzero (or malloc + memset zero) to calloc and "knows" that
the returned memory is zeroed out.  But it doesn't seem to understand that the
memory returned from a call specifically made to calloc is also zeroed out.  In
the test case below both functions should be optimized equivalently but only
the first produces optimal code, the second is suboptimal.

$ cat z.c && gcc -O2 -S -Wall -fdump-tree-optimized=/dev/stdout z.c
struct A { int i; };

void* f (void)
{
  struct A *p = __builtin_malloc (sizeof *p);
  __builtin_memset (p, 0, sizeof *p);
  if (p->i)   // folded to false
    __builtin_abort ();
  return p;
}

void* g (void)
{
  struct A *p = __builtin_calloc (1, sizeof *p);
  if (p->i)   // not folded
    __builtin_abort ();
  return p;
}

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

void * f ()
{
  struct A * p;

  <bb 2> [local count: 1073741824]:
  p_3 = __builtin_calloc (4, 1); [tail call]
  return p_3;

}



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

void * g ()
{
  struct A * p;
  int _1;

  <bb 2> [local count: 1073741824]:
  p_4 = __builtin_calloc (1, 4);
  _1 = p_4->i;
  if (_1 != 0)
    goto <bb 3>; [0.00%]
  else
    goto <bb 4>; [100.00%]

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

  <bb 4> [local count: 1073741824]:
  return p_4;

}


More information about the Gcc-bugs mailing list