re PR tree-optimization/86835 (Bogus "is used uninitialized" warning with -ffast...
authorJakub Jelinek <jakub@redhat.com>
Sat, 11 Aug 2018 11:29:12 +0000 (13:29 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 11 Aug 2018 11:29:12 +0000 (13:29 +0200)
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
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr86835.c [new file with mode: 0644]
gcc/tree-ssa-math-opts.c

index 710d164ba88dd6edc517d35308fffea735b3f8bf..0da6f84cf938cf39b54b53e20fc5fa2b4189ebf9 100644 (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
index ffa20359f57a87ed782189e90e961bd57193ba30..38c33299879c6a6890cb5fe834a7046d8567d4b9 100644 (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
diff --git a/gcc/testsuite/gcc.dg/pr86835.c b/gcc/testsuite/gcc.dg/pr86835.c
new file mode 100644 (file)
index 0000000..a0ebc74
--- /dev/null
@@ -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;
+}
index e32669dc944b66d749fc5bc2b0952ca630f3a878..a90d9d28e4ef6ce66fa380f314a9749fa952be0a 100644 (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;