Commit 8be591a9 by Jakub Jelinek Committed by Jakub Jelinek

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
parent fc186cbd
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> 2018-08-10 Alexander Monakov <amonakov@ispras.ru>
PR target/82418 PR target/82418
......
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> 2018-08-10 Janus Weil <janus@gcc.gnu.org>
PR fortran/57160 PR fortran/57160
......
/* 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;
}
...@@ -422,6 +422,8 @@ insert_reciprocals (gimple_stmt_iterator *def_gsi, struct occurrence *occ, ...@@ -422,6 +422,8 @@ insert_reciprocals (gimple_stmt_iterator *def_gsi, struct occurrence *occ,
gsi_next (&gsi); gsi_next (&gsi);
gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT); 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) else if (def_gsi && occ->bb == def_gsi->bb)
{ {
...@@ -429,21 +431,19 @@ insert_reciprocals (gimple_stmt_iterator *def_gsi, struct occurrence *occ, ...@@ -429,21 +431,19 @@ insert_reciprocals (gimple_stmt_iterator *def_gsi, struct occurrence *occ,
never happen if the definition statement can throw, because in never happen if the definition statement can throw, because in
that case the sole successor of the statement's basic block will that case the sole successor of the statement's basic block will
dominate all the uses as well. */ dominate all the uses as well. */
gsi = *def_gsi;
gsi_insert_after (def_gsi, new_stmt, GSI_NEW_STMT); 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 else
{ {
/* Case 3: insert in a basic block not containing defs/uses. */ /* Case 3: insert in a basic block not containing defs/uses. */
gsi = gsi_after_labels (occ->bb); gsi = gsi_after_labels (occ->bb);
gsi_insert_before (&gsi, new_stmt, GSI_SAME_STMT); 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++; reciprocal_stats.rdivs_inserted++;
occ->recip_def_stmt = new_stmt; occ->recip_def_stmt = new_stmt;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment