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

            Bug ID: 90662
           Summary: strlen of a string in a vla plus offset not folded
           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: ---

In the test case below, GCC can compute the string length in f() and h() but
not in g().  

The root cause is that the get_stridx() function in tree-ssa-strlen.c that
retrieves the length record for a non-constant string only handles
POINTER_PLUS_EXPR but the &a[2] in in g() is represented as '&*a.1_9[2]' or
ADDR_EXPR.

$ cat a.c && gcc -O2 -S -Wall -fdump-tree-optimized=/dev/stdout a.c
void f (int n)
{ 
  char a[6];
  __builtin_strcpy (a, "12345");
  if (__builtin_strlen (&a[2]) != 3)   // folded to false
    __builtin_abort ();
}

void g (int n)
{
  char a[n];
  __builtin_strcpy (a, "12345");
  if (__builtin_strlen (&a[2]) != 5)   // not folded
    __builtin_abort ();
}

void h (int n)
{ 
  char *a = __builtin_malloc (6);
  __builtin_strcpy (a, "12345");
  if (__builtin_strlen (&a[2]) != 3)   // folded to false
    __builtin_abort ();
}


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

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

}



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

g (int n)
{
  char[0:D.1921] * a.1;
  sizetype _1;
  char * _6;
  long unsigned int _7;

  <bb 2> [local count: 1073741824]:
  _1 = (sizetype) n_2(D);
  a.1_9 = __builtin_alloca_with_align (_1, 8);
  __builtin_memcpy (a.1_9, "12345", 6);
  _6 = &*a.1_9[2];
  _7 = __builtin_strlen (_6);
  if (_7 != 5)
    goto <bb 3>; [0.00%]
  else
    goto <bb 4>; [100.00%]

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

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

}



;; Function h (h, funcdef_no=2, decl_uid=1914, cgraph_uid=3, symbol_order=2)

h (int n)
{
  <bb 2> [local count: 1073741824]:
  return;

}

Reply via email to