]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/58396 (heap-use-after-free at gcc/tree-loop-distribution...
authorRichard Biener <rguenther@suse.de>
Thu, 12 Sep 2013 11:18:46 +0000 (11:18 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 12 Sep 2013 11:18:46 +0000 (11:18 +0000)
2013-09-12  Richard Biener  <rguenther@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.

From-SVN: r202521

gcc/ChangeLog
gcc/tree-loop-distribution.c

index f27a648c837fd7ee54f2545561fed35b6a95305a..2e5d31aa32427b91722334fb15fa308971057db7 100644 (file)
@@ -1,3 +1,10 @@
+2013-09-12  Richard Biener  <rguenther@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.
+
 2013-09-12  Yuri Rumyantsev  <ysrumyan@gmail.com>
 
        * config/i386/x86-tune.def: Turn on X86_TUNE_AVOID_MEM_OPND_FOR_CMOVE
index 43c3d911784383c5473afc2ec2061772ba596dd4..a404e00c2944db4d76cbc8b1e62397f8e8d6940c 100644 (file)
@@ -383,6 +383,8 @@ create_rdg_edges (struct graph *rdg, vec<ddr_p> ddrs)
   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),
@@ -519,50 +521,45 @@ free_rdg (struct graph *rdg)
 }
 
 /* Build the Reduced Dependence Graph (RDG) with one vertex per
-   statement of the loop nest, and one edge per data dependence or
+   statement of the loop nest LOOP_NEST, and one edge per data dependence or
    scalar dependence.  */
 
 static struct graph *
-build_rdg (struct loop *loop)
+build_rdg (vec<loop_p> loop_nest)
 {
   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;
-    }
-
+  /* Create the RDG vertices from the stmts of the loop nest.  */
   stmts.create (10);
-  stmts_from_loop (loop, &stmts);
+  stmts_from_loop (loop_nest[0], &stmts);
   rdg = build_empty_rdg (stmts.length ());
   datarefs.create (10);
-  if (!create_rdg_vertices (rdg, stmts, loop, &datarefs))
+  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))
     {
-      loop_nest.release ();
+      free_dependence_relations (dependence_relations);
       datarefs.release ();
-      dependence_relations.release ();
       free_rdg (rdg);
       return NULL;
     }
-  loop_nest.release ();
   create_rdg_edges (rdg, dependence_relations);
   dependence_relations.release ();
+  datarefs.release ();
 
   return rdg;
 }
@@ -1809,8 +1806,16 @@ distribute_loop (struct loop *loop, vec<gimple> stmts)
   gimple s;
   unsigned i;
   vec<int> vertices;
+  vec<loop_p> loop_nest;
 
-  rdg = build_rdg (loop);
+  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))
@@ -1818,6 +1823,7 @@ distribute_loop (struct loop *loop, vec<gimple> stmts)
                 "FIXME: Loop %d not distributed: failed to build the RDG.\n",
                 loop->num);
 
+      loop_nest.release ();
       return res;
     }
 
@@ -1843,6 +1849,7 @@ distribute_loop (struct loop *loop, vec<gimple> stmts)
   res = ldist_gen (loop, rdg, vertices);
   vertices.release ();
   free_rdg (rdg);
+  loop_nest.release ();
   return res;
 }