[Bug tree-optimization/85897] New: missing strncmp optimization for bound in known range
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed May 23 21:37:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85897
Bug ID: 85897
Summary: missing strncmp optimization for bound in known range
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 folds strncmp() calls with all constant/known arguments but fails to
perform a similar simplification for corresponding calls where the bound is
non-constant but in a known range that could be used to do the same folding.
$ cat a.c && gcc -O2 -S -Wall -fdump-tree-optimized=/dev/stdout a.c
void f (unsigned n)
{
const char *a = "abcX";
const char *b = "abcY";
n = 3;
if (__builtin_strncmp (a, b, n)) // folded
__builtin_abort (); // eliminated
}
void g (unsigned n)
{
const char *a = "abcX";
const char *b = "abcY";
if (3 < n)
n = 3;
if (__builtin_strncmp (a, b, n)) // not folded
__builtin_abort (); // not eliminated
}
;; Function f (f, funcdef_no=0, decl_uid=1956, cgraph_uid=0, symbol_order=0)
f (unsigned int n)
{
<bb 2> [local count: 1073741825]:
return;
}
;; Function g (g, funcdef_no=1, decl_uid=1961, cgraph_uid=1, symbol_order=1)
g (unsigned int n)
{
long unsigned int _1;
int _2;
<bb 2> [local count: 1073741825]:
if (n_4(D) > 3)
goto <bb 5>; [50.00%]
else
goto <bb 3>; [50.00%]
<bb 3> [local count: 536870913]:
_1 = (long unsigned int) n_4(D);
_2 = __builtin_strncmp ("abcX", "abcY", _1);
if (_2 != 0)
goto <bb 4>; [0.00%]
else
goto <bb 5>; [99.92%]
<bb 4> [count: 0]:
__builtin_abort ();
<bb 5> [local count: 1073312327]:
return;
}
More information about the Gcc-bugs
mailing list