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

            Bug ID: 81384
           Summary: built-in form of strnlen missing
           Product: gcc
           Version: 8.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 doesn't provide a built-in form of the POSIX strnlen function.  Providing
such a built-in would make it possible to emit more efficient code for programs
that make use of it.  The Linux kernel, for example, has on the order of 260
instances of calls to strnlen.

The test case below shows one instance of a missed optimization opportunity
involving strnlen.

$ cat b.c && gcc -O2 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout b.c
typedef __SIZE_TYPE__ size_t;

size_t strnlen (const char*, size_t);

void f (const char *s)
{
  unsigned n = strnlen (s, 7);
  if (n > 7)                     // can never hold
    __builtin_abort ();          // can be eliminated
}

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

f (const char * s)
{
  unsigned int n;
  long unsigned int _1;

  <bb 2> [100.00%] [count: INV]:
  _1 = strnlen (s_3(D), 7);
  n_5 = (unsigned int) _1;
  if (n_5 > 7)
    goto <bb 3>; [0.04%] [count: 0]
  else
    goto <bb 4>; [99.96%] [count: INV]

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

  <bb 4> [99.96%] [count: INV]:
  return;

}

Reply via email to