re PR tree-optimization/86835 (Bogus "is used uninitialized" warning with -ffast-math)

PR tree-optimization/86835
	* tree-ssa-math-opts.c (insert_reciprocals): Even when inserting
	new_stmt after def_gsi, make sure to insert new_square_stmt after
	that stmt, not 2 stmts before it.

	* gcc.dg/pr86835.c: New test.

From-SVN: r263487
This commit is contained in:
Jakub Jelinek 2018-08-11 13:29:12 +02:00 committed by Jakub Jelinek
parent fc186cbd1c
commit 8be591a9cd
4 changed files with 47 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2018-08-11 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/86835
* tree-ssa-math-opts.c (insert_reciprocals): Even when inserting
new_stmt after def_gsi, make sure to insert new_square_stmt after
that stmt, not 2 stmts before it.
2018-08-10 Alexander Monakov <amonakov@ispras.ru>
PR target/82418

View File

@ -1,3 +1,8 @@
2018-08-11 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/86835
* gcc.dg/pr86835.c: New test.
2018-08-10 Janus Weil <janus@gcc.gnu.org>
PR fortran/57160

View File

@ -0,0 +1,29 @@
/* PR tree-optimization/86835 */
/* { dg-do run } */
/* { dg-options "-O2 -ffast-math -Wuninitialized" } */
__attribute__((noipa)) void
foo (int n, double *x, double *y)
{ /* { dg-bogus "is used uninitialized in this function" "" { target *-*-* } 0 } */
int i;
double b = y[4];
for (i = 0; i < n; ++i)
y[3] += __builtin_sin (x[i] / b);
y[0] /= b;
y[1] /= b * b;
y[2] /= b;
}
int
main ()
{
double y[] = { 16.0, 64.0, 128.0, 0.0, 2.0 };
foo (0, y, y);
if (__builtin_fabs (y[0] - 8.0) > 0.0001
|| __builtin_fabs (y[1] - 16.0) > 0.0001
|| __builtin_fabs (y[2] - 64.0) > 0.0001
|| y[3] != 0.0
|| y[4] != 2.0)
__builtin_abort ();
return 0;
}

View File

@ -422,6 +422,8 @@ insert_reciprocals (gimple_stmt_iterator *def_gsi, struct occurrence *occ,
gsi_next (&gsi);
gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT);
if (should_insert_square_recip)
gsi_insert_before (&gsi, new_square_stmt, GSI_SAME_STMT);
}
else if (def_gsi && occ->bb == def_gsi->bb)
{
@ -429,21 +431,19 @@ insert_reciprocals (gimple_stmt_iterator *def_gsi, struct occurrence *occ,
never happen if the definition statement can throw, because in
that case the sole successor of the statement's basic block will
dominate all the uses as well. */
gsi = *def_gsi;
gsi_insert_after (def_gsi, new_stmt, GSI_NEW_STMT);
if (should_insert_square_recip)
gsi_insert_after (def_gsi, new_square_stmt, GSI_NEW_STMT);
}
else
{
/* Case 3: insert in a basic block not containing defs/uses. */
gsi = gsi_after_labels (occ->bb);
gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT);
if (should_insert_square_recip)
gsi_insert_before (&gsi, new_square_stmt, GSI_SAME_STMT);
}
/* Regardless of which case the reciprocal as inserted in,
we insert the square immediately after the reciprocal. */
if (should_insert_square_recip)
gsi_insert_before (&gsi, new_square_stmt, GSI_SAME_STMT);
reciprocal_stats.rdivs_inserted++;
occ->recip_def_stmt = new_stmt;