https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83190
Bug ID: 83190
Summary: missing strlen optimization of the empty string
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: ---
The tree-ssa-strlen pass keeps track of the lengths of strings as they are
created, including by initialization of local arrays. As a result, it is able
to determine that the result of the strlen() call in function f() below is 0
and perform this substitution. But the pass misses that the same is true in
function g(), and so it unnecessarily emits a call to strlen() there. It
should be possible to enhance the pass to handle this case as well and perform
the same transformation in both cases.
$ cat a.c && gcc -O2 -S -Wall -fdump-tree-optimized=/dev/stdout a.c
int f (void)
{
char a[] = "012\0";
return __builtin_strlen (a + 3); // folded into 0
}
int g (void)
{
char a[] = "012\0";
return __builtin_strlen (a + 4); // not folded
}
;; Function f (f, funcdef_no=0, decl_uid=1892, cgraph_uid=0, symbol_order=0)
f ()
{
<bb 2> [local count: 1073741825]:
return 0;
}
;; Function g (g, funcdef_no=1, decl_uid=1896, cgraph_uid=1, symbol_order=1)
g ()
{
char a[5];
long unsigned int _1;
int _4;
<bb 2> [local count: 1073741825]:
a = "012";
_1 = __builtin_strlen (&MEM[(void *)&a + 4B]);
_4 = (int) _1;
a ={v} {CLOBBER};
return _4;
}