diff options
Diffstat (limited to 'gcc/tree-data-ref.cc')
-rw-r--r-- | gcc/tree-data-ref.cc | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/tree-data-ref.cc b/gcc/tree-data-ref.cc index ae05fe7..ff9327f 100644 --- a/gcc/tree-data-ref.cc +++ b/gcc/tree-data-ref.cc @@ -2968,6 +2968,25 @@ dr_may_alias_p (const struct data_reference *a, const struct data_reference *b, disambiguation. */ if (!loop_nest) { + tree tree_size_a = TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (a))); + tree tree_size_b = TYPE_SIZE_UNIT (TREE_TYPE (DR_REF (b))); + + if (DR_BASE_ADDRESS (a) + && DR_BASE_ADDRESS (b) + && operand_equal_p (DR_BASE_ADDRESS (a), DR_BASE_ADDRESS (b)) + && operand_equal_p (DR_OFFSET (a), DR_OFFSET (b)) + && poly_int_tree_p (tree_size_a) + && poly_int_tree_p (tree_size_b) + && !ranges_maybe_overlap_p (wi::to_widest (DR_INIT (a)), + wi::to_widest (tree_size_a), + wi::to_widest (DR_INIT (b)), + wi::to_widest (tree_size_b))) + { + gcc_assert (integer_zerop (DR_STEP (a)) + && integer_zerop (DR_STEP (b))); + return false; + } + aff_tree off1, off2; poly_widest_int size1, size2; get_inner_reference_aff (DR_REF (a), &off1, &size1); |