This cleans up the RDG API and avoids computing data references twice for each loop processed in loop distribution.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2013-09-10 Richard Biener <rguent...@suse.de> * tree-data-ref.h (build_rdg): Drop all parameters but loop. * tree-data-ref.c (create_rdg_vertices): Collect all data references, signal failure to the caller, use data-ref API. (build_rdg): Compute data references only once. Maintain lifetime of data references and data dependences from within RDG. (free_rdg): Free dependence relations. * tree-loop-distribution.c (rdg_flag_uses): Drop weird code inventing extra dependences. (distribute_loop): Update for RDG API changes. Index: gcc/tree-data-ref.c =================================================================== *** gcc/tree-data-ref.c (revision 202382) --- gcc/tree-data-ref.c (working copy) *************** create_rdg_edges (struct graph *rdg, vec *** 5062,5079 **** create_rdg_edges_for_scalar (rdg, DEF_FROM_PTR (def_p), i); } ! /* Build the vertices of the reduced dependence graph RDG. */ ! static void ! create_rdg_vertices (struct graph *rdg, vec<gimple> stmts, loop_p loop) { ! int i, j; gimple stmt; FOR_EACH_VEC_ELT (stmts, i, stmt) { - vec<data_ref_loc, va_stack> references; - data_ref_loc *ref; struct vertex *v = &(rdg->vertices[i]); /* Record statement to vertex mapping. */ --- 5062,5079 ---- create_rdg_edges_for_scalar (rdg, DEF_FROM_PTR (def_p), i); } ! /* Build the vertices of the reduced dependence graph RDG. Return false ! if that failed. */ ! static bool ! create_rdg_vertices (struct graph *rdg, vec<gimple> stmts, loop_p loop, ! vec<data_reference_p> *datarefs) { ! int i; gimple stmt; FOR_EACH_VEC_ELT (stmts, i, stmt) { struct vertex *v = &(rdg->vertices[i]); /* Record statement to vertex mapping. */ *************** create_rdg_vertices (struct graph *rdg, *** 5087,5108 **** if (gimple_code (stmt) == GIMPLE_PHI) continue; ! vec_stack_alloc (data_ref_loc, references, 2); ! get_references_in_stmt (stmt, &references); ! FOR_EACH_VEC_ELT (references, j, ref) { ! data_reference_p dr; ! if (!ref->is_read) ! RDGV_HAS_MEM_WRITE (v) = true; ! else RDGV_HAS_MEM_READS (v) = true; ! dr = create_data_ref (loop, loop_containing_stmt (stmt), ! *ref->pos, stmt, ref->is_read); ! if (dr) ! RDGV_DATAREFS (v).safe_push (dr); } - references.release (); } } /* Initialize STMTS with all the statements of LOOP. When --- 5087,5106 ---- if (gimple_code (stmt) == GIMPLE_PHI) continue; ! unsigned drp = datarefs->length (); ! if (!find_data_references_in_stmt (loop, stmt, datarefs)) ! return false; ! for (unsigned j = drp; j < datarefs->length (); ++j) { ! data_reference_p dr = (*datarefs)[j]; ! if (DR_IS_READ (dr)) RDGV_HAS_MEM_READS (v) = true; ! else ! RDGV_HAS_MEM_WRITE (v) = true; ! RDGV_DATAREFS (v).safe_push (dr); } } + return true; } /* Initialize STMTS with all the statements of LOOP. When *************** build_empty_rdg (int n_stmts) *** 5168,5192 **** scalar dependence. */ struct graph * ! build_rdg (struct loop *loop, ! vec<loop_p> *loop_nest, ! vec<ddr_p> *dependence_relations, ! vec<data_reference_p> *datarefs) ! { ! struct graph *rdg = NULL; ! ! if (compute_data_dependences_for_loop (loop, false, loop_nest, datarefs, ! dependence_relations) ! && known_dependences_p (*dependence_relations)) ! { ! vec<gimple> stmts; ! stmts.create (10); ! stmts_from_loop (loop, &stmts); ! rdg = build_empty_rdg (stmts.length ()); ! create_rdg_vertices (rdg, stmts, loop); ! create_rdg_edges (rdg, *dependence_relations); stmts.release (); } return rdg; } --- 5166,5211 ---- scalar dependence. */ struct graph * ! build_rdg (struct loop *loop) ! { ! struct graph *rdg; ! vec<loop_p> loop_nest; ! vec<gimple> stmts; ! vec<data_reference_p> datarefs; ! vec<ddr_p> dependence_relations; ! ! loop_nest.create (3); ! if (!find_loop_nest (loop, &loop_nest)) ! { ! loop_nest.release (); ! return NULL; ! } ! ! stmts.create (10); ! stmts_from_loop (loop, &stmts); ! rdg = build_empty_rdg (stmts.length ()); ! datarefs.create (10); ! if (!create_rdg_vertices (rdg, stmts, loop, &datarefs)) ! { stmts.release (); + free_rdg (rdg); + return NULL; + } + stmts.release (); + dependence_relations.create (100); + if (!compute_all_dependences (datarefs, &dependence_relations, loop_nest, + false) + || !known_dependences_p (dependence_relations)) + { + loop_nest.release (); + datarefs.release (); + dependence_relations.release (); + free_rdg (rdg); + return NULL; } + loop_nest.release (); + create_rdg_edges (rdg, dependence_relations); + dependence_relations.release (); return rdg; } *************** free_rdg (struct graph *rdg) *** 5204,5214 **** struct graph_edge *e; for (e = v->succ; e; e = e->succ_next) ! free (e->data); ! gimple_set_uid (RDGV_STMT (v), -1); ! free_data_refs (RDGV_DATAREFS (v)); ! free (v->data); } free_graph (rdg); --- 5223,5239 ---- struct graph_edge *e; for (e = v->succ; e; e = e->succ_next) ! { ! free_dependence_relation (RDGE_RELATION (e)); ! free (e->data); ! } ! if (v->data) ! { ! gimple_set_uid (RDGV_STMT (v), -1); ! free_data_refs (RDGV_DATAREFS (v)); ! free (v->data); ! } } free_graph (rdg); Index: gcc/tree-data-ref.h =================================================================== *** gcc/tree-data-ref.h (revision 202382) --- gcc/tree-data-ref.h (working copy) *************** typedef struct rdg_edge *** 585,595 **** #define RDGE_LEVEL(E) ((struct rdg_edge *) ((E)->data))->level #define RDGE_RELATION(E) ((struct rdg_edge *) ((E)->data))->relation ! struct graph *build_rdg (struct loop *, ! vec<loop_p> *, ! vec<ddr_p> *, ! vec<data_reference_p> *); ! struct graph *build_empty_rdg (int); void free_rdg (struct graph *); /* Return the index of the variable VAR in the LOOP_NEST array. */ --- 585,591 ---- #define RDGE_LEVEL(E) ((struct rdg_edge *) ((E)->data))->level #define RDGE_RELATION(E) ((struct rdg_edge *) ((E)->data))->relation ! struct graph *build_rdg (struct loop *); void free_rdg (struct graph *); /* Return the index of the variable VAR in the LOOP_NEST array. */ Index: gcc/tree-loop-distribution.c =================================================================== *** gcc/tree-loop-distribution.c (revision 202382) --- gcc/tree-loop-distribution.c (working copy) *************** static void *** 635,641 **** rdg_flag_uses (struct graph *rdg, int u, partition_t partition, bitmap loops, bitmap processed) { - use_operand_p use_p; struct vertex *x = &(rdg->vertices[u]); gimple stmt = RDGV_STMT (x); struct graph_edge *anti_dep = has_anti_or_output_dependence (x); --- 635,640 ---- *************** rdg_flag_uses (struct graph *rdg, int u, *** 652,677 **** processed); } - if (gimple_code (stmt) != GIMPLE_PHI) - { - if ((use_p = gimple_vuse_op (stmt)) != NULL_USE_OPERAND_P) - { - tree use = USE_FROM_PTR (use_p); - - if (TREE_CODE (use) == SSA_NAME - && !SSA_NAME_IS_DEFAULT_DEF (use)) - { - gimple def_stmt = SSA_NAME_DEF_STMT (use); - int v = rdg_vertex_for_stmt (rdg, def_stmt); - - if (v >= 0 - && !already_processed_vertex_p (processed, v)) - rdg_flag_vertex_and_dependent (rdg, v, partition, loops, - processed); - } - } - } - if (is_gimple_assign (stmt) && has_upstream_mem_writes (u)) { tree op0 = gimple_assign_lhs (stmt); --- 651,656 ---- *************** distribute_loop (struct loop *loop, vec< *** 1438,1452 **** gimple s; unsigned i; vec<int> vertices; - vec<ddr_p> dependence_relations; - vec<data_reference_p> datarefs; - vec<loop_p> loop_nest; - - datarefs.create (10); - dependence_relations.create (100); - loop_nest.create (3); - rdg = build_rdg (loop, &loop_nest, &dependence_relations, &datarefs); if (!rdg) { if (dump_file && (dump_flags & TDF_DETAILS)) --- 1417,1424 ---- gimple s; unsigned i; vec<int> vertices; + rdg = build_rdg (loop); if (!rdg) { if (dump_file && (dump_flags & TDF_DETAILS)) *************** distribute_loop (struct loop *loop, vec< *** 1454,1462 **** "FIXME: Loop %d not distributed: failed to build the RDG.\n", loop->num); - free_dependence_relations (dependence_relations); - free_data_refs (datarefs); - loop_nest.release (); return res; } --- 1426,1431 ---- *************** distribute_loop (struct loop *loop, vec< *** 1482,1490 **** res = ldist_gen (loop, rdg, vertices); vertices.release (); free_rdg (rdg); - free_dependence_relations (dependence_relations); - free_data_refs (datarefs); - loop_nest.release (); return res; } --- 1451,1456 ----