aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-08-11 13:29:12 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-08-11 13:29:12 +0200
commit8be591a9cd557be85e591a0362d220d84c296bd4 (patch)
treee26d90f847d8519eda7b00b95cefd1491a045b12
parentfc186cbd1cdff6cecdb8eb0a350c3ee0af2d1332 (diff)
downloadgcc-8be591a9cd557be85e591a0362d220d84c296bd4.zip
gcc-8be591a9cd557be85e591a0362d220d84c296bd4.tar.gz
gcc-8be591a9cd557be85e591a0362d220d84c296bd4.tar.bz2
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr86835.c29
-rw-r--r--gcc/tree-ssa-math-opts.c12
4 files changed, 47 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 710d164..0da6f84 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ffa2035..38c3329 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gcc.dg/pr86835.c b/gcc/testsuite/gcc.dg/pr86835.c
new file mode 100644
index 0000000..a0ebc74
--- /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 e32669d..a90d9d2 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;