diff options
Diffstat (limited to 'gcc/tree-data-ref.c')
-rw-r--r-- | gcc/tree-data-ref.c | 56 |
1 files changed, 45 insertions, 11 deletions
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c index 85d0977bce9..af1146c7fef 100644 --- a/gcc/tree-data-ref.c +++ b/gcc/tree-data-ref.c @@ -1224,7 +1224,7 @@ disjoint_objects_p (tree a, tree b) /* Returns false if we can prove that data references A and B do not alias, true otherwise. */ -static bool +bool dr_may_alias_p (const struct data_reference *a, const struct data_reference *b) { const_tree addr_a = DR_BASE_ADDRESS (a); @@ -3303,6 +3303,21 @@ access_functions_are_affine_or_constant_p (const struct data_reference *a, return true; } +/* Return true if we can create an affine data-ref for OP in STMT. */ + +bool +stmt_simple_memref_p (struct loop *loop, gimple stmt, tree op) +{ + data_reference_p dr; + + dr = create_data_ref (loop, op, stmt, true); + if (!access_functions_are_affine_or_constant_p (dr, loop)) + return false; + + free_data_ref (dr); + return true; +} + /* Initializes an equation for an OMEGA problem using the information contained in the ACCESS_FUN. Returns true when the operation succeeded. @@ -4069,9 +4084,9 @@ get_references_in_stmt (gimple stmt, VEC (data_ref_loc, heap) **references) /* 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 that the references should be analyzed. */ + loop of the loop nest in which the references should be analyzed. */ -static bool +bool find_data_references_in_stmt (struct loop *nest, gimple stmt, VEC (data_reference_p, heap) **datarefs) { @@ -4116,7 +4131,7 @@ find_data_references_in_stmt (struct loop *nest, gimple stmt, TODO: This function should be made smarter so that it can handle address arithmetic as if they were array accesses, etc. */ -static tree +tree find_data_references_in_loop (struct loop *loop, VEC (data_reference_p, heap) **datarefs) { @@ -4644,6 +4659,7 @@ create_rdg_edge_for_ddr (struct graph *rdg, ddr_p ddr) e->data = XNEW (struct rdg_edge); RDGE_LEVEL (e) = level; + RDGE_RELATION (e) = ddr; /* Determines the type of the data dependence. */ if (DR_IS_READ (dra) && DR_IS_READ (drb)) @@ -4676,6 +4692,7 @@ create_rdg_edges_for_scalar (struct graph *rdg, tree def, int idef) e = add_edge (rdg, idef, use); e->data = XNEW (struct rdg_edge); RDGE_TYPE (e) = flow_dd; + RDGE_RELATION (e) = NULL; } } @@ -4701,7 +4718,7 @@ create_rdg_edges (struct graph *rdg, VEC (ddr_p, heap) *ddrs) /* Build the vertices of the reduced dependence graph RDG. */ -static void +void create_rdg_vertices (struct graph *rdg, VEC (gimple, heap) *stmts) { int i, j; @@ -4826,6 +4843,21 @@ hash_stmt_vertex_del (void *e) scalar dependence. */ struct graph * +build_empty_rdg (int n_stmts) +{ + int nb_data_refs = 10; + struct graph *rdg = new_graph (n_stmts); + + rdg->indices = htab_create (nb_data_refs, hash_stmt_vertex_info, + eq_stmt_vertex_info, hash_stmt_vertex_del); + return rdg; +} + +/* Build the Reduced Dependence Graph (RDG) with one vertex per + statement of the loop nest, and one edge per data dependence or + scalar dependence. */ + +struct graph * build_rdg (struct loop *loop) { int nb_data_refs = 10; @@ -4842,21 +4874,23 @@ build_rdg (struct loop *loop) &dependence_relations); if (!known_dependences_p (dependence_relations)) - goto end_rdg; + { + free_dependence_relations (dependence_relations); + free_data_refs (datarefs); + VEC_free (gimple, heap, stmts); + + return rdg; + } stmts_from_loop (loop, &stmts); - rdg = new_graph (VEC_length (gimple, stmts)); + rdg = build_empty_rdg (VEC_length (gimple, stmts)); rdg->indices = htab_create (nb_data_refs, hash_stmt_vertex_info, eq_stmt_vertex_info, hash_stmt_vertex_del); create_rdg_vertices (rdg, stmts); create_rdg_edges (rdg, dependence_relations); - end_rdg: - free_dependence_relations (dependence_relations); - free_data_refs (datarefs); VEC_free (gimple, heap, stmts); - return rdg; } |