+2019-10-20 Jan Hubicka <hubicka@ucw.cz>
+
+ * tree-ssa-alias.c (nonoverlapping_refs_since_match_p): Do not
+ skip non-zero array accesses.
+
2019-10-20 Richard Sandiford <richard.sandiford@arm.com>
* tree-vect-slp.c (vect_slp_analyze_bb_1): Take a bb_vec_info
for (; narray_refs1 > narray_refs2; narray_refs1--)
{
ref1 = component_refs1.pop ();
- /* Track whether we possibly introduced partial overlap assuming
- that innermost type sizes does not match. This only can
- happen if the offset introduced by the ARRAY_REF
- is non-zero. */
+
+ /* If index is non-zero we need to check whether the reference
+ does not break the main invariant that bases are either
+ disjoint or equal. Consider the example:
+
+ unsigned char out[][1];
+ out[1]="a";
+ out[i][0];
+
+ Here bases out and out are same, but after removing the
+ [i] index, this invariant no longer holds, because
+ out[i] points to the middle of array out.
+
+ TODO: If size of type of the skipped reference is an integer
+ multiply of the size of type of the other reference this
+ invariant can be verified, but even then it is not completely
+ safe with !flag_strict_aliasing if the other reference contains
+ unbounded array accesses.
+ See */
+
if (!operand_equal_p (TREE_OPERAND (ref1, 1),
cheap_array_ref_low_bound (ref1), 0))
- seen_unmatched_ref_p = true;
+ return 0;
}
for (; narray_refs2 > narray_refs1; narray_refs2--)
{
ref2 = component_refs2.pop ();
if (!operand_equal_p (TREE_OPERAND (ref2, 1),
cheap_array_ref_low_bound (ref2), 0))
- seen_unmatched_ref_p = true;
+ return 0;
}
/* Try to disambiguate matched arrays. */
for (unsigned int i = 0; i < narray_refs1; i++)