summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/graphite-scop-detection.c18
-rw-r--r--gcc/sese.c33
-rw-r--r--gcc/tree-scalar-evolution.c6
4 files changed, 21 insertions, 47 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 41075575272..52ffae41945 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,16 @@
2017-10-17 Richard Biener <rguenther@suse.de>
+ * graphite-scop-detection.c
+ (scop_detection::stmt_has_simple_data_refs_p): Always use
+ the full nest as region.
+ (try_generate_gimple_bb): Likewise.
+ * sese.c (scalar_evolution_in_region): Simplify now that
+ SCEV can handle instantiation in regions.
+ * tree-scalar-evolution.c (instantiate_scev_name): Also instantiate
+ in the non-loop part of a function if requested.
+
+2017-10-17 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/82563
* graphite-isl-ast-to-gimple.c (generate_entry_out_of_ssa_copies):
New function.
diff --git a/gcc/graphite-scop-detection.c b/gcc/graphite-scop-detection.c
index ce6ab954527..a8963e1dd81 100644
--- a/gcc/graphite-scop-detection.c
+++ b/gcc/graphite-scop-detection.c
@@ -1005,15 +1005,10 @@ scop_detection::graphite_can_represent_expr (sese_l scop, loop_p loop,
bool
scop_detection::stmt_has_simple_data_refs_p (sese_l scop, gimple *stmt)
{
- edge nest;
+ edge nest = scop.entry;;
loop_p loop = loop_containing_stmt (stmt);
if (!loop_in_sese_p (loop, scop))
- {
- nest = scop.entry;
- loop = NULL;
- }
- else
- nest = loop_preheader_edge (outermost_loop_in_sese (scop, gimple_bb (stmt)));
+ loop = NULL;
auto_vec<data_reference_p> drs;
if (! graphite_find_data_references_in_stmt (nest, loop, stmt, &drs))
@@ -1381,15 +1376,10 @@ try_generate_gimple_bb (scop_p scop, basic_block bb)
vec<scalar_use> reads = vNULL;
sese_l region = scop->scop_info->region;
- edge nest;
+ edge nest = region.entry;
loop_p loop = bb->loop_father;
if (!loop_in_sese_p (loop, region))
- {
- nest = region.entry;
- loop = NULL;
- }
- else
- nest = loop_preheader_edge (outermost_loop_in_sese (region, bb));
+ loop = NULL;
for (gimple_stmt_iterator gsi = gsi_start_bb (bb); !gsi_end_p (gsi);
gsi_next (&gsi))
diff --git a/gcc/sese.c b/gcc/sese.c
index 8aa8015290d..7fcda75a028 100644
--- a/gcc/sese.c
+++ b/gcc/sese.c
@@ -459,41 +459,16 @@ scev_analyzable_p (tree def, sese_l &region)
tree
scalar_evolution_in_region (const sese_l &region, loop_p loop, tree t)
{
- gimple *def;
- struct loop *def_loop;
-
/* SCOP parameters. */
if (TREE_CODE (t) == SSA_NAME
&& !defined_in_sese_p (t, region))
return t;
- if (TREE_CODE (t) != SSA_NAME
- || loop_in_sese_p (loop, region))
- /* FIXME: we would need instantiate SCEV to work on a region, and be more
- flexible wrt. memory loads that may be invariant in the region. */
- return instantiate_scev (region.entry, loop,
- analyze_scalar_evolution (loop, t));
-
- def = SSA_NAME_DEF_STMT (t);
- def_loop = loop_containing_stmt (def);
-
- if (loop_in_sese_p (def_loop, region))
- {
- t = analyze_scalar_evolution (def_loop, t);
- def_loop = superloop_at_depth (def_loop, loop_depth (loop) + 1);
- t = compute_overall_effect_of_inner_loop (def_loop, t);
- return t;
- }
-
- 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;
+ if (!loop_in_sese_p (loop, region))
+ loop = NULL;
- return instantiate_scev (region.entry, loop, t);
+ return instantiate_scev (region.entry, loop,
+ analyze_scalar_evolution (loop, t));
}
/* Return true if BB is empty, contains only DEBUG_INSNs. */
diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c
index b6c1fcef6a1..b47b4ed7720 100644
--- a/gcc/tree-scalar-evolution.c
+++ b/gcc/tree-scalar-evolution.c
@@ -2358,11 +2358,9 @@ instantiate_scev_name (edge instantiate_below,
struct loop *def_loop;
basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (chrec));
- /* A parameter (or loop invariant and we do not want to include
- evolutions in outer loops), nothing to do. */
+ /* A parameter, nothing to do. */
if (!def_bb
- || loop_depth (def_bb->loop_father) == 0
- || ! dominated_by_p (CDI_DOMINATORS, def_bb, instantiate_below->dest))
+ || !dominated_by_p (CDI_DOMINATORS, def_bb, instantiate_below->dest))
return chrec;
/* We cache the value of instantiated variable to avoid exponential