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:
parent
fc186cbd1c
commit
8be591a9cd
@ -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
|
||||
|
@ -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
|
||||
|
29
gcc/testsuite/gcc.dg/pr86835.c
Normal file
29
gcc/testsuite/gcc.dg/pr86835.c
Normal 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;
|
||||
}
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user