[Bug tree-optimization/83821] New: local aggregate initialization defeats strlen optimization
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Jan 12 17:55:00 GMT 2018
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83821
Bug ID: 83821
Summary: local aggregate initialization defeats strlen
optimization
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: ---
For the test case below, GCC optimizes the strlen call in f() but fails to do
the same in g(). It appears because the maybe_invalidate() function in the
pass considers the initialization of/assignment to b.i as possibly clobbering
the value of b.s, not realizing that there is no way for the two members to
alias.
$ cat z.c && gcc -O2 -S -fdump-tree-optimized=/dev/stdout z.c
#define STR "0123456789"
struct A
{
char s[sizeof STR];
};
void f (void)
{
struct A a = { STR };
if (__builtin_strlen (a.s) != sizeof STR - 1) // folded
__builtin_abort (); // eliminated
}
struct B
{
char s[sizeof STR];
int i;
};
void g (void)
{
struct B b = { STR, 123 };
if (__builtin_strlen (b.s) != sizeof STR - 1) // not folded
__builtin_abort (); // not eliminated
}
;; Function f (f, funcdef_no=0, decl_uid=1952, cgraph_uid=0, symbol_order=0)
f ()
{
<bb 2> [local count: 1073741825]:
return;
}
;; Function g (g, funcdef_no=1, decl_uid=1959, cgraph_uid=1, symbol_order=1)
g ()
{
struct B b;
long unsigned int _1;
<bb 2> [local count: 1073741825]:
b.s = "0123456789";
b.i = 123;
_1 = __builtin_strlen (&b.s);
if (_1 != 10)
goto <bb 3>; [0.00%]
else
goto <bb 4>; [99.96%]
<bb 3> [count: 0]:
__builtin_abort ();
<bb 4> [local count: 1073312327]:
b ={v} {CLOBBER};
return;
}
More information about the Gcc-bugs
mailing list