aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndrew Pinski <apinski@cavium.com>2017-06-30 20:40:38 +0000
committerAndrew Pinski <pinskia@gcc.gnu.org>2017-06-30 13:40:38 -0700
commitfb6a764dfdb74bbd0acfb7dc8d95a98286637d8a (patch)
treebadd638916d579f151c94ab4bc771942166022d3 /gcc
parent08fb13163ce5e7dcf61c3ce898a63bb54f1b6d3d (diff)
downloadgcc-fb6a764dfdb74bbd0acfb7dc8d95a98286637d8a.zip
gcc-fb6a764dfdb74bbd0acfb7dc8d95a98286637d8a.tar.gz
gcc-fb6a764dfdb74bbd0acfb7dc8d95a98286637d8a.tar.bz2
tree-if-conv.c (predicate_scalar_phi): Update new_stmt if fold_stmt returned true.
2017-06-30 Andrew Pinski <apinski@cavium.com> * tree-if-conv.c (predicate_scalar_phi): Update new_stmt if fold_stmt returned true. 2017-06-30 Andrew Pinski <apinski@cavium.com> * gcc.dg/torture/pr81245.c: New testcase. From-SVN: r249854
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr81245.c16
-rw-r--r--gcc/tree-if-conv.c7
4 files changed, 30 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8fd5ef6..73a0555 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2017-06-30 Andrew Pinski <apinski@cavium.com>
+
+ * tree-if-conv.c (predicate_scalar_phi): Update new_stmt if
+ fold_stmt returned true.
+
2017-06-30 Nathan Sidwell <nathan@acm.org>
* ggc.h (empty_string): Delete.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 92d5f63..0331735 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2017-06-30 Andrew Pinski <apinski@cavium.com>
+
+ * gcc.dg/torture/pr81245.c: New testcase.
+
2017-06-30 Aldy Hernandez <aldyh@redhat.com>
* gcc.dg/Walloca-14.c: Adapt test to recognize new complaint of
diff --git a/gcc/testsuite/gcc.dg/torture/pr81245.c b/gcc/testsuite/gcc.dg/torture/pr81245.c
new file mode 100644
index 0000000..b2ee7bb
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr81245.c
@@ -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;
+ }
+}
diff --git a/gcc/tree-if-conv.c b/gcc/tree-if-conv.c
index b1f06a8..dbacc6e 100644
--- a/gcc/tree-if-conv.c
+++ b/gcc/tree-if-conv.c
@@ -1853,8 +1853,11 @@ predicate_scalar_phi (gphi *phi, gimple_stmt_iterator *gsi)
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))
{