From 78fd2726cafeb9e0cf377e5fb2102d09d91779d5 Mon Sep 17 00:00:00 2001 From: Aditya Kumar Date: Wed, 21 Oct 2015 21:18:27 +0000 Subject: [PATCH] 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 From-SVN: r229151 --- gcc/ChangeLog | 11 +++++++++++ gcc/graphite-scop-detection.c | 2 +- gcc/graphite-sese-to-poly.c | 2 +- gcc/sese.c | 22 ++++++++++++++++------ gcc/sese.h | 2 +- gcc/testsuite/ChangeLog | 5 +++++ 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 2c5af316d9e..c49cd6fd448 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2015-10-21 Aditya Kumar + Sebastian Pop + + * 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 Sebastian Pop diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c index 08c7b3abd83..a95ec576d42 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 d1eae9036ec..c06d9debf55 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; diff --git a/gcc/sese.c b/gcc/sese.c index aa19c6873ed..797dea5f35e 100644 --- a/gcc/sese.c +++ b/gcc/sese.c @@ -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); } diff --git a/gcc/sese.h b/gcc/sese.h index 6b6b904495c..d2ad9bde04b 100644 --- a/gcc/sese.h +++ b/gcc/sese.h @@ -84,7 +84,7 @@ extern edge copy_bb_and_scalar_dependences (basic_block, sese_info_p, edge, vec , 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 d2a7da62e8c..cda024d8b27 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-10-21 Aditya Kumar + Sebastian Pop + + * gcc.dg/graphite/scop-11.c: Update pattern. + 2015-10-11 Jan Hubicka PR ipa/67056 diff --git a/gcc/testsuite/gcc.dg/graphite/scop-11.c b/gcc/testsuite/gcc.dg/graphite/scop-11.c index 801e54f9961..6362003bc30 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"} } */ -- 2.30.2