diff options
author | Alexander Monakov <amonakov@ispras.ru> | 2009-09-17 17:33:37 +0400 |
---|---|---|
committer | Alexander Monakov <amonakov@gcc.gnu.org> | 2009-09-17 17:33:37 +0400 |
commit | 98f3eb1f98f5f3749926f17c2b25736cd7c6fccc (patch) | |
tree | f78e2d3b8eb40141f1c072f1fb40f8648baee409 /gcc | |
parent | 07ffa034dd509e6838f565d51ee8b25292f79d1a (diff) | |
download | gcc-98f3eb1f98f5f3749926f17c2b25736cd7c6fccc.zip gcc-98f3eb1f98f5f3749926f17c2b25736cd7c6fccc.tar.gz gcc-98f3eb1f98f5f3749926f17c2b25736cd7c6fccc.tar.bz2 |
graphite-sese-to-poly.c (pdr_add_data_dimensions): Add bounds only for ARRAY_REFs.
2009-09-17 Alexander Monakov <amonakov@ispras.ru>
gcc:
* graphite-sese-to-poly.c (pdr_add_data_dimensions): Add bounds only
for ARRAY_REFs. Use array_ref_{low,up}_bound to determine bounds.
libgomp:
* testsuite/libgomp.graphite/bounds.c: New test.
From-SVN: r151802
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/graphite-sese-to-poly.c | 55 |
2 files changed, 31 insertions, 29 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eaf3baf..923a961 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2009-09-17 Alexander Monakov <amonakov@ispras.ru> + + * graphite-sese-to-poly.c (pdr_add_data_dimensions): Add bounds only + for ARRAY_REFs. Use array_ref_{low,up}_bound to determine bounds. + 2009-09-17 Martin Jambor <mjambor@suse.cz> * common.opt (fipa-sra): New switch. diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index ad64b8c..ccf539e 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -1654,45 +1654,26 @@ pdr_add_data_dimensions (ppl_Polyhedron_t accesses, data_reference_p dr, { tree ref = DR_REF (dr); int i, nb_subscripts = DR_NUM_DIMENSIONS (dr); - tree array_size; - HOST_WIDE_INT elt_size; - array_size = TYPE_SIZE (TREE_TYPE (ref)); - if (array_size == NULL_TREE - || TREE_CODE (array_size) != INTEGER_CST) - return; - - elt_size = int_cst_value (array_size); - - for (i = nb_subscripts - 1; i >= 0; i--) + for (i = nb_subscripts - 1; i >= 0; i--, ref = TREE_OPERAND (ref, 0)) { ppl_Linear_Expression_t expr; ppl_Constraint_t cstr; ppl_dimension_type subscript = dom_nb_dims + 1 + i; - int size; - - /* 0 <= subscript */ - ppl_new_Linear_Expression_with_dimension (&expr, accessp_nb_dims); - ppl_set_coef (expr, subscript, 1); - ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); - ppl_Polyhedron_add_constraint (accesses, cstr); - ppl_delete_Linear_Expression (expr); - ppl_delete_Constraint (cstr); + tree low, high; - ref = TREE_OPERAND (ref, 0); - array_size = TYPE_SIZE (TREE_TYPE (ref)); - if (array_size == NULL_TREE - || TREE_CODE (array_size) != INTEGER_CST) + if (TREE_CODE (ref) != ARRAY_REF) break; - /* subscript <= array_size */ - size = elt_size ? int_cst_value (array_size) / elt_size : 0; - if (size) + low = array_ref_low_bound (ref); + + /* subscript - low >= 0 */ + if (host_integerp (low, 0)) { ppl_new_Linear_Expression_with_dimension (&expr, accessp_nb_dims); - ppl_set_coef (expr, subscript, -1); + ppl_set_coef (expr, subscript, 1); - ppl_set_inhomogeneous (expr, size); + ppl_set_inhomogeneous (expr, -int_cst_value (low)); ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_Polyhedron_add_constraint (accesses, cstr); @@ -1700,7 +1681,23 @@ pdr_add_data_dimensions (ppl_Polyhedron_t accesses, data_reference_p dr, ppl_delete_Constraint (cstr); } - elt_size = int_cst_value (array_size); + high = array_ref_up_bound (ref); + + /* high - subscript >= 0 + XXX: 1-element arrays at end of structures may extend over their + declared size. */ + if (high && host_integerp (high, 0)) + { + ppl_new_Linear_Expression_with_dimension (&expr, accessp_nb_dims); + ppl_set_coef (expr, subscript, -1); + + ppl_set_inhomogeneous (expr, int_cst_value (high)); + + ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); + ppl_Polyhedron_add_constraint (accesses, cstr); + ppl_delete_Linear_Expression (expr); + ppl_delete_Constraint (cstr); + } } } |