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

            Bug ID: 90821
           Summary: missing strlen range after a char store at non-zero
                    index
           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 folds the test in f() into a constant but doesn't do the same for the test
in g(), even though both are necessarily false and even though all information
to determine that is available in the strlen pass in both cases.

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

void f (void)
{
  a[0] = 1;
  a[1] = 2;
  a[2] = 0;
  if (__builtin_strlen (a) > 2)   // folded to false
    __builtin_abort ();
}

void g (void)
{ 
  a[0] = 1;
  a[2] = 0;
  if (__builtin_strlen (a) > 2)   // not folded
    __builtin_abort ();
}


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

f ()
{
  <bb 2> [local count: 1073741824]:
  MEM[(char *)&a] = 513;
  a[2] = 0;
  return;

}



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

g ()
{
  long unsigned int _1;

  <bb 2> [local count: 1073741824]:
  a[0] = 1;
  a[2] = 0;
  _1 = __builtin_strlen (&a);
  if (_1 == 3)
    goto <bb 3>; [0.00%]
  else
    goto <bb 4>; [100.00%]

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

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

}

Reply via email to