===================================================================
@@ -0,0 +1,16 @@
+/* { dg-options "-ffast-math" } */
+/* { dg-do compile } */
+/* This test used to crash the vectorizer as the ifconvert pass
+ used to convert the if to copysign but called update_stmt on
+ the old statement after calling fold_stmt. */
+double sg[18];
+void f(void)
+{
+ for (int i = 0 ;i < 18;i++)
+ {
+ if (sg[i] < 0.0)
+ sg[i] = -1.0;
+ else
+ sg[i] = 1.0;
+ }
+}
===================================================================
@@ -1853,8 +1853,11 @@
new_stmt = gimple_build_assign (res, rhs);
gsi_insert_before (gsi, new_stmt, GSI_SAME_STMT);
gimple_stmt_iterator new_gsi = gsi_for_stmt (new_stmt);
- fold_stmt (&new_gsi, ifcvt_follow_ssa_use_edges);
- update_stmt (new_stmt);
+ if (fold_stmt (&new_gsi, ifcvt_follow_ssa_use_edges))
+ {
+ new_stmt = gsi_stmt (new_gsi);
+ update_stmt (new_stmt);
+ }
if (dump_file && (dump_flags & TDF_DETAILS))
{