Hi. There's one more patch that fixes really of lot memory leaks related to loop ivopts. The regression was introduced by r230647.
Patch was tested in the series with the rest and the compiler bootstraps successfully. Ready for trunk? Thanks, Martin
>From 1f06962c8f126de5aa847882dadba4b95fc89bfc Mon Sep 17 00:00:00 2001 From: marxin <mli...@suse.cz> Date: Wed, 25 Nov 2015 13:06:07 +0100 Subject: [PATCH 6/6] Fix newly introduced memory leak in tree-ssa-loop-ivopts.c gcc/ChangeLog: 2015-11-25 Martin Liska <mli...@suse.cz> * hash-traits.h (struct typed_delete_remove): New function. (typed_delete_remove ::remove): Likewise. * tree-ssa-loop-ivopts.c (struct iv_common_cand): Replace auto_vec with vec. (record_common_cand): Replace XNEW with operator new. --- gcc/hash-traits.h | 23 +++++++++++++++++++++++ gcc/tree-ssa-loop-ivopts.c | 6 +++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/gcc/hash-traits.h b/gcc/hash-traits.h index 450354a..3997ede 100644 --- a/gcc/hash-traits.h +++ b/gcc/hash-traits.h @@ -38,6 +38,23 @@ typed_free_remove <Type>::remove (Type *p) free (p); } +/* Helpful type for removing with delete. */ + +template <typename Type> +struct typed_delete_remove +{ + static inline void remove (Type *p); +}; + + +/* Remove with delete. */ + +template <typename Type> +inline void +typed_delete_remove <Type>::remove (Type *p) +{ + delete p; +} /* Helpful type for a no-op remove. */ @@ -260,6 +277,12 @@ struct nofree_ptr_hash : pointer_hash <T>, typed_noop_remove <T *> {}; template <typename T> struct free_ptr_hash : pointer_hash <T>, typed_free_remove <T> {}; +/* Traits for pointer elements that should be freed via delete operand when an + element is deleted. */ + +template <typename T> +struct delete_ptr_hash : pointer_hash <T>, typed_delete_remove <T> {}; + /* Traits for elements that point to gc memory. The pointed-to data must be kept across collections. */ diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 98dc451..d7a0e9e 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -253,13 +253,13 @@ struct iv_common_cand tree base; tree step; /* IV uses from which this common candidate is derived. */ - vec<iv_use *> uses; + auto_vec<iv_use *> uses; hashval_t hash; }; /* Hashtable helpers. */ -struct iv_common_cand_hasher : free_ptr_hash <iv_common_cand> +struct iv_common_cand_hasher : delete_ptr_hash <iv_common_cand> { static inline hashval_t hash (const iv_common_cand *); static inline bool equal (const iv_common_cand *, const iv_common_cand *); @@ -3127,7 +3127,7 @@ record_common_cand (struct ivopts_data *data, tree base, slot = data->iv_common_cand_tab->find_slot (&ent, INSERT); if (*slot == NULL) { - *slot = XNEW (struct iv_common_cand); + *slot = new iv_common_cand (); (*slot)->base = base; (*slot)->step = step; (*slot)->uses.create (8); -- 2.6.3