+2020-02-21 Jan Hubicka <hubicka@ucw.cz>
+ Richard Biener <rguenther@suse.de>
+
+ PR tree-optimization/93586
+ * tree-ssa-alias.c (nonoverlapping_array_refs_p): Finish array walk
+ after mismatched array refs; do not sure type size information to
+ recover from unmatched referneces with !flag_strict_aliasing_p.
+
2020-02-21 Andrew Stubbs <ams@codesourcery.com>
* config/gcn/gcn-valu.md (gather_load<mode>): Rename to ...
.nonoverlapping_refs_since_match_p_no_alias;
return 1;
}
- partial_overlap = false;
if (cmp == -1)
- seen_unmatched_ref_p = true;
+ {
+ seen_unmatched_ref_p = true;
+ /* We can not maintain the invariant that bases are either
+ same or completely disjoint. However we can still recover
+ from type based alias analysis if we reach referneces to
+ same sizes. We do not attempt to match array sizes, so
+ just finish array walking and look for component refs. */
+ if (!flag_strict_aliasing)
+ {
+ ++alias_stats.nonoverlapping_refs_since_match_p_may_alias;
+ return -1;
+ }
+ for (i++; i < narray_refs1; i++)
+ {
+ component_refs1.pop ();
+ component_refs2.pop ();
+ }
+ break;
+ }
+ partial_overlap = false;
}
}
}
ref1 = component_refs1.pop ();
if (TREE_CODE (ref1) != COMPONENT_REF)
- seen_unmatched_ref_p = true;
+ {
+ seen_unmatched_ref_p = true;
+ if (!flag_strict_aliasing)
+ {
+ ++alias_stats.nonoverlapping_refs_since_match_p_may_alias;
+ return -1;
+ }
+ }
}
while (!RECORD_OR_UNION_TYPE_P (TREE_TYPE (TREE_OPERAND (ref1, 0))));
}
ref2 = component_refs2.pop ();
if (TREE_CODE (ref2) != COMPONENT_REF)
- seen_unmatched_ref_p = true;
+ {
+ if (!flag_strict_aliasing)
+ {
+ ++alias_stats.nonoverlapping_refs_since_match_p_may_alias;
+ return -1;
+ }
+ seen_unmatched_ref_p = true;
+ }
}
while (!RECORD_OR_UNION_TYPE_P (TREE_TYPE (TREE_OPERAND (ref2, 0))));
partial_overlap = false;
+ gcc_checking_assert (!seen_unmatched_ref_p || flag_strict_aliasing);
+
/* If we skipped array refs on type of different sizes, we can
no longer be sure that there are not partial overlaps. */
if (seen_unmatched_ref_p