diff options
author | Aditya Kumar <aditya.k7@samsung.com> | 2015-10-21 21:18:27 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2015-10-21 21:18:27 +0000 |
commit | 78fd2726cafeb9e0cf377e5fb2102d09d91779d5 (patch) | |
tree | edc739b54786c480775bcdd4ce45e801f6224ec9 | |
parent | 8b76e7fef8246b7bb6f209b8ce0768d437b7b4a0 (diff) | |
download | gcc-78fd2726cafeb9e0cf377e5fb2102d09d91779d5.zip gcc-78fd2726cafeb9e0cf377e5fb2102d09d91779d5.tar.gz gcc-78fd2726cafeb9e0cf377e5fb2102d09d91779d5.tar.bz2 |
a scalar depending on vdefs in the current region is not invariant
When a scalar is defined in function of an array reference in the current scop,
it does variate. Graphite cannot represent the condition in scop-11.c, as a[*]
variates in the current region, and it is not an affine condition:
for (j = 0; j <= 20; j++)
a[j] = b + i;
if (a[12] == 23)
b = 3;
else
b = 1;
for (j = 0; j <= 20; j++)
a[j] = b + i;
* graphite-scop-detection.c (parameter_index_in_region): Update call to
invariant_in_sese_p_rec.
* graphite-sese-to-poly.c (extract_affine): Same.
* sese.c (invariant_in_sese_p_rec): Pass in an extra parameter has_vdefs.
(scalar_evolution_in_region): Return chrec_dont_know when the scalar variable
depends on virtual definitions in the current region.
* sese.h (invariant_in_sese_p_rec): Update declaration.
testsuite/
* gcc.dg/graphite/scop-11.c: Update pattern.
Co-Authored-By: Sebastian Pop <s.pop@samsung.com>
From-SVN: r229151
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/graphite-scop-detection.c | 2 | ||||
-rw-r--r-- | gcc/graphite-sese-to-poly.c | 2 | ||||
-rw-r--r-- | gcc/sese.c | 22 | ||||
-rw-r--r-- | gcc/sese.h | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/graphite/scop-11.c | 2 |
7 files changed, 36 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2c5af31..c49cd6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,17 @@ 2015-10-21 Aditya Kumar <aditya.k7@samsung.com> Sebastian Pop <s.pop@samsung.com> + * graphite-scop-detection.c (parameter_index_in_region): Update call to + invariant_in_sese_p_rec. + * graphite-sese-to-poly.c (extract_affine): Same. + * sese.c (invariant_in_sese_p_rec): Pass in an extra parameter has_vdefs. + (scalar_evolution_in_region): Return chrec_dont_know when the scalar variable + depends on virtual definitions in the current region. + * sese.h (invariant_in_sese_p_rec): Update declaration. + +2015-10-21 Aditya Kumar <aditya.k7@samsung.com> + Sebastian Pop <s.pop@samsung.com> + * graphite-scop-detection.c (build_scops): Do not handle scops with more than PARAM_GRAPHITE_MAX_ARRAYS_PER_SCOP arrays. * params.def (PARAM_GRAPHITE_MAX_ARRAYS_PER_SCOP): New. diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index 08c7b3ab..a95ec57 100644 --- a/gcc/graphite-scop-detection.c +++ b/gcc/graphite-scop-detection.c @@ -1521,7 +1521,7 @@ parameter_index_in_region (tree name, sese_info_p region) if (TREE_CODE (TREE_TYPE (name)) != INTEGER_TYPE) return -1; - if (!invariant_in_sese_p_rec (name, region->region)) + if (!invariant_in_sese_p_rec (name, region->region, NULL)) return -1; i = parameter_index_in_region_1 (name, region); diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index d1eae90..c06d9de 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -540,7 +540,7 @@ extract_affine (scop_p s, tree e, __isl_take isl_space *space) case SSA_NAME: gcc_assert (-1 != parameter_index_in_region_1 (e, s->scop_info) - || !invariant_in_sese_p_rec (e, s->scop_info->region)); + || !invariant_in_sese_p_rec (e, s->scop_info->region, NULL)); res = extract_affine_name (s, e, space); break; @@ -787,10 +787,11 @@ set_ifsese_condition (ifsese if_region, tree condition) } /* Return true when T is defined outside REGION or when no definitions are - variant in REGION. */ + variant in REGION. When HAS_VDEFS is a valid pointer, sets HAS_VDEFS to true + when T depends on memory that may change in REGION. */ bool -invariant_in_sese_p_rec (tree t, sese_l ®ion) +invariant_in_sese_p_rec (tree t, sese_l ®ion, bool *has_vdefs) { ssa_op_iter iter; use_operand_p use_p; @@ -805,11 +806,15 @@ invariant_in_sese_p_rec (tree t, sese_l ®ion) /* VDEF is variant when it is in the region. */ if (gimple_vdef (stmt)) - return false; + { + if (has_vdefs) + *has_vdefs = true; + return false; + } /* A VUSE may or may not be variant following the VDEFs. */ if (tree vuse = gimple_vuse (stmt)) - return invariant_in_sese_p_rec (vuse, region); + return invariant_in_sese_p_rec (vuse, region, has_vdefs); FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_USE) { @@ -818,7 +823,7 @@ invariant_in_sese_p_rec (tree t, sese_l ®ion) if (!defined_in_sese_p (use, region)) continue; - if (!invariant_in_sese_p_rec (use, region)) + if (!invariant_in_sese_p_rec (use, region, has_vdefs)) return false; } @@ -856,8 +861,13 @@ scalar_evolution_in_region (sese_l ®ion, loop_p loop, tree t) return t; } - if (invariant_in_sese_p_rec (t, region)) + bool has_vdefs = false; + if (invariant_in_sese_p_rec (t, region, &has_vdefs)) return t; + /* T variates in REGION. */ + if (has_vdefs) + return chrec_dont_know; + return instantiate_scev (before, loop, t); } @@ -84,7 +84,7 @@ extern edge copy_bb_and_scalar_dependences (basic_block, sese_info_p, edge, vec<tree> , bool *); extern struct loop *outermost_loop_in_sese (sese_l &, basic_block); extern tree scalar_evolution_in_region (sese_l &, loop_p, tree); -extern bool invariant_in_sese_p_rec (tree, sese_l &); +extern bool invariant_in_sese_p_rec (tree, sese_l &, bool *); /* Check that SESE contains LOOP. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d2a7da6..cda024d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-10-21 Aditya Kumar <aditya.k7@samsung.com> + Sebastian Pop <s.pop@samsung.com> + + * gcc.dg/graphite/scop-11.c: Update pattern. + 2015-10-11 Jan Hubicka <hubicka@ucw.cz> PR ipa/67056 diff --git a/gcc/testsuite/gcc.dg/graphite/scop-11.c b/gcc/testsuite/gcc.dg/graphite/scop-11.c index 801e54f..6362003 100644 --- a/gcc/testsuite/gcc.dg/graphite/scop-11.c +++ b/gcc/testsuite/gcc.dg/graphite/scop-11.c @@ -19,4 +19,4 @@ int toto (int i, int b) return a[b]; } -/* { dg-final { scan-tree-dump-times "number of SCoPs: 1" 1 "graphite"} } */ +/* { dg-final { scan-tree-dump-times "number of SCoPs: 0" 1 "graphite"} } */ |