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 ----

Reply via email to