This fixes PR58396 and also fixes some memleaks.

Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.

Richard.

2013-09-12  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/58396
        * tree-loop-distribution.c (create_rdg_edges): Free unused DDRs.
        (build_rdg): Take a loop-nest parameter, fix memleaks.
        (distribute_loop): Compute loop-nest here and pass it to build_rdg.

Index: gcc/tree-loop-distribution.c
===================================================================
*** gcc/tree-loop-distribution.c        (revision 202516)
--- gcc/tree-loop-distribution.c        (working copy)
*************** create_rdg_edges (struct graph *rdg, vec
*** 383,388 ****
--- 383,390 ----
    FOR_EACH_VEC_ELT (ddrs, i, ddr)
      if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
        create_rdg_edge_for_ddr (rdg, ddr);
+     else
+       free_dependence_relation (ddr);
  
    for (i = 0; i < rdg->n_vertices; i++)
      FOR_EACH_PHI_OR_STMT_DEF (def_p, RDG_STMT (rdg, i),
*************** free_rdg (struct graph *rdg)
*** 519,568 ****
  }
  
  /* Build the Reduced Dependence Graph (RDG) with one vertex per
!    statement of the loop nest, and one edge per data dependence or
     scalar dependence.  */
  
  static 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;
  }
--- 521,565 ----
  }
  
  /* Build the Reduced Dependence Graph (RDG) with one vertex per
!    statement of the loop nest LOOP_NEST, and one edge per data dependence or
     scalar dependence.  */
  
  static struct graph *
! build_rdg (vec<loop_p> loop_nest)
  {
    struct graph *rdg;
    vec<gimple> stmts;
    vec<data_reference_p> datarefs;
    vec<ddr_p> dependence_relations;
  
!   /* Create the RDG vertices from the stmts of the loop nest.  */
    stmts.create (10);
!   stmts_from_loop (loop_nest[0], &stmts);
    rdg = build_empty_rdg (stmts.length ());
    datarefs.create (10);
!   if (!create_rdg_vertices (rdg, stmts, loop_nest[0], &datarefs))
      {
        stmts.release ();
+       datarefs.release ();
        free_rdg (rdg);
        return NULL;
      }
    stmts.release ();
+ 
+   /* Create the RDG edges from the data dependences in the loop nest.  */
    dependence_relations.create (100);
    if (!compute_all_dependences (datarefs, &dependence_relations, loop_nest,
                                false)
        || !known_dependences_p (dependence_relations))
      {
!       free_dependence_relations (dependence_relations);
        datarefs.release ();
        free_rdg (rdg);
        return NULL;
      }
    create_rdg_edges (rdg, dependence_relations);
    dependence_relations.release ();
+   datarefs.release ();
  
    return rdg;
  }
*************** distribute_loop (struct loop *loop, vec<
*** 1809,1816 ****
    gimple s;
    unsigned i;
    vec<int> vertices;
  
!   rdg = build_rdg (loop);
    if (!rdg)
      {
        if (dump_file && (dump_flags & TDF_DETAILS))
--- 1806,1821 ----
    gimple s;
    unsigned i;
    vec<int> vertices;
+   vec<loop_p> loop_nest;
  
!   loop_nest.create (3);
!   if (!find_loop_nest (loop, &loop_nest))
!     {
!       loop_nest.release ();
!       return 0;
!     }
! 
!   rdg = build_rdg (loop_nest);
    if (!rdg)
      {
        if (dump_file && (dump_flags & TDF_DETAILS))
*************** distribute_loop (struct loop *loop, vec<
*** 1818,1823 ****
--- 1823,1829 ----
                 "FIXME: Loop %d not distributed: failed to build the RDG.\n",
                 loop->num);
  
+       loop_nest.release ();
        return res;
      }
  
*************** distribute_loop (struct loop *loop, vec<
*** 1843,1848 ****
--- 1849,1855 ----
    res = ldist_gen (loop, rdg, vertices);
    vertices.release ();
    free_rdg (rdg);
+   loop_nest.release ();
    return res;
  }
  

Reply via email to