[Bug tree-optimization/57719] [4.8/4.9 Regression] wrong code at -O3 on x86_64-linux-gnu
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Wed Jun 26 08:46:00 GMT 2013
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57719
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2013-06-26
CC| |jakub at gcc dot gnu.org
Target Milestone|--- |4.8.2
Summary|wrong code at -O3 on |[4.8/4.9 Regression] wrong
|x86_64-linux-gnu |code at -O3 on
| |x86_64-linux-gnu
Ever confirmed|0 |1
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
int u, a, b, c[2], d, *e, f, g;
int
foo (void)
{
int t[1], i;
for (i = 0; i < 1; i++)
t[i] = 0;
for (d = 0; d; d = 1)
{
int *s[1] = { &t[0] };
g = a = *s[0];
}
f = g;
return 1;
}
void
bar (void)
{
for (; b < 2; b++)
{
int *p = &u;
*p = 0;
*p = foo ();
e = &c[b];
*e = 0;
}
}
int
main ()
{
bar ();
if (u != 1)
__builtin_abort ();
return 0;
}
Started with r196174. t is discovered unused during dce1 pass, but since
r196174 we no longer remove unused vars, which results in a t ={v} {CLOBBER};
stmt being kept inside of the loop and that for some reason affects lim1
decisions (something to investigate, potential code quality issue).
Anyway, sccp dump still looks good wrt. writes into u; already dse1 removes
the first u = 0; stmt, because it is redundant with following u = 1; in another
bb, but it keeps around u = 0; for the second iteration, so we first enter the
bb with u = 1; from there jump to bb with u = 0;, and from there go to the u =
1; bb back and finally goto exit. In ldist it is already broken, so looks like
a ldist bug to me.
More information about the Gcc-bugs
mailing list