-Aditya
2015-07-17 Aditya Kumar <aditya...@samsung.com>
Sebastian Pop <s....@samsung.com>
PR middle-end/61929
* graphite-dependences.c (add_pdr_constraints): Renamed
pdr->extent to pdr->subscript_sizes.
* graphite-interchange.c (build_linearized_memory_access): Add
back all gcc_assert's that the "isl_int to isl_val conversion"
patch has removed (fixed the bootstrap). Refactored.
(pdr_stride_in_loop): Renamed pdr->extent to pdr->subscript_sizes.
* graphite-poly.c (new_poly_dr): Same.
(free_poly_dr): Same.
* graphite-poly.h (struct poly_dr): Same.
* graphite-scop-detection.c (stmt_has_simple_data_refs_p): Ignore
all data references other than ARRAY_REF and MEM_REF (fixed the
bootstrap).
* graphite-scop-detection.h: Fix space.
* graphite-sese-to-poly.c (build_pbb_scattering_polyhedrons): Add
back all gcc_assert's removed by a previous patch.
(wrap): Remove the_isl_ctx global variable that the same patch has
added.
(build_loop_iteration_domains): Same.
(add_param_constraints): Same.
(pdr_add_data_dimensions): Same. Refactored.
(build_poly_dr): Renamed extent to subscript_sizes.
testsuite/
PR middle-end/61929
* gcc.dg/graphite/pr61929.c: New.
---
gcc/graphite-dependences.c | 4 +--
gcc/graphite-interchange.c | 55
+++++++++++++++++----------------
gcc/graphite-poly.c | 6 ++--
gcc/graphite-poly.h | 2 +-
gcc/graphite-scop-detection.c | 22 +++++++++----
gcc/graphite-scop-detection.h | 2 +-
gcc/graphite-sese-to-poly.c | 54
++++++++++++++++----------------
gcc/testsuite/gcc.dg/graphite/pr61929.c | 19 ++++++++++++
8 files changed, 97 insertions(+), 67 deletions(-) create mode 100644
gcc/testsuite/gcc.dg/graphite/pr61929.c
diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c index
50fe73e..af18ecb 100644
--- a/gcc/graphite-dependences.c
+++ b/gcc/graphite-dependences.c
@@ -88,13 +88,13 @@ constrain_domain (isl_map *map, isl_set *s)
return isl_map_intersect_domain (map, s); }
-/* Constrain pdr->accesses with pdr->extent and pbb->domain. */
+/* Constrain pdr->accesses with pdr->subscript_sizes and pbb->domain.
+*/
static isl_map *
add_pdr_constraints (poly_dr_p pdr, poly_bb_p pbb) {
isl_map *x = isl_map_intersect_range (isl_map_copy (pdr->accesses),
- isl_set_copy (pdr->extent));
+ isl_set_copy
(pdr->subscript_sizes));
x = constrain_domain (x, isl_set_copy (pbb->domain));
return x;
}
diff --git a/gcc/graphite-interchange.c b/gcc/graphite-interchange.c index
aee51a8..03c2c63 100644
--- a/gcc/graphite-interchange.c
+++ b/gcc/graphite-interchange.c
@@ -79,37 +79,40 @@ extern "C" {
static isl_constraint *
build_linearized_memory_access (isl_map *map, poly_dr_p pdr) {
- isl_constraint *res;
isl_local_space *ls = isl_local_space_from_space (isl_map_get_space
(map));
- unsigned offset, nsubs;
- int i;
- isl_ctx *ctx;
+ isl_constraint *res = isl_equality_alloc (ls); isl_val *size =
+ isl_val_int_from_ui (isl_map_get_ctx (map), 1);
- isl_val *size, *subsize, *size1;
-
- res = isl_equality_alloc (ls);
- ctx = isl_local_space_get_ctx (ls);
- size = isl_val_int_from_ui (ctx, 1);
-
- nsubs = isl_set_dim (pdr->extent, isl_dim_set);
+ unsigned nsubs = isl_set_dim (pdr->subscript_sizes, isl_dim_set);
/* -1 for the already included L dimension. */
- offset = isl_map_dim (map, isl_dim_out) - 1 - nsubs;
+ unsigned offset = isl_map_dim (map, isl_dim_out) - 1 - nsubs;
res = isl_constraint_set_coefficient_si (res, isl_dim_out, offset +
nsubs, -1);
- /* Go through all subscripts from last to first. First dimension
+ /* Go through all subscripts from last to first. The dimension "i=0"
is the alias set, ignore it. */
- for (i = nsubs - 1; i >= 1; i--)
+ for (int i = nsubs - 1; i >= 1; i--)
{
- isl_space *dc;
- isl_aff *aff;
-
- size1 = isl_val_copy (size);
- res = isl_constraint_set_coefficient_val (res, isl_dim_out, offset +
i, size);
- dc = isl_set_get_space (pdr->extent);
- aff = isl_aff_zero_on_domain (isl_local_space_from_space (dc));
- aff = isl_aff_set_coefficient_si (aff, isl_dim_in, i, 1);
- subsize = isl_set_max_val (pdr->extent, aff);
- isl_aff_free (aff);
- size = isl_val_mul (size1, subsize);
+ isl_aff *extract_dim;
+ res = isl_constraint_set_coefficient_val (res, isl_dim_out, offset +
i,
+ isl_val_copy (size));
+ isl_space *dc = isl_set_get_space (pdr->subscript_sizes);
+ extract_dim = isl_aff_zero_on_domain (isl_local_space_from_space
(dc));
+ extract_dim = isl_aff_set_coefficient_si (extract_dim, isl_dim_in, i,
1);
+ isl_val *max = isl_set_max_val (pdr->subscript_sizes, extract_dim);
+ isl_aff_free (extract_dim);
+
+ /* The result is NULL in case of an error, the optimal value in case
there
+ is one, negative infinity or infinity if the problem is unbounded
and
+ NaN if the problem is empty. */
+ gcc_assert (max);
+
+ /* When one of the dimensions cannot be computed, we cannot build the
size
+ of the array for any outer dimensions. */
+ if (!isl_val_is_int (max))
+ {
+ isl_val_free (max);
+ break;
+ }
+ size = isl_val_mul (size, max);
}
isl_val_free (size);
@@ -176,7 +179,7 @@ pdr_stride_in_loop (mpz_t stride, graphite_dim_t depth,
poly_dr_p pdr)
/* pdr->accesses: [P1..nb_param,I1..nb_domain]->[a,S1..nb_subscript]
??? [P] not used for PDRs?
- pdr->extent: [a,S1..nb_subscript]
+ pdr->subscript_sizes: [a,S1..nb_subscript]
pbb->domain: [P1..nb_param,I1..nb_domain]
pbb->transformed: [P1..nb_param,I1..nb_domain]->[T1..Tnb_sctr]
[T] includes local vars (currently unused) diff --git
a/gcc/graphite-poly.c b/gcc/graphite-poly.c index bcd08d8..2eff5a5a 100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -270,7 +270,7 @@ apply_poly_transforms (scop_p scop) void new_poly_dr
(poly_bb_p pbb, int dr_base_object_set,
enum poly_dr_type type, void *cdr, graphite_dim_t
nb_subscripts,
- isl_map *acc, isl_set *extent)
+ isl_map *acc, isl_set *subscript_sizes)
{
static int id = 0;
poly_dr_p pdr = XNEW (struct poly_dr); @@ -280,7 +280,7 @@ new_poly_dr
(poly_bb_p pbb, int dr_base_object_set,
PDR_NB_REFS (pdr) = 1;
PDR_PBB (pdr) = pbb;
pdr->accesses = acc;
- pdr->extent = extent;
+ pdr->subscript_sizes = subscript_sizes;
PDR_TYPE (pdr) = type;
PDR_CDR (pdr) = cdr;
PDR_NB_SUBSCRIPTS (pdr) = nb_subscripts; @@ -293,7 +293,7 @@ void
free_poly_dr (poly_dr_p pdr) {
isl_map_free (pdr->accesses);
- isl_set_free (pdr->extent);
+ isl_set_free (pdr->subscript_sizes);
XDELETE (pdr);
}
diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h index
7ffd18e..82e1217 100644
--- a/gcc/graphite-poly.h
+++ b/gcc/graphite-poly.h
@@ -177,7 +177,7 @@ struct poly_dr
In the example, the vector "R C O I L P" is "7 7 3 2 0 1". */
isl_map *accesses;
- isl_set *extent;
+ isl_set *subscript_sizes;
/* Data reference's base object set number, we must assure 2 pdrs are in
the
same base object set before dependency checking. */ diff --git
a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index
47e0da0..ba0434c 100644
--- a/gcc/graphite-scop-detection.c
+++ b/gcc/graphite-scop-detection.c
@@ -289,7 +289,6 @@ stmt_has_simple_data_refs_p (loop_p outermost_loop
ATTRIBUTE_UNUSED,
gimple stmt)
{
data_reference_p dr;
- unsigned i;
int j;
bool res = true;
vec<data_reference_p> drs = vNULL;
@@ -302,18 +301,29 @@ stmt_has_simple_data_refs_p (loop_p outermost_loop
ATTRIBUTE_UNUSED,
stmt, &drs);
FOR_EACH_VEC_ELT (drs, j, dr)
- for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
- if (!graphite_can_represent_scev (DR_ACCESS_FN (dr, i)))
+ {
+ int nb_subscripts = DR_NUM_DIMENSIONS (dr);
+ tree ref = DR_REF (dr);
+
+ for (int i = nb_subscripts - 1; i >= 0; i--)
{
- res = false;
- goto done;
+ if (!graphite_can_represent_scev (DR_ACCESS_FN (dr, i))
+ || (TREE_CODE (ref) != ARRAY_REF
+ && TREE_CODE (ref) != MEM_REF
+ && TREE_CODE (ref) != COMPONENT_REF))
+ {
+ free_data_refs (drs);
+ return false;
+ }
+
+ ref = TREE_OPERAND (ref, 0);
}
+ }
free_data_refs (drs);
drs.create (0);
}
- done:
free_data_refs (drs);
return res;
}
diff --git a/gcc/graphite-scop-detection.h b/gcc/graphite-scop-detection.h
index 8e794c3..4511796 100644
--- a/gcc/graphite-scop-detection.h
+++ b/gcc/graphite-scop-detection.h
@@ -23,7 +23,7 @@ along with GCC; see the file COPYING3. If not see
#define GCC_GRAPHITE_SCOP_DETECTION_H
extern void build_scops (vec<scop_p> *); -extern void dot_all_scops
(vec<scop_p> );
+extern void dot_all_scops (vec<scop_p>);
extern void dot_scop (scop_p);
#endif /* GCC_GRAPHITE_SCOP_DETECTION_H */ diff --git
a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index
5064247..08607fa 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -497,6 +497,7 @@ build_pbb_scattering_polyhedrons (isl_aff *static_sched,
(isl_local_space_from_space (isl_map_get_space
(pbb->schedule)));
val = isl_aff_get_coefficient_val (static_sched, isl_dim_in, i /
2);
+ gcc_assert (val && isl_val_is_int (val));
val = isl_val_neg (val);
c = isl_constraint_set_constant_val (c, val); @@ -719,14 +720,12
@@ extract_affine_int (tree e, __isl_take isl_space *space)
/* Compute pwaff mod 2^width. */
-extern isl_ctx *the_isl_ctx;
-
static isl_pw_aff *
wrap (isl_pw_aff *pwaff, unsigned width) {
isl_val *mod;
- mod = isl_val_int_from_ui(the_isl_ctx, width);
+ mod = isl_val_int_from_ui (isl_pw_aff_get_ctx (pwaff), width);
mod = isl_val_2exp (mod);
pwaff = isl_pw_aff_mod_val (pwaff, mod);
@@ -1005,7 +1004,7 @@ build_loop_iteration_domains (scop_p scop, struct loop
*loop,
(isl_local_space_from_space (isl_space_copy (space)));
c = isl_constraint_set_coefficient_si (c, isl_dim_set, pos, -1);
tree_int_to_gmp (nb_iters, g);
- v = isl_val_int_from_gmp (the_isl_ctx, g);
+ v = isl_val_int_from_gmp (scop->ctx, g);
c = isl_constraint_set_constant_val (c, v);
inner = isl_set_add_constraint (inner, c);
}
@@ -1060,7 +1059,7 @@ build_loop_iteration_domains (scop_p scop, struct loop
*loop,
c = isl_inequality_alloc
(isl_local_space_from_space (isl_space_copy (space)));
c = isl_constraint_set_coefficient_si (c, isl_dim_set, pos, -1);
- v = isl_val_int_from_gmp (the_isl_ctx, g);
+ v = isl_val_int_from_gmp (scop->ctx, g);
mpz_clear (g);
c = isl_constraint_set_constant_val (c, v);
inner = isl_set_add_constraint (inner, c); @@ -1324,7 +1323,7 @@
add_param_constraints (scop_p scop, graphite_dim_t p)
c = isl_inequality_alloc (isl_local_space_from_space (space));
mpz_init (g);
tree_int_to_gmp (lb, g);
- v = isl_val_int_from_gmp (the_isl_ctx, g);
+ v = isl_val_int_from_gmp (scop->ctx, g);
v = isl_val_neg (v);
mpz_clear (g);
c = isl_constraint_set_constant_val (c, v); @@ -1344,7 +1343,7 @@
add_param_constraints (scop_p scop, graphite_dim_t p)
mpz_init (g);
tree_int_to_gmp (ub, g);
- v = isl_val_int_from_gmp (the_isl_ctx, g);
+ v = isl_val_int_from_gmp (scop->ctx, g);
mpz_clear (g);
c = isl_constraint_set_constant_val (c, v);
c = isl_constraint_set_coefficient_si (c, isl_dim_param, p, -1); @@
-1480,20 +1479,19 @@ pdr_add_memory_accesses (isl_map *acc, data_reference_p
dr, poly_bb_p pbb)
domain. */
static isl_set *
-pdr_add_data_dimensions (isl_set *extent, scop_p scop, data_reference_p dr)
+pdr_add_data_dimensions (isl_set *subscript_sizes, scop_p scop,
+ data_reference_p dr)
{
tree ref = DR_REF (dr);
- int i, nb_subscripts = DR_NUM_DIMENSIONS (dr);
- for (i = nb_subscripts - 1; i >= 0; i--, ref = TREE_OPERAND (ref, 0))
+ int nb_subscripts = DR_NUM_DIMENSIONS (dr); for (int i =
+ nb_subscripts - 1; i >= 0; i--, ref = TREE_OPERAND (ref, 0))
{
- tree low, high;
-
if (TREE_CODE (ref) != ARRAY_REF)
- break;
+ return subscript_sizes;
- low = array_ref_low_bound (ref);
- high = array_ref_up_bound (ref);
+ tree low = array_ref_low_bound (ref);
+ tree high = array_ref_up_bound (ref);
/* XXX The PPL code dealt separately with
subscript - low >= 0 and high - subscript >= 0 in case one of @@
-1511,10 +1509,10 @@ pdr_add_data_dimensions (isl_set *extent, scop_p scop,
data_reference_p dr)
isl_aff *aff;
isl_set *univ, *lbs, *ubs;
isl_pw_aff *index;
- isl_space *space;
isl_set *valid;
- isl_pw_aff *lb = extract_affine_int (low, isl_set_get_space
(extent));
- isl_pw_aff *ub = extract_affine_int (high, isl_set_get_space
(extent));
+ isl_space *space = isl_set_get_space (subscript_sizes);
+ isl_pw_aff *lb = extract_affine_int (low, isl_space_copy (space));
+ isl_pw_aff *ub = extract_affine_int (high, isl_space_copy
(space));
/* high >= 0 */
valid = isl_pw_aff_nonneg_set (isl_pw_aff_copy (ub)); @@ -1522,25
+1520,24 @@ pdr_add_data_dimensions (isl_set *extent, scop_p scop,
data_reference_p dr)
isl_set_dim (valid, isl_dim_set));
scop->context = isl_set_intersect (scop->context, valid);
- space = isl_set_get_space (extent);
aff = isl_aff_zero_on_domain (isl_local_space_from_space (space));
aff = isl_aff_add_coefficient_si (aff, isl_dim_in, i + 1, 1);
univ = isl_set_universe (isl_space_domain (isl_aff_get_space
(aff)));
index = isl_pw_aff_alloc (univ, aff);
- id = isl_set_get_tuple_id (extent);
+ id = isl_set_get_tuple_id (subscript_sizes);
lb = isl_pw_aff_set_tuple_id (lb, isl_dim_in, isl_id_copy (id));
ub = isl_pw_aff_set_tuple_id (ub, isl_dim_in, id);
/* low <= sub_i <= high */
lbs = isl_pw_aff_ge_set (isl_pw_aff_copy (index), lb);
ubs = isl_pw_aff_le_set (index, ub);
- extent = isl_set_intersect (extent, lbs);
- extent = isl_set_intersect (extent, ubs);
+ subscript_sizes = isl_set_intersect (subscript_sizes, lbs);
+ subscript_sizes = isl_set_intersect (subscript_sizes, ubs);
}
}
- return extent;
+ return subscript_sizes;
}
/* Build data accesses for DR in PBB. */ @@ -1550,7 +1547,7 @@
build_poly_dr (data_reference_p dr, poly_bb_p pbb) {
int dr_base_object_set;
isl_map *acc;
- isl_set *extent;
+ isl_set *subscript_sizes;
scop_p scop = PBB_SCOP (pbb);
{
@@ -1577,9 +1574,10 @@ build_poly_dr (data_reference_p dr, poly_bb_p pbb)
alias_set_num = *(bap->alias_set);
space = isl_space_set_tuple_id (space, isl_dim_set, id);
- extent = isl_set_nat_universe (space);
- extent = isl_set_fix_si (extent, isl_dim_set, 0, alias_set_num);
- extent = pdr_add_data_dimensions (extent, scop, dr);
+ subscript_sizes = isl_set_nat_universe (space);
+ subscript_sizes = isl_set_fix_si (subscript_sizes, isl_dim_set, 0,
+ alias_set_num);
+ subscript_sizes = pdr_add_data_dimensions (subscript_sizes, scop,
+dr);
}
gcc_assert (dr->aux);
@@ -1587,7 +1585,7 @@ build_poly_dr (data_reference_p dr, poly_bb_p pbb)
new_poly_dr (pbb, dr_base_object_set,
DR_IS_READ (dr) ? PDR_READ : PDR_WRITE,
- dr, DR_NUM_DIMENSIONS (dr), acc, extent);
+ dr, DR_NUM_DIMENSIONS (dr), acc, subscript_sizes);
}
/* Write to FILE the alias graph of data references in DIMACS format. */
diff --git a/gcc/testsuite/gcc.dg/graphite/pr61929.c
b/gcc/testsuite/gcc.dg/graphite/pr61929.c
new file mode 100644
index 0000000..9999ebf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/graphite/pr61929.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-loop-linear -floop-strip-mine" } */
+
+typedef struct m {
+ char *A;
+ char *B;
+} mystruct;
+mystruct arr[52];
+
+void main () {}
+void generateICE (void)
+{
+ int i;
+ for (i=0; i<52; i++)
+ {
+ arr[i].A = "";
+ arr[i].B = 0;
+ }
+}
--
2.1.0.243.g30d45f7
-----Original Message-----
From: Tobias Grosser [mailto:tob...@grosser.es]
Sent: Thursday, July 16, 2015 11:31 PM
To: Sebastian Pop; gcc-patches@gcc.gnu.org
Cc: seb...@gmail.com; aditya...@samsung.com; richard.guent...@gmail.com
Subject: Re: [PATCH] [graphite] fix pr61929
On 07/17/2015 12:23 AM, Sebastian Pop wrote:
This fixes bootstrap of GCC with BOOT_CFLAGS="-g -O2
-fgraphite-identity -floop-nest-optimize -floop-block -floop-interchange
-floop-strip-mine".
It passes regstrap on amd64-linux.
Ok to commit to trunk?
Very nice.
this but seems to include multiple fixes and refactorings at the same time.
I personally would prefer to at least separate the functional and
non-functional changes, such that the actual bug fixed becomes clear.
If splitting the patch is difficult, can you at least point out in the
commit message, which of your changes now actually fixed the bootstrap?
Otherwise, LGTM.
Best,
Tobias
Thanks.
2015-07-15 Aditya Kumar <aditya...@samsung.com>
Sebastian Pop <s....@samsung.com>
PR middle-end/61929
* graphite-dependences.c (add_pdr_constraints): Renamed
pdr->extent to pdr->subscript_sizes.
* graphite-interchange.c (build_linearized_memory_access): Add
back all gcc_assert's that the "isl_int to isl_val conversion"
patch has removed. Refactored.
(pdr_stride_in_loop): Renamed pdr->extent to pdr->subscript_sizes.
* graphite-poly.c (new_poly_dr): Same.
(free_poly_dr): Same.
* graphite-poly.h (struct poly_dr): Same.
* graphite-scop-detection.c (stmt_has_simple_data_refs_p): Ignore
all data references other than ARRAY_REF and MEM_REF.
* graphite-scop-detection.h: Fix space.
* graphite-sese-to-poly.c (build_pbb_scattering_polyhedrons): Add
back all gcc_assert's removed by a previous patch.
(wrap): Remove the_isl_ctx global variable that the same patch has
added.
(build_loop_iteration_domains): Same.
(add_param_constraints): Same.
(pdr_add_data_dimensions): Same. Refactored.
(build_poly_dr): Renamed extent to subscript_sizes.
testsuite/
PR middle-end/61929
* gcc.dg/graphite/pr61929.c: New.
---
gcc/graphite-dependences.c | 4 +--
gcc/graphite-interchange.c | 55
+++++++++++++++++----------------
gcc/graphite-poly.c | 6 ++--
gcc/graphite-poly.h | 2 +-
gcc/graphite-scop-detection.c | 22 +++++++++----
gcc/graphite-scop-detection.h | 2 +-
gcc/graphite-sese-to-poly.c | 54
++++++++++++++++----------------
gcc/testsuite/gcc.dg/graphite/pr61929.c | 19 ++++++++++++
8 files changed, 97 insertions(+), 67 deletions(-)
create mode 100644 gcc/testsuite/gcc.dg/graphite/pr61929.c
diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c
index 50fe73e..af18ecb 100644
--- a/gcc/graphite-dependences.c
+++ b/gcc/graphite-dependences.c
@@ -88,13 +88,13 @@ constrain_domain (isl_map *map, isl_set *s)
return isl_map_intersect_domain (map, s);
}
-/* Constrain pdr->accesses with pdr->extent and pbb->domain. */
+/* Constrain pdr->accesses with pdr->subscript_sizes and pbb->domain.
+*/
static isl_map *
add_pdr_constraints (poly_dr_p pdr, poly_bb_p pbb)
{
isl_map *x = isl_map_intersect_range (isl_map_copy (pdr->accesses),
- isl_set_copy (pdr->extent));
+ isl_set_copy
(pdr->subscript_sizes));
x = constrain_domain (x, isl_set_copy (pbb->domain));
return x;
}
diff --git a/gcc/graphite-interchange.c b/gcc/graphite-interchange.c
index aee51a8..03c2c63 100644
--- a/gcc/graphite-interchange.c
+++ b/gcc/graphite-interchange.c
@@ -79,37 +79,40 @@ extern "C" {
static isl_constraint *
build_linearized_memory_access (isl_map *map, poly_dr_p pdr)
{
- isl_constraint *res;
isl_local_space *ls = isl_local_space_from_space
(isl_map_get_space (map));
- unsigned offset, nsubs;
- int i;
- isl_ctx *ctx;
+ isl_constraint *res = isl_equality_alloc (ls); isl_val *size =
+ isl_val_int_from_ui (isl_map_get_ctx (map), 1);
- isl_val *size, *subsize, *size1;
-
- res = isl_equality_alloc (ls);
- ctx = isl_local_space_get_ctx (ls);
- size = isl_val_int_from_ui (ctx, 1);
-
- nsubs = isl_set_dim (pdr->extent, isl_dim_set);
+ unsigned nsubs = isl_set_dim (pdr->subscript_sizes, isl_dim_set);
/* -1 for the already included L dimension. */
- offset = isl_map_dim (map, isl_dim_out) - 1 - nsubs;
+ unsigned offset = isl_map_dim (map, isl_dim_out) - 1 - nsubs;
res = isl_constraint_set_coefficient_si (res, isl_dim_out, offset
+ nsubs, -1);
- /* Go through all subscripts from last to first. First dimension
+ /* Go through all subscripts from last to first. The dimension "i=0"
is the alias set, ignore it. */
- for (i = nsubs - 1; i >= 1; i--)
+ for (int i = nsubs - 1; i >= 1; i--)
{
- isl_space *dc;
- isl_aff *aff;
-
- size1 = isl_val_copy (size);
- res = isl_constraint_set_coefficient_val (res, isl_dim_out, offset
+ i, size);
- dc = isl_set_get_space (pdr->extent);
- aff = isl_aff_zero_on_domain (isl_local_space_from_space (dc));
- aff = isl_aff_set_coefficient_si (aff, isl_dim_in, i, 1);
- subsize = isl_set_max_val (pdr->extent, aff);
- isl_aff_free (aff);
- size = isl_val_mul (size1, subsize);
+ isl_aff *extract_dim;
+ res = isl_constraint_set_coefficient_val (res, isl_dim_out, offset
+ i,
+ isl_val_copy (size));
+ isl_space *dc = isl_set_get_space (pdr->subscript_sizes);
+ extract_dim = isl_aff_zero_on_domain (isl_local_space_from_space
(dc));
+ extract_dim = isl_aff_set_coefficient_si (extract_dim, isl_dim_in,
i, 1);
+ isl_val *max = isl_set_max_val (pdr->subscript_sizes, extract_dim);
+ isl_aff_free (extract_dim);
+
+ /* The result is NULL in case of an error, the optimal value in
case there
+ is one, negative infinity or infinity if the problem is unbounded
and
+ NaN if the problem is empty. */
+ gcc_assert (max);
+
+ /* When one of the dimensions cannot be computed, we cannot build
the size
+ of the array for any outer dimensions. */
+ if (!isl_val_is_int (max))
+ {
+ isl_val_free (max);
+ break;
+ }
+ size = isl_val_mul (size, max);
}
isl_val_free (size);
@@ -176,7 +179,7 @@ pdr_stride_in_loop (mpz_t stride, graphite_dim_t
depth, poly_dr_p pdr)
/* pdr->accesses:
[P1..nb_param,I1..nb_domain]->[a,S1..nb_subscript]
??? [P] not used for PDRs?
- pdr->extent: [a,S1..nb_subscript]
+ pdr->subscript_sizes: [a,S1..nb_subscript]
pbb->domain: [P1..nb_param,I1..nb_domain]
pbb->transformed: [P1..nb_param,I1..nb_domain]->[T1..Tnb_sctr]
[T] includes local vars (currently unused) diff --git
a/gcc/graphite-poly.c b/gcc/graphite-poly.c index bcd08d8..2eff5a5a
100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -270,7 +270,7 @@ apply_poly_transforms (scop_p scop)
void
new_poly_dr (poly_bb_p pbb, int dr_base_object_set,
enum poly_dr_type type, void *cdr, graphite_dim_t
nb_subscripts,
- isl_map *acc, isl_set *extent)
+ isl_map *acc, isl_set *subscript_sizes)
{
static int id = 0;
poly_dr_p pdr = XNEW (struct poly_dr); @@ -280,7 +280,7 @@
new_poly_dr (poly_bb_p pbb, int dr_base_object_set,
PDR_NB_REFS (pdr) = 1;
PDR_PBB (pdr) = pbb;
pdr->accesses = acc;
- pdr->extent = extent;
+ pdr->subscript_sizes = subscript_sizes;
PDR_TYPE (pdr) = type;
PDR_CDR (pdr) = cdr;
PDR_NB_SUBSCRIPTS (pdr) = nb_subscripts; @@ -293,7 +293,7 @@ void
free_poly_dr (poly_dr_p pdr)
{
isl_map_free (pdr->accesses);
- isl_set_free (pdr->extent);
+ isl_set_free (pdr->subscript_sizes);
XDELETE (pdr);
}
diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h index
7ffd18e..82e1217 100644
--- a/gcc/graphite-poly.h
+++ b/gcc/graphite-poly.h
@@ -177,7 +177,7 @@ struct poly_dr
In the example, the vector "R C O I L P" is "7 7 3 2 0 1". */
isl_map *accesses;
- isl_set *extent;
+ isl_set *subscript_sizes;
/* Data reference's base object set number, we must assure 2 pdrs are
in the
same base object set before dependency checking. */ diff --git
a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index
47e0da0..ba0434c 100644
--- a/gcc/graphite-scop-detection.c
+++ b/gcc/graphite-scop-detection.c
@@ -289,7 +289,6 @@ stmt_has_simple_data_refs_p (loop_p outermost_loop
ATTRIBUTE_UNUSED,
gimple stmt)
{
data_reference_p dr;
- unsigned i;
int j;
bool res = true;
vec<data_reference_p> drs = vNULL; @@ -302,18 +301,29 @@
stmt_has_simple_data_refs_p (loop_p outermost_loop ATTRIBUTE_UNUSED,
stmt, &drs);
FOR_EACH_VEC_ELT (drs, j, dr)
- for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
- if (!graphite_can_represent_scev (DR_ACCESS_FN (dr, i)))
+ {
+ int nb_subscripts = DR_NUM_DIMENSIONS (dr);
+ tree ref = DR_REF (dr);
+
+ for (int i = nb_subscripts - 1; i >= 0; i--)
{
- res = false;
- goto done;
+ if (!graphite_can_represent_scev (DR_ACCESS_FN (dr, i))
+ || (TREE_CODE (ref) != ARRAY_REF
+ && TREE_CODE (ref) != MEM_REF
+ && TREE_CODE (ref) != COMPONENT_REF))
+ {
+ free_data_refs (drs);
+ return false;
+ }
+
+ ref = TREE_OPERAND (ref, 0);
}
+ }
free_data_refs (drs);
drs.create (0);
}
- done:
free_data_refs (drs);
return res;
}
diff --git a/gcc/graphite-scop-detection.h
b/gcc/graphite-scop-detection.h index 8e794c3..4511796 100644
--- a/gcc/graphite-scop-detection.h
+++ b/gcc/graphite-scop-detection.h
@@ -23,7 +23,7 @@ along with GCC; see the file COPYING3. If not see
#define GCC_GRAPHITE_SCOP_DETECTION_H
extern void build_scops (vec<scop_p> *); -extern void dot_all_scops
(vec<scop_p> );
+extern void dot_all_scops (vec<scop_p>);
extern void dot_scop (scop_p);
#endif /* GCC_GRAPHITE_SCOP_DETECTION_H */ diff --git
a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index
5064247..08607fa 100644
--- a/gcc/graphite-sese-to-poly.c
+++ b/gcc/graphite-sese-to-poly.c
@@ -497,6 +497,7 @@ build_pbb_scattering_polyhedrons (isl_aff
*static_sched,
(isl_local_space_from_space (isl_map_get_space
(pbb->schedule)));
val = isl_aff_get_coefficient_val (static_sched, isl_dim_in, i /
2);
+ gcc_assert (val && isl_val_is_int (val));
val = isl_val_neg (val);
c = isl_constraint_set_constant_val (c, val); @@ -719,14 +720,12
@@ extract_affine_int (tree e, __isl_take isl_space *space)
/* Compute pwaff mod 2^width. */
-extern isl_ctx *the_isl_ctx;
-
static isl_pw_aff *
wrap (isl_pw_aff *pwaff, unsigned width)
{
isl_val *mod;
- mod = isl_val_int_from_ui(the_isl_ctx, width);
+ mod = isl_val_int_from_ui (isl_pw_aff_get_ctx (pwaff), width);
mod = isl_val_2exp (mod);
pwaff = isl_pw_aff_mod_val (pwaff, mod);
@@ -1005,7 +1004,7 @@ build_loop_iteration_domains (scop_p scop, struct
loop *loop,
(isl_local_space_from_space (isl_space_copy (space)));
c = isl_constraint_set_coefficient_si (c, isl_dim_set, pos, -1);
tree_int_to_gmp (nb_iters, g);
- v = isl_val_int_from_gmp (the_isl_ctx, g);
+ v = isl_val_int_from_gmp (scop->ctx, g);
c = isl_constraint_set_constant_val (c, v);
inner = isl_set_add_constraint (inner, c);
}
@@ -1060,7 +1059,7 @@ build_loop_iteration_domains (scop_p scop, struct
loop *loop,
c = isl_inequality_alloc
(isl_local_space_from_space (isl_space_copy (space)));
c = isl_constraint_set_coefficient_si (c, isl_dim_set, pos, -1);
- v = isl_val_int_from_gmp (the_isl_ctx, g);
+ v = isl_val_int_from_gmp (scop->ctx, g);
mpz_clear (g);
c = isl_constraint_set_constant_val (c, v);
inner = isl_set_add_constraint (inner, c); @@ -1324,7 +1323,7 @@
add_param_constraints (scop_p scop, graphite_dim_t p)
c = isl_inequality_alloc (isl_local_space_from_space (space));
mpz_init (g);
tree_int_to_gmp (lb, g);
- v = isl_val_int_from_gmp (the_isl_ctx, g);
+ v = isl_val_int_from_gmp (scop->ctx, g);
v = isl_val_neg (v);
mpz_clear (g);
c = isl_constraint_set_constant_val (c, v); @@ -1344,7 +1343,7
@@ add_param_constraints (scop_p scop, graphite_dim_t p)
mpz_init (g);
tree_int_to_gmp (ub, g);
- v = isl_val_int_from_gmp (the_isl_ctx, g);
+ v = isl_val_int_from_gmp (scop->ctx, g);
mpz_clear (g);
c = isl_constraint_set_constant_val (c, v);
c = isl_constraint_set_coefficient_si (c, isl_dim_param, p,
-1); @@ -1480,20 +1479,19 @@ pdr_add_memory_accesses (isl_map *acc,
data_reference_p dr, poly_bb_p pbb)
domain. */
static isl_set *
-pdr_add_data_dimensions (isl_set *extent, scop_p scop,
data_reference_p dr)
+pdr_add_data_dimensions (isl_set *subscript_sizes, scop_p scop,
+ data_reference_p dr)
{
tree ref = DR_REF (dr);
- int i, nb_subscripts = DR_NUM_DIMENSIONS (dr);
- for (i = nb_subscripts - 1; i >= 0; i--, ref = TREE_OPERAND (ref,
0))
+ int nb_subscripts = DR_NUM_DIMENSIONS (dr); for (int i =
+ nb_subscripts - 1; i >= 0; i--, ref = TREE_OPERAND (ref, 0))
{
- tree low, high;
-
if (TREE_CODE (ref) != ARRAY_REF)
- break;
+ return subscript_sizes;
- low = array_ref_low_bound (ref);
- high = array_ref_up_bound (ref);
+ tree low = array_ref_low_bound (ref);
+ tree high = array_ref_up_bound (ref);
/* XXX The PPL code dealt separately with
subscript - low >= 0 and high - subscript >= 0 in case one
of @@ -1511,10 +1509,10 @@ pdr_add_data_dimensions (isl_set *extent,
scop_p scop, data_reference_p dr)
isl_aff *aff;
isl_set *univ, *lbs, *ubs;
isl_pw_aff *index;
- isl_space *space;
isl_set *valid;
- isl_pw_aff *lb = extract_affine_int (low, isl_set_get_space
(extent));
- isl_pw_aff *ub = extract_affine_int (high, isl_set_get_space
(extent));
+ isl_space *space = isl_set_get_space (subscript_sizes);
+ isl_pw_aff *lb = extract_affine_int (low, isl_space_copy (space));
+ isl_pw_aff *ub = extract_affine_int (high, isl_space_copy
+(space));
/* high >= 0 */
valid = isl_pw_aff_nonneg_set (isl_pw_aff_copy (ub)); @@ -1522,25
+1520,24 @@ pdr_add_data_dimensions (isl_set *extent, scop_p scop,
data_reference_p dr)
isl_set_dim (valid, isl_dim_set));
scop->context = isl_set_intersect (scop->context, valid);
- space = isl_set_get_space (extent);
aff = isl_aff_zero_on_domain (isl_local_space_from_space (space));
aff = isl_aff_add_coefficient_si (aff, isl_dim_in, i + 1, 1);
univ = isl_set_universe (isl_space_domain (isl_aff_get_space
(aff)));
index = isl_pw_aff_alloc (univ, aff);
- id = isl_set_get_tuple_id (extent);
+ id = isl_set_get_tuple_id (subscript_sizes);
lb = isl_pw_aff_set_tuple_id (lb, isl_dim_in, isl_id_copy (id));
ub = isl_pw_aff_set_tuple_id (ub, isl_dim_in, id);
/* low <= sub_i <= high */
lbs = isl_pw_aff_ge_set (isl_pw_aff_copy (index), lb);
ubs = isl_pw_aff_le_set (index, ub);
- extent = isl_set_intersect (extent, lbs);
- extent = isl_set_intersect (extent, ubs);
+ subscript_sizes = isl_set_intersect (subscript_sizes, lbs);
+ subscript_sizes = isl_set_intersect (subscript_sizes, ubs);
}
}
- return extent;
+ return subscript_sizes;
}
/* Build data accesses for DR in PBB. */ @@ -1550,7 +1547,7 @@
build_poly_dr (data_reference_p dr, poly_bb_p pbb)
{
int dr_base_object_set;
isl_map *acc;
- isl_set *extent;
+ isl_set *subscript_sizes;
scop_p scop = PBB_SCOP (pbb);
{
@@ -1577,9 +1574,10 @@ build_poly_dr (data_reference_p dr, poly_bb_p pbb)
alias_set_num = *(bap->alias_set);
space = isl_space_set_tuple_id (space, isl_dim_set, id);
- extent = isl_set_nat_universe (space);
- extent = isl_set_fix_si (extent, isl_dim_set, 0, alias_set_num);
- extent = pdr_add_data_dimensions (extent, scop, dr);
+ subscript_sizes = isl_set_nat_universe (space);
+ subscript_sizes = isl_set_fix_si (subscript_sizes, isl_dim_set, 0,
+ alias_set_num);
+ subscript_sizes = pdr_add_data_dimensions (subscript_sizes, scop,
+dr);
}
gcc_assert (dr->aux);
@@ -1587,7 +1585,7 @@ build_poly_dr (data_reference_p dr, poly_bb_p
pbb)
new_poly_dr (pbb, dr_base_object_set,
DR_IS_READ (dr) ? PDR_READ : PDR_WRITE,
- dr, DR_NUM_DIMENSIONS (dr), acc, extent);
+ dr, DR_NUM_DIMENSIONS (dr), acc, subscript_sizes);
}
/* Write to FILE the alias graph of data references in DIMACS
format. */ diff --git a/gcc/testsuite/gcc.dg/graphite/pr61929.c
b/gcc/testsuite/gcc.dg/graphite/pr61929.c
new file mode 100644
index 0000000..9999ebf
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/graphite/pr61929.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -ftree-loop-linear -floop-strip-mine" } */
+
+typedef struct m {
+ char *A;
+ char *B;
+} mystruct;
+mystruct arr[52];
+
+void main () {}
+void generateICE (void)
+{
+ int i;
+ for (i=0; i<52; i++)
+ {
+ arr[i].A = "";
+ arr[i].B = 0;
+ }
+}