Commit 5c640e29 by Sebastian Pop Committed by Sebastian Pop

Pass to dr_analyze_indices the analysis loop for subscripts.

2011-01-25  Sebastian Pop  <sebastian.pop@amd.com>

	* graphite-scop-detection.c (stmt_has_simple_data_refs_p): Update
	call to graphite_find_data_references_in_stmt.
	* graphite-sese-to-poly.c (outermost_loop_in_sese_1): New.
	(try_generate_gimple_bb): Call outermost_loop_in_sese_1.  Update
	call to graphite_find_data_references_in_stmt.
	(analyze_drs_in_stmts): Same.
	* tree-data-ref.c (dr_analyze_indices): Pass in parameter the loop
	in which the scalar analysis of indices is performed.
	(create_data_ref): Same.  Update call to dr_analyze_indices.
	(find_data_references_in_stmt): Update call to create_data_ref.
	(graphite_find_data_references_in_stmt): Same.
	* tree-data-ref.h (graphite_find_data_references_in_stmt): Update
	declaration.
	(create_data_ref): Same.
	* tree-ssa-loop-prefetch.c (determine_loop_nest_reuse): Update
	call to create_data_ref.

From-SVN: r169218
parent ac53c069
2011-01-25 Sebastian Pop <sebastian.pop@amd.com>
* graphite-scop-detection.c (stmt_has_simple_data_refs_p): Update
call to graphite_find_data_references_in_stmt.
* graphite-sese-to-poly.c (outermost_loop_in_sese_1): New.
(try_generate_gimple_bb): Call outermost_loop_in_sese_1. Update
call to graphite_find_data_references_in_stmt.
(analyze_drs_in_stmts): Same.
* tree-data-ref.c (dr_analyze_indices): Pass in parameter the loop
in which the scalar analysis of indices is performed.
(create_data_ref): Same. Update call to dr_analyze_indices.
(find_data_references_in_stmt): Update call to create_data_ref.
(graphite_find_data_references_in_stmt): Same.
* tree-data-ref.h (graphite_find_data_references_in_stmt): Update
declaration.
(create_data_ref): Same.
* tree-ssa-loop-prefetch.c (determine_loop_nest_reuse): Update
call to create_data_ref.
2011-01-25 Sebastian Pop <sebastian.pop@amd.com>
* graphite-sese-to-poly.c (build_poly_scop): Move
rewrite_commutative_reductions_out_of_ssa before
find_scop_parameters.
......
2011-01-19 Sebastian Pop <sebastian.pop@amd.com>
* graphite-scop-detection.c (stmt_has_simple_data_refs_p): Update
call to graphite_find_data_references_in_stmt.
* graphite-sese-to-poly.c (outermost_loop_in_sese_1): New.
(try_generate_gimple_bb): Call outermost_loop_in_sese_1. Update
call to graphite_find_data_references_in_stmt.
(analyze_drs_in_stmts): Same.
* tree-data-ref.c (dr_analyze_indices): Pass in parameter the loop
in which the scalar analysis of indices is performed.
(create_data_ref): Same. Update call to dr_analyze_indices.
(find_data_references_in_stmt): Update call to create_data_ref.
(graphite_find_data_references_in_stmt): Same.
* tree-data-ref.h (graphite_find_data_references_in_stmt): Update
declaration.
(create_data_ref): Same.
* tree-ssa-loop-prefetch.c (determine_loop_nest_reuse): Update
call to create_data_ref.
2011-01-19 Sebastian Pop <sebastian.pop@amd.com>
* graphite-sese-to-poly.c (build_poly_scop): Move
rewrite_commutative_reductions_out_of_ssa before
find_scop_parameters.
......
......@@ -263,7 +263,9 @@ stmt_has_simple_data_refs_p (loop_p outermost_loop, gimple stmt)
bool res = true;
VEC (data_reference_p, heap) *drs = VEC_alloc (data_reference_p, heap, 5);
graphite_find_data_references_in_stmt (outermost_loop, stmt, &drs);
graphite_find_data_references_in_stmt (outermost_loop,
loop_containing_stmt (stmt),
stmt, &drs);
FOR_EACH_VEC_ELT (data_reference_p, drs, j, dr)
for (i = 0; i < DR_NUM_DIMENSIONS (dr); i++)
......
......@@ -241,6 +241,32 @@ free_scops (VEC (scop_p, heap) *scops)
VEC_free (scop_p, heap, scops);
}
/* Same as outermost_loop_in_sese, returns the outermost loop
containing BB in REGION, but makes sure that the returned loop
belongs to the REGION, and so this returns the first loop in the
REGION when the loop containing BB does not belong to REGION. */
static loop_p
outermost_loop_in_sese_1 (sese region, basic_block bb)
{
loop_p nest = outermost_loop_in_sese (region, bb);
if (loop_in_sese_p (nest, region))
return nest;
/* When the basic block BB does not belong to a loop in the region,
return the first loop in the region. */
nest = nest->inner;
while (nest)
if (loop_in_sese_p (nest, region))
break;
else
nest = nest->next;
gcc_assert (nest);
return nest;
}
/* Generates a polyhedral black box only if the bb contains interesting
information. */
......@@ -248,14 +274,23 @@ static gimple_bb_p
try_generate_gimple_bb (scop_p scop, basic_block bb)
{
VEC (data_reference_p, heap) *drs = VEC_alloc (data_reference_p, heap, 5);
loop_p nest = outermost_loop_in_sese (SCOP_REGION (scop), bb);
sese region = SCOP_REGION (scop);
loop_p nest = outermost_loop_in_sese_1 (region, bb);
gimple_stmt_iterator gsi;
for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
{
gimple stmt = gsi_stmt (gsi);
if (!is_gimple_debug (stmt))
graphite_find_data_references_in_stmt (nest, stmt, &drs);
loop_p loop;
if (is_gimple_debug (stmt))
continue;
loop = loop_containing_stmt (stmt);
if (!loop_in_sese_p (loop, region))
loop = nest;
graphite_find_data_references_in_stmt (nest, loop, stmt, &drs);
}
return new_gimple_bb (bb, drs);
......@@ -2019,17 +2054,28 @@ analyze_drs_in_stmts (scop_p scop, basic_block bb, VEC (gimple, heap) *stmts)
gimple_bb_p gbb;
gimple stmt;
int i;
sese region = SCOP_REGION (scop);
if (!bb_in_sese_p (bb, SCOP_REGION (scop)))
if (!bb_in_sese_p (bb, region))
return;
nest = outermost_loop_in_sese (SCOP_REGION (scop), bb);
nest = outermost_loop_in_sese_1 (region, bb);
gbb = gbb_from_bb (bb);
FOR_EACH_VEC_ELT (gimple, stmts, i, stmt)
if (!is_gimple_debug (stmt))
graphite_find_data_references_in_stmt (nest, stmt,
{
loop_p loop;
if (is_gimple_debug (stmt))
continue;
loop = loop_containing_stmt (stmt);
if (!loop_in_sese_p (loop, region))
loop = nest;
graphite_find_data_references_in_stmt (nest, loop, stmt,
&GBB_DATA_REFS (gbb));
}
}
/* Insert STMT at the end of the STMTS sequence and then insert the
......
......@@ -820,13 +820,11 @@ dr_analyze_innermost (struct data_reference *dr)
}
/* Determines the base object and the list of indices of memory reference
DR, analyzed in loop nest NEST. */
DR, analyzed in LOOP and instantiated in loop nest NEST. */
static void
dr_analyze_indices (struct data_reference *dr, struct loop *nest)
dr_analyze_indices (struct data_reference *dr, loop_p nest, loop_p loop)
{
gimple stmt = DR_STMT (dr);
struct loop *loop = loop_containing_stmt (stmt);
VEC (tree, heap) *access_fns = NULL;
tree ref = unshare_expr (DR_REF (dr)), aref = ref, op;
tree base, off, access_fn = NULL_TREE;
......@@ -935,11 +933,13 @@ free_data_ref (data_reference_p dr)
/* Analyzes memory reference MEMREF accessed in STMT. The reference
is read if IS_READ is true, write otherwise. Returns the
data_reference description of MEMREF. NEST is the outermost loop of the
loop nest in that the reference should be analyzed. */
data_reference description of MEMREF. NEST is the outermost loop
in which the reference should be instantiated, LOOP is the loop in
which the data reference should be analyzed. */
struct data_reference *
create_data_ref (struct loop *nest, tree memref, gimple stmt, bool is_read)
create_data_ref (loop_p nest, loop_p loop, tree memref, gimple stmt,
bool is_read)
{
struct data_reference *dr;
......@@ -956,7 +956,7 @@ create_data_ref (struct loop *nest, tree memref, gimple stmt, bool is_read)
DR_IS_READ (dr) = is_read;
dr_analyze_innermost (dr);
dr_analyze_indices (dr, nest);
dr_analyze_indices (dr, nest, loop);
dr_analyze_alias (dr);
if (dump_file && (dump_flags & TDF_DETAILS))
......@@ -4079,7 +4079,8 @@ find_data_references_in_stmt (struct loop *nest, gimple stmt,
FOR_EACH_VEC_ELT (data_ref_loc, references, i, ref)
{
dr = create_data_ref (nest, *ref->pos, stmt, ref->is_read);
dr = create_data_ref (nest, loop_containing_stmt (stmt),
*ref->pos, stmt, ref->is_read);
gcc_assert (dr != NULL);
/* FIXME -- data dependence analysis does not work correctly for objects
......@@ -4100,12 +4101,14 @@ find_data_references_in_stmt (struct loop *nest, gimple stmt,
return ret;
}
/* Stores the data references in STMT to DATAREFS. If there is an unanalyzable
reference, returns false, otherwise returns true. NEST is the outermost
loop of the loop nest in which the references should be analyzed. */
/* Stores the data references in STMT to DATAREFS. If there is an
unanalyzable reference, returns false, otherwise returns true.
NEST is the outermost loop of the loop nest in which the references
should be instantiated, LOOP is the loop in which the references
should be analyzed. */
bool
graphite_find_data_references_in_stmt (struct loop *nest, gimple stmt,
graphite_find_data_references_in_stmt (loop_p nest, loop_p loop, gimple stmt,
VEC (data_reference_p, heap) **datarefs)
{
unsigned i;
......@@ -4122,7 +4125,7 @@ graphite_find_data_references_in_stmt (struct loop *nest, gimple stmt,
FOR_EACH_VEC_ELT (data_ref_loc, references, i, ref)
{
dr = create_data_ref (nest, *ref->pos, stmt, ref->is_read);
dr = create_data_ref (nest, loop, *ref->pos, stmt, ref->is_read);
gcc_assert (dr != NULL);
VEC_safe_push (data_reference_p, heap, *datarefs, dr);
}
......
......@@ -407,9 +407,9 @@ extern void free_data_ref (data_reference_p);
extern void free_data_refs (VEC (data_reference_p, heap) *);
extern bool find_data_references_in_stmt (struct loop *, gimple,
VEC (data_reference_p, heap) **);
extern bool graphite_find_data_references_in_stmt (struct loop *, gimple,
extern bool graphite_find_data_references_in_stmt (loop_p, loop_p, gimple,
VEC (data_reference_p, heap) **);
struct data_reference *create_data_ref (struct loop *, tree, gimple, bool);
struct data_reference *create_data_ref (loop_p, loop_p, tree, gimple, bool);
extern bool find_loop_nest (struct loop *, VEC (loop_p, heap) **);
extern void compute_all_dependences (VEC (data_reference_p, heap) *,
VEC (ddr_p, heap) **, VEC (loop_p, heap) *,
......
......@@ -1562,7 +1562,8 @@ determine_loop_nest_reuse (struct loop *loop, struct mem_ref_group *refs,
for (gr = refs; gr; gr = gr->next)
for (ref = gr->refs; ref; ref = ref->next)
{
dr = create_data_ref (nest, ref->mem, ref->stmt, !ref->write_p);
dr = create_data_ref (nest, loop_containing_stmt (ref->stmt),
ref->mem, ref->stmt, !ref->write_p);
if (dr)
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment