[Bug tree-optimization/87313] New: attribute malloc not used for alias analysis when it could be

msebor at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri Sep 14 21:19:00 GMT 2018


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

            Bug ID: 87313
           Summary: attribute malloc not used for alias analysis when it
                    could be
           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: ---

Attribute malloc is documented as:

    This tells the compiler that a function is malloc-like, i.e., that the
pointer P returned by the function cannot alias any other pointer valid when
the function returns, and moreover no pointers to valid objects occur in any
storage addressed by P.

The test case below shows that although GCC takes advantage of this property to
eliminate impossible tests when calling __builtin_malloc it doesn't do the same
when calling a user-defined function declared with the attribute.

$ cat x.c && gcc -O2 -S -Wall -fdump-tree-optimized=/dev/stdout x.c
void f (int **p)
{
  int *x = *p;

  int **q = __builtin_malloc (sizeof (int*));
  *q = 0;   // *q cannot be equal to *p prior to the assignment

  if (x != *p)   // folded to false
    __builtin_abort ();
}

__attribute__ ((malloc)) void* g (int);

void h (int **p)
{
  int *x = *p;

  int **q = g (sizeof (int*));
  *q = 0;   // *q cannot be equal to *p prior to the assignment

  if (x != *p)   // not folded
    __builtin_abort ();
}

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

f (int * * p)
{
  <bb 2> [local count: 1073741824]:
  return;

}



;; Function h (h, funcdef_no=1, decl_uid=1913, cgraph_uid=2, symbol_order=1)

h (int * * p)
{
  int * x;
  int * _1;

  <bb 2> [local count: 1073741824]:
  x_4 = *p_3(D);
  g (8);
  _1 = *p_3(D);
  if (_1 != x_4)
    goto <bb 3>; [0.00%]
  else
    goto <bb 4>; [99.96%]

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

  <bb 4> [local count: 1073312328]:
  return;

}


More information about the Gcc-bugs mailing list