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

            Bug ID: 92501
           Summary: strncmp with constant unterminated arrays not folded
           Product: gcc
           Version: 10.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 9 and later fold strncmp calls with constant strings as arguments but it
doesn't optimize equivalent calls when one or both arguments is an unterminated
array.  The example below shows the difference.

Clang folds both.

$ cat z.c && gcc -O2 -c -Wall -Wextra -fdump-tree-optimized=/dev/stdout z.c
const char a[] = { '1', '2', '3', '\0' };
const char b[] = { '1', '2', '3' };

void f (void)
{
  if (__builtin_strncmp (a, "123", 3))
    __builtin_abort ();
}

void g (void)
{
  if (__builtin_strncmp (b, "123", 3))
    __builtin_abort ();
}

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

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

}



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

g ()
{
  int _1;

  <bb 2> [local count: 1073741824]:
  _1 = __builtin_strncmp (&b, "123", 3);
  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;

}

Reply via email to