[Bug tree-optimization/92112] New: fold strlen after strcmp(a, b) ==
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Oct 15 21:11:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92112
Bug ID: 92112
Summary: fold strlen after strcmp(a, b) == 0
Product: gcc
Version: 9.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: ---
After a strcmp call evaluates to zero the lengths of the two arguments can be
assumed to be equal. GCC could make use of that to fold strlen expressions
such as those in the test case below but doesn't (yet).
$ cat a.c && gcc -S -O2 -Wall -Wextra -fdump-tree-optimized=/dev/stdout a.c
extern char a[], b[];
void f (void)
{
if (__builtin_strcmp (a, b) != 0)
return;
if (__builtin_strlen (a) != __builtin_strlen (b)) // can be folded to false
__builtin_abort ();
}
void g (void)
{
if (__builtin_strlen (a) < 7)
return;
if (__builtin_strcmp (a, b) != 0)
return;
if (__builtin_strlen (b) < 7) // can be folded to false
__builtin_abort ();
}
;; Function f (f, funcdef_no=0, decl_uid=1932, cgraph_uid=1, symbol_order=0)
Removing basic block 6
Removing basic block 7
f ()
{
int _1;
long unsigned int _2;
long unsigned int _3;
<bb 2> [local count: 1073741824]:
_1 = __builtin_strcmp (&a, &b);
if (_1 != 0)
goto <bb 5>; [34.00%]
else
goto <bb 3>; [66.00%]
<bb 3> [local count: 708669605]:
_2 = __builtin_strlen (&a);
_3 = __builtin_strlen (&b);
if (_2 != _3)
goto <bb 4>; [0.00%]
else
goto <bb 5>; [100.00%]
<bb 4> [count: 0]:
__builtin_abort ();
<bb 5> [local count: 1073741824]:
return;
}
;; Function g (g, funcdef_no=1, decl_uid=1935, cgraph_uid=2, symbol_order=1)
Removing basic block 7
Removing basic block 8
Removing basic block 9
g ()
{
long unsigned int _1;
int _2;
long unsigned int _3;
<bb 2> [local count: 1073741823]:
_1 = __builtin_strlen (&a);
if (_1 <= 6)
goto <bb 6>; [34.00%]
else
goto <bb 3>; [66.00%]
<bb 3> [local count: 708669604]:
_2 = __builtin_strcmp (&a, &b);
if (_2 != 0)
goto <bb 6>; [34.00%]
else
goto <bb 4>; [66.00%]
<bb 4> [local count: 467721938]:
_3 = __builtin_strlen (&b);
if (_3 <= 6)
goto <bb 5>; [0.00%]
else
goto <bb 6>; [100.00%]
<bb 5> [count: 0]:
__builtin_abort ();
<bb 6> [local count: 1073741824]:
return;
}
More information about the Gcc-bugs
mailing list