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