diff options
author | Richard Guenther <rguenther@suse.de> | 2011-08-23 12:40:57 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2011-08-23 12:40:57 +0000 |
commit | 02f5d6c5e36ea6a41e22f39209248bc1039759b7 (patch) | |
tree | ef30b2e656f6d882ebaac0ac1bf93bba51c441f9 /gcc/tree-affine.c | |
parent | 0fcbc86b5586c3c3bc370d43b2dea98108fd9796 (diff) | |
download | gcc-02f5d6c5e36ea6a41e22f39209248bc1039759b7.zip gcc-02f5d6c5e36ea6a41e22f39209248bc1039759b7.tar.gz gcc-02f5d6c5e36ea6a41e22f39209248bc1039759b7.tar.bz2 |
Makefile.in (tree-data-ref.o): Add tree-affine.h dependency.
2011-08-23 Richard Guenther <rguenther@suse.de>
* Makefile.in (tree-data-ref.o): Add tree-affine.h dependency.
* tree-affine.h (aff_comb_cannot_overlap_p): Declare.
* tree-affine.c (aff_comb_cannot_overlap_p): New function, moved
from ...
* tree-ssa-loop-im.c (cannot_overlap_p): ... here.
(mem_refs_may_alias_p): Adjust.
* tree-data-ref.h (dr_may_alias_p): Adjust.
* tree-data-ref.c: Include tree-affine.h.
(dr_analyze_indices): Do nothing for the non-loop case.
(dr_may_alias_p): Distinguish loop and non-loop case. Disambiguate
more cases in the non-loop case.
* graphite-sese-to-poly.c (write_alias_graph_to_ascii_dimacs): Adjust
calls to dr_may_alias_p.
(write_alias_graph_to_ascii_ecc): Likewise.
(write_alias_graph_to_ascii_dot): Likewise.
(build_alias_set_optimal_p): Likewise.
From-SVN: r177986
Diffstat (limited to 'gcc/tree-affine.c')
-rw-r--r-- | gcc/tree-affine.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/gcc/tree-affine.c b/gcc/tree-affine.c index 06b7f26..69cce2e 100644 --- a/gcc/tree-affine.c +++ b/gcc/tree-affine.c @@ -887,3 +887,30 @@ get_inner_reference_aff (tree ref, aff_tree *addr, double_int *size) *size = shwi_to_double_int ((bitsize + BITS_PER_UNIT - 1) / BITS_PER_UNIT); } +/* Returns true if a region of size SIZE1 at position 0 and a region of + size SIZE2 at position DIFF cannot overlap. */ + +bool +aff_comb_cannot_overlap_p (aff_tree *diff, double_int size1, double_int size2) +{ + double_int d, bound; + + /* Unless the difference is a constant, we fail. */ + if (diff->n != 0) + return false; + + d = diff->offset; + if (double_int_negative_p (d)) + { + /* The second object is before the first one, we succeed if the last + element of the second object is before the start of the first one. */ + bound = double_int_add (d, double_int_add (size2, double_int_minus_one)); + return double_int_negative_p (bound); + } + else + { + /* We succeed if the second object starts after the first one ends. */ + return double_int_scmp (size1, d) <= 0; + } +} + |