diff options
author | Ian Lance Taylor <iant@golang.org> | 2022-07-27 10:15:41 -0700 |
---|---|---|
committer | Ian Lance Taylor <iant@golang.org> | 2022-07-27 10:15:41 -0700 |
commit | 9f62ed218fa656607740b386c0caa03e65dcd283 (patch) | |
tree | 6bde49bc5e4c4241266b108e4277baef4b85535d /gcc/tree-data-ref.cc | |
parent | 71e955da39cea0ebffcfee3432effa622d14ca99 (diff) | |
parent | 5eb9f117a361538834b9740d59219911680717d1 (diff) | |
download | gcc-9f62ed218fa656607740b386c0caa03e65dcd283.zip gcc-9f62ed218fa656607740b386c0caa03e65dcd283.tar.gz gcc-9f62ed218fa656607740b386c0caa03e65dcd283.tar.bz2 |
Merge from trunk revision 5eb9f117a361538834b9740d59219911680717d1.
Diffstat (limited to 'gcc/tree-data-ref.cc')
-rw-r--r-- | gcc/tree-data-ref.cc | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/gcc/tree-data-ref.cc b/gcc/tree-data-ref.cc index 397792c..ff9327f 100644 --- a/gcc/tree-data-ref.cc +++ b/gcc/tree-data-ref.cc @@ -593,8 +593,8 @@ compute_distributive_range (tree type, value_range &op0_range, gcc_assert (INTEGRAL_TYPE_P (type) && !TYPE_OVERFLOW_TRAPS (type)); if (result_range) { - range_operator *op = range_op_handler (code, type); - op->fold_range (*result_range, type, op0_range, op1_range); + range_op_handler op (code, type); + op.fold_range (*result_range, type, op0_range, op1_range); } /* The distributive property guarantees that if TYPE is no narrower @@ -639,10 +639,10 @@ compute_distributive_range (tree type, value_range &op0_range, range_cast (op0_range, ssizetype); range_cast (op1_range, ssizetype); value_range wide_range; - range_operator *op = range_op_handler (code, ssizetype); + range_op_handler op (code, ssizetype); bool saved_flag_wrapv = flag_wrapv; flag_wrapv = 1; - op->fold_range (wide_range, ssizetype, op0_range, op1_range); + op.fold_range (wide_range, ssizetype, op0_range, op1_range); flag_wrapv = saved_flag_wrapv; if (wide_range.num_pairs () != 1 || !range_int_cst_p (&wide_range)) return false; @@ -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); |