aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2019-05-06 13:40:00 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2019-05-06 13:40:00 +0000
commit898758504fa87d9f5e72c2c8b32139b413276a10 (patch)
tree1d6c3fa6b157d5eb3e466ec951d2ebb411bc400b /gcc
parenta37aba10107504daad790b0595dd4ef73ad59a6f (diff)
downloadgcc-898758504fa87d9f5e72c2c8b32139b413276a10.zip
gcc-898758504fa87d9f5e72c2c8b32139b413276a10.tar.gz
gcc-898758504fa87d9f5e72c2c8b32139b413276a10.tar.bz2
re PR tree-optimization/90358 (526.blender_r train run does not finish after r270847 on znver1)
2019-05-06 Richard Biener <rguenther@suse.de> PR tree-optimization/90358 * tree-vect-stmts.c (get_group_load_store_type): Properly detect unused upper half of load. (vectorizable_load): Likewise. * gcc.target/i386/pr90358.c: New testcase. From-SVN: r270911
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr90358.c35
-rw-r--r--gcc/tree-vect-stmts.c4
4 files changed, 50 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7661237..432b8c1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2019-05-06 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/90358
+ * tree-vect-stmts.c (get_group_load_store_type): Properly
+ detect unused upper half of load.
+ (vectorizable_load): Likewise.
+
+2019-05-06 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/88828
* tree-ssa-forwprop.c (get_bit_field_ref_def): Split out from...
(simplify_vector_constructor): ...here. Handle constants in
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ec1ec51..679ac80 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2019-05-06 Richard Biener <rguenther@suse.de>
+ PR tree-optimization/90358
+ * gcc.target/i386/pr90358.c: New testcase.
+
+2019-05-06 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/88828
* gcc.target/i386/pr88828-0.c: New testcase.
diff --git a/gcc/testsuite/gcc.target/i386/pr90358.c b/gcc/testsuite/gcc.target/i386/pr90358.c
new file mode 100644
index 0000000..4894fdb
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr90358.c
@@ -0,0 +1,35 @@
+/* PR target/90358 */
+/* { dg-do run { target { sse4_runtime } } } */
+/* { dg-options "-O3 -msse4" } */
+
+struct s { unsigned int a, b, c; };
+
+void __attribute__ ((noipa))
+foo (struct s *restrict s1, struct s *restrict s2, int n)
+{
+ for (int i = 0; i < n; ++i)
+ {
+ s1[i].b = s2[i].b;
+ s1[i].c = s2[i].c;
+ s2[i].c = 0;
+ }
+}
+
+#define N 12
+
+int
+main ()
+{
+ struct s s1[N], s2[N];
+ for (unsigned int j = 0; j < N; ++j)
+ {
+ s2[j].a = j * 5;
+ s2[j].b = j * 5 + 2;
+ s2[j].c = j * 5 + 4;
+ }
+ foo (s1, s2, N);
+ for (unsigned int j = 0; j < N; ++j)
+ if (s1[j].b != j * 5 + 2)
+ __builtin_abort ();
+ return 0;
+}
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 247d435..98e6df7 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -2273,6 +2273,7 @@ get_group_load_store_type (stmt_vec_info stmt_info, tree vectype, bool slp,
== dr_aligned
|| alignment_support_scheme == dr_unaligned_supported)
&& known_eq (nunits, (group_size - gap) * 2)
+ && known_eq (nunits, group_size)
&& mode_for_vector (elmode, (group_size - gap)).exists (&vmode)
&& VECTOR_MODE_P (vmode)
&& targetm.vector_mode_supported_p (vmode)
@@ -8550,7 +8551,8 @@ vectorizable_load (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
&& DR_GROUP_GAP (first_stmt_info) != 0
&& known_eq (nunits,
(group_size
- - DR_GROUP_GAP (first_stmt_info)) * 2))
+ - DR_GROUP_GAP (first_stmt_info)) * 2)
+ && known_eq (nunits, group_size))
ltype = build_vector_type (TREE_TYPE (vectype),
(group_size
- DR_GROUP_GAP