mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-10 18:20:51 +08:00
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
This commit is contained in:
parent
ac53c0698a
commit
5c640e296a
@ -1,3 +1,22 @@
|
||||
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
|
||||
|
@ -1,3 +1,22 @@
|
||||
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
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user