From 8be591a9cd557be85e591a0362d220d84c296bd4 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Sat, 11 Aug 2018 13:29:12 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr86835.c | 29 +++++++++++++++++++++++++++++ gcc/tree-ssa-math-opts.c | 12 ++++++------ 4 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr86835.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 710d164ba88..0da6f84cf93 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-08-11 Jakub Jelinek + + 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 PR target/82418 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ffa20359f57..38c33299879 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-08-11 Jakub Jelinek + + PR tree-optimization/86835 + * gcc.dg/pr86835.c: New test. + 2018-08-10 Janus Weil PR fortran/57160 diff --git a/gcc/testsuite/gcc.dg/pr86835.c b/gcc/testsuite/gcc.dg/pr86835.c new file mode 100644 index 00000000000..a0ebc7432aa --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr86835.c @@ -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; +} diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index e32669dc944..a90d9d28e4e 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -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; -- 2.30.2