https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96601
Martin Sebor <msebor at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Blocks| |83819
Ever confirmed|0 |1
Last reconfirmed| |2020-08-13
Severity|normal |enhancement
CC| |msebor at gcc dot gnu.org
Status|UNCONFIRMED |NEW
--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
Sounds like a good idea. In fact, there is code to "Try to fold strstr (s, t)
eq/ne s to strncmp (s, t, strlen (t)) eq/ne 0" in tree-ssa-streln.c but it
triggers only when the length of the second argument has already been computed:
$ cat pr96601.c && gcc -O2 -S -Wall -fdump-tree-optimized=/dev/stdout pr96601.c
int f (const char *a, const char *b)
{
if (__builtin_strlen (b) > 1)
return __builtin_strstr (a, b) == a;
return -1;
}
;; Function f (f, funcdef_no=0, decl_uid=1932, cgraph_uid=1, symbol_order=0)
Removing basic block 5
f (const char * a, const char * b)
{
long unsigned int _1;
char * _2;
_Bool _3;
int _4;
int _8;
int _10;
<bb 2> [local count: 1073741824]:
_1 = __builtin_strlen (b_6(D));
if (_1 > 1)
goto <bb 3>; [42.57%]
else
goto <bb 4>; [57.43%]
<bb 3> [local count: 457091896]:
_10 = __builtin_strncmp (a_7(D), b_6(D), _1);
_3 = _10 == 0;
_8 = (int) _3;
<bb 4> [local count: 1073741824]:
# _4 = PHI <_8(3), -1(2)>
return _4;
}
Referenced Bugs:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83819
[Bug 83819] [meta-bug] missing strlen optimizations