summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-27 13:46:07 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2017-07-27 13:46:07 +0000
commit5e84534b683ca7aedd91d43acd19ff418d47da7e (patch)
tree0a9f661b70c26d76e9840eed4e2be1147628c826
parent473beec3608d4de83ea5b112045d96b9a26a51a8 (diff)
downloadgcc-5e84534b683ca7aedd91d43acd19ff418d47da7e.tar.gz
2017-07-27 Richard Biener <rguenther@suse.de>
PR tree-optimization/81573 PR tree-optimization/81494 * tree-vect-loop.c (vect_create_epilog_for_reduction): Handle multi defuse cycle case. * gcc.dg/torture/pr81573.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@250627 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr81573.c16
-rw-r--r--gcc/tree-vect-loop.c33
4 files changed, 55 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3ae2f46c8f2..77a77ebca7f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2017-07-27 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/81573
+ PR tree-optimization/81494
+ * tree-vect-loop.c (vect_create_epilog_for_reduction): Handle
+ multi defuse cycle case.
+
+2017-07-27 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/81571
* tree-vect-slp.c (vect_build_slp_tree): Properly verify reduction
PHIs.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e12654400b9..fe0b88c84fe 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,11 @@
2017-07-27 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/81573
+ PR tree-optimization/81494
+ * gcc.dg/torture/pr81573.c: New testcase.
+
+2017-07-27 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/81571
* gcc.dg/torture/pr81571.c: New testcase.
diff --git a/gcc/testsuite/gcc.dg/torture/pr81573.c b/gcc/testsuite/gcc.dg/torture/pr81573.c
new file mode 100644
index 00000000000..3f0904aa5ea
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr81573.c
@@ -0,0 +1,16 @@
+/* { dg-do run } */
+
+int a = 1, *c = &a, d;
+char b;
+
+int main ()
+{
+ for (; b > -27; b--)
+ {
+ *c ^= b;
+ *c ^= 1;
+ }
+ while (a > 1)
+ ;
+ return 0;
+}
diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c
index 5b1b8a1fdee..8740a7573ac 100644
--- a/gcc/tree-vect-loop.c
+++ b/gcc/tree-vect-loop.c
@@ -4787,20 +4787,17 @@ vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple *stmt,
if (GROUP_FIRST_ELEMENT (vinfo_for_stmt (stmt)))
{
tree first_vect = PHI_RESULT (new_phis[0]);
- tree tmp;
gassign *new_vec_stmt = NULL;
-
vec_dest = vect_create_destination_var (scalar_dest, vectype);
for (k = 1; k < new_phis.length (); k++)
{
gimple *next_phi = new_phis[k];
tree second_vect = PHI_RESULT (next_phi);
-
- tmp = build2 (code, vectype, first_vect, second_vect);
- new_vec_stmt = gimple_build_assign (vec_dest, tmp);
- first_vect = make_ssa_name (vec_dest, new_vec_stmt);
- gimple_assign_set_lhs (new_vec_stmt, first_vect);
+ tree tem = make_ssa_name (vec_dest, new_vec_stmt);
+ new_vec_stmt = gimple_build_assign (tem, code,
+ first_vect, second_vect);
gsi_insert_before (&exit_gsi, new_vec_stmt, GSI_SAME_STMT);
+ first_vect = tem;
}
new_phi_result = first_vect;
@@ -4810,6 +4807,28 @@ vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple *stmt,
new_phis.safe_push (new_vec_stmt);
}
}
+ /* Likewise if we couldn't use a single defuse cycle. */
+ else if (ncopies > 1)
+ {
+ gcc_assert (new_phis.length () == 1);
+ tree first_vect = PHI_RESULT (new_phis[0]);
+ gassign *new_vec_stmt = NULL;
+ vec_dest = vect_create_destination_var (scalar_dest, vectype);
+ gimple *next_phi = new_phis[0];
+ for (int k = 1; k < ncopies; ++k)
+ {
+ next_phi = STMT_VINFO_RELATED_STMT (vinfo_for_stmt (next_phi));
+ tree second_vect = PHI_RESULT (next_phi);
+ tree tem = make_ssa_name (vec_dest, new_vec_stmt);
+ new_vec_stmt = gimple_build_assign (tem, code,
+ first_vect, second_vect);
+ gsi_insert_before (&exit_gsi, new_vec_stmt, GSI_SAME_STMT);
+ first_vect = tem;
+ }
+ new_phi_result = first_vect;
+ new_phis.truncate (0);
+ new_phis.safe_push (new_vec_stmt);
+ }
else
new_phi_result = PHI_RESULT (new_phis[0]);