On Fri, 1 Mar 2013, Jakub Jelinek wrote:

> Hi!
> 
> This fixes leaks like
> ==31176== 176 bytes in 2 blocks are definitely lost in loss record 432 of 541
> ==31176==    at 0x4A0881C: malloc (vg_replace_malloc.c:270)
> ==31176==    by 0x114DF6F: xrealloc (xmalloc.c:177)
> ==31176==    by 0x85E0AA: void 
> va_heap::reserve<gimple_statement_d*>(vec<gimple_statement_d*, va_heap, 
> vl_embed>*&, unsigned int, bool) (vec.h:300)
> ==31176==    by 0x85DE23: vec<gimple_statement_d*, va_heap, 
> vl_ptr>::reserve(unsigned int, bool) (vec.h:1468)
> ==31176==    by 0xA7961C: vec<gimple_statement_d*, va_heap, 
> vl_ptr>::reserve_exact(unsigned int) (vec.h:1482)
> ==31176==    by 0xA79402: vec<gimple_statement_d*, va_heap, 
> vl_ptr>::create(unsigned int) (vec.h:1497)
> ==31176==    by 0xC7189C: new_loop_vec_info(loop*) (tree-vect-loop.c:871)
> ==31176==    by 0xC725EB: vect_analyze_loop_form(loop*) 
> (tree-vect-loop.c:1251)
> ==31176==    by 0xC71DEE: vect_analyze_loop_1(loop*) (tree-vect-loop.c:1000)
> ==31176==    by 0xC71F6D: vect_analyze_loop_form(loop*) 
> (tree-vect-loop.c:1098)
> ==31176==    by 0xC73815: vect_analyze_loop(loop*) (tree-vect-loop.c:1764)
> ==31176==    by 0xC8F9EA: vectorize_loops() (tree-vectorizer.c:113)
> and various others, when vect_analyze_loop_form calls destroy_loop_vec_info
> with false as second argument, we leak various fields.  My understanding
> is that back when clean_stmts argument has been added, the if (!clean_stmts)
> switch got a copy of all the cleanups the other code path did, except for the 
> loop
> actually freeing stmt_vec_info, but already shortly after it new fields
> have been added and cleanup for those has been added to just one spot instead
> of two.
> 
> The patch fixes it by doing all the cleanups for !clean_stmts too in the
> same code path, except for the stmt_vec_info freeing.  With -O3 -mavx
> I didn't see any code differences on all of gcc.dg/vect/*.c.
> 
> Also, passing false to the second to last call to destroy_loop_vec_info
> where we return NULL looks like a typo to my eyes, so I've changed that too.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2013-03-01  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR middle-end/56461
>       * tree-vect-loop.c (destroy_loop_vec_info): For !clean_stmts, just
>       set nbbs to 0 instead of having separate code path.
>       (vect_analyze_loop_form): Call destroy_loop_vec_info with true
>       instead of false as last argument if returning NULL.
> 
> --- gcc/tree-vect-loop.c.jj   2013-02-27 22:40:24.000000000 +0100
> +++ gcc/tree-vect-loop.c      2013-03-01 11:27:53.205162019 +0100
> @@ -905,23 +905,9 @@ destroy_loop_vec_info (loop_vec_info loo
>    loop = LOOP_VINFO_LOOP (loop_vinfo);
>  
>    bbs = LOOP_VINFO_BBS (loop_vinfo);
> -  nbbs = loop->num_nodes;
> +  nbbs = clean_stmts ? loop->num_nodes : 0;
>    swapped = LOOP_VINFO_OPERANDS_SWAPPED (loop_vinfo);
>  
> -  if (!clean_stmts)
> -    {
> -      free (LOOP_VINFO_BBS (loop_vinfo));
> -      free_data_refs (LOOP_VINFO_DATAREFS (loop_vinfo));
> -      free_dependence_relations (LOOP_VINFO_DDRS (loop_vinfo));
> -      LOOP_VINFO_LOOP_NEST (loop_vinfo).release ();
> -      LOOP_VINFO_MAY_MISALIGN_STMTS (loop_vinfo).release ();
> -      LOOP_VINFO_MAY_ALIAS_DDRS (loop_vinfo).release ();
> -
> -      free (loop_vinfo);
> -      loop->aux = NULL;
> -      return;
> -    }
> -
>    for (j = 0; j < nbbs; j++)
>      {
>        basic_block bb = bbs[j];
> @@ -1244,7 +1230,7 @@ vect_analyze_loop_form (struct loop *loo
>       dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
>                        "not vectorized: number of iterations = 0.");
>        if (inner_loop_vinfo)
> -        destroy_loop_vec_info (inner_loop_vinfo, false);
> +        destroy_loop_vec_info (inner_loop_vinfo, true);
>        return NULL;
>      }
>  
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imend

Reply via email to