This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug tree-optimization/81384] New: built-in form of strnlen missing
- From: "msebor at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Mon, 10 Jul 2017 18:07:15 +0000
- Subject: [Bug tree-optimization/81384] New: built-in form of strnlen missing
- Auto-submitted: auto-generated
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;
}