+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
--- /dev/null
+/* 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;
+}
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)
{
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;