This backports the obvious heap leak fixes that have accumulated sofar. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied.
Richard. 2012-08-21 Richard Guenther <rguent...@suse.de> Backport from mainline 2012-08-16 Richard Guenther <rguent...@suse.de> PR middle-end/54146 * tree-ssa-loop-niter.c (find_loop_niter_by_eval): Free the exit vector. * ipa-pure-const.c (analyze_function): Use FOR_EACH_LOOP_BREAK. * cfgloop.h (FOR_EACH_LOOP_BREAK): Fix. * tree-ssa-structalias.c (handle_lhs_call): Properly free rhsc. * tree-ssa-loop-im.c (analyze_memory_references): Adjust. (tree_ssa_lim_finalize): Free all mem_refs. * tree-ssa-sccvn.c (extract_and_process_scc_for_name): Free scc when bailing out. * modulo-sched.c (sms_schedule): Use FOR_EACH_LOOP_BREAK. * ira-build.c (loop_with_complex_edge_p): Free loop exit vector. * graphite-sese-to-poly.c (scop_ivs_can_be_represented): Use FOR_EACH_LOOP_BREAK. 2012-08-17 Richard Guenther <rguent...@suse.de> * tree-sra.c (modify_function): Free redirect_callers vector. * ipa-split.c (split_function): Free args_to_pass vector. * tree-vect-stmts.c (vectorizable_operation): Do not pre-allocate vec_oprnds. (new_stmt_vec_info): Do not pre-allocate STMT_VINFO_SAME_ALIGN_REFS. * tree-vect-slp.c (vect_free_slp_instance): Free the instance. (vect_analyze_slp_instance): Free everything. (destroy_bb_vec_info): Free the SLP instances. 2012-08-17 Richard Guenther <rguent...@suse.de> * params.def (integer-share-limit): Decrease from 256 to 251, add rationale. 2012-08-21 Richard Guenther <rguent...@suse.de> * tree-ssa-loop-im.c (tree_ssa_lim_finalize): Properly free the affine expansion cache. Index: gcc/tree-ssa-loop-niter.c =================================================================== --- gcc/tree-ssa-loop-niter.c (revision 190560) +++ gcc/tree-ssa-loop-niter.c (working copy) @@ -2290,7 +2290,10 @@ find_loop_niter_by_eval (struct loop *lo /* Loops with multiple exits are expensive to handle and less important. */ if (!flag_expensive_optimizations && VEC_length (edge, exits) > 1) - return chrec_dont_know; + { + VEC_free (edge, heap, exits); + return chrec_dont_know; + } FOR_EACH_VEC_ELT (edge, exits, i, ex) { Index: gcc/ipa-pure-const.c =================================================================== --- gcc/ipa-pure-const.c (revision 190560) +++ gcc/ipa-pure-const.c (working copy) @@ -803,7 +803,7 @@ end: if (dump_file) fprintf (dump_file, " can not prove finiteness of loop %i\n", loop->num); l->looping =true; - break; + FOR_EACH_LOOP_BREAK (li); } scev_finalize (); } Index: gcc/ipa-split.c =================================================================== --- gcc/ipa-split.c (revision 190560) +++ gcc/ipa-split.c (working copy) @@ -1239,6 +1239,7 @@ split_function (struct split_point *spli } call = gimple_build_call_vec (node->decl, args_to_pass); gimple_set_block (call, DECL_INITIAL (current_function_decl)); + VEC_free (tree, heap, args_to_pass); /* We avoid address being taken on any variable used by split part, so return slot optimization is always possible. Moreover this is Index: gcc/graphite-sese-to-poly.c =================================================================== --- gcc/graphite-sese-to-poly.c (revision 190560) +++ gcc/graphite-sese-to-poly.c (working copy) @@ -3229,6 +3229,7 @@ scop_ivs_can_be_represented (scop_p scop loop_iterator li; loop_p loop; gimple_stmt_iterator psi; + bool result = true; FOR_EACH_LOOP (li, loop, 0) { @@ -3244,11 +3245,16 @@ scop_ivs_can_be_represented (scop_p scop if (TYPE_UNSIGNED (type) && TYPE_PRECISION (type) >= TYPE_PRECISION (long_long_integer_type_node)) - return false; + { + result = false; + break; + } } + if (!result) + FOR_EACH_LOOP_BREAK (li); } - return true; + return result; } /* Builds the polyhedral representation for a SESE region. */ Index: gcc/cfgloop.h =================================================================== --- gcc/cfgloop.h (revision 190560) +++ gcc/cfgloop.h (working copy) @@ -629,7 +629,7 @@ fel_init (loop_iterator *li, loop_p *loo #define FOR_EACH_LOOP_BREAK(LI) \ { \ - VEC_free (int, heap, (LI)->to_visit); \ + VEC_free (int, heap, (LI).to_visit); \ break; \ } Index: gcc/tree-ssa-structalias.c =================================================================== --- gcc/tree-ssa-structalias.c (revision 190560) +++ gcc/tree-ssa-structalias.c (working copy) @@ -3859,9 +3859,11 @@ handle_lhs_call (gimple stmt, tree lhs, tmpc.offset = 0; tmpc.type = ADDRESSOF; VEC_safe_push (ce_s, heap, rhsc, &tmpc); + process_all_all_constraints (lhsc, rhsc); + VEC_free (ce_s, heap, rhsc); } - - process_all_all_constraints (lhsc, rhsc); + else + process_all_all_constraints (lhsc, rhsc); VEC_free (ce_s, heap, lhsc); } Index: gcc/tree-ssa-loop-im.c =================================================================== --- gcc/tree-ssa-loop-im.c (revision 190560) +++ gcc/tree-ssa-loop-im.c (working copy) @@ -1480,9 +1480,8 @@ free_mem_ref_locs (mem_ref_locs_p accs) /* A function to free the mem_ref object OBJ. */ static void -memref_free (void *obj) +memref_free (struct mem_ref *mem) { - struct mem_ref *const mem = (struct mem_ref *) obj; unsigned i; mem_ref_locs_p accs; @@ -1722,8 +1721,7 @@ analyze_memory_references (void) unsigned i; bitmap empty; - memory_accesses.refs - = htab_create (100, memref_hash, memref_eq, memref_free); + memory_accesses.refs = htab_create (100, memref_hash, memref_eq, NULL); memory_accesses.refs_list = NULL; memory_accesses.refs_in_loop = VEC_alloc (bitmap, heap, number_of_loops ()); @@ -2615,6 +2613,7 @@ tree_ssa_lim_finalize (void) basic_block bb; unsigned i; bitmap b; + mem_ref_p ref; free_aux_for_edges (); @@ -2623,9 +2622,12 @@ tree_ssa_lim_finalize (void) pointer_map_destroy (lim_aux_data_map); - VEC_free (mem_ref_p, heap, memory_accesses.refs_list); htab_delete (memory_accesses.refs); + FOR_EACH_VEC_ELT (mem_ref_p, memory_accesses.refs_list, i, ref) + memref_free (ref); + VEC_free (mem_ref_p, heap, memory_accesses.refs_list); + FOR_EACH_VEC_ELT (bitmap, memory_accesses.refs_in_loop, i, b) BITMAP_FREE (b); VEC_free (bitmap, heap, memory_accesses.refs_in_loop); @@ -2639,7 +2641,7 @@ tree_ssa_lim_finalize (void) VEC_free (bitmap, heap, memory_accesses.all_refs_stored_in_loop); if (memory_accesses.ttae_cache) - pointer_map_destroy (memory_accesses.ttae_cache); + free_affine_expand_cache (&memory_accesses.ttae_cache); } /* Moves invariants from loops. Only "expensive" invariants are moved out -- Index: gcc/tree-ssa-sccvn.c =================================================================== --- gcc/tree-ssa-sccvn.c (revision 190560) +++ gcc/tree-ssa-sccvn.c (working copy) @@ -3590,6 +3590,8 @@ extract_and_process_scc_for_name (tree n fprintf (dump_file, "WARNING: Giving up with SCCVN due to " "SCC size %u exceeding %u\n", VEC_length (tree, scc), (unsigned)PARAM_VALUE (PARAM_SCCVN_MAX_SCC_SIZE)); + + VEC_free (tree, heap, scc); return false; } Index: gcc/modulo-sched.c =================================================================== --- gcc/modulo-sched.c (revision 190560) +++ gcc/modulo-sched.c (working copy) @@ -1416,7 +1416,7 @@ sms_schedule (void) if (dump_file) fprintf (dump_file, "SMS reached max limit... \n"); - break; + FOR_EACH_LOOP_BREAK (li); } if (dump_file) Index: gcc/ira-build.c =================================================================== --- gcc/ira-build.c (revision 190560) +++ gcc/ira-build.c (working copy) @@ -1843,15 +1843,21 @@ loop_with_complex_edge_p (struct loop *l edge_iterator ei; edge e; VEC (edge, heap) *edges; + bool res; FOR_EACH_EDGE (e, ei, loop->header->preds) if (e->flags & EDGE_EH) return true; edges = get_loop_exit_edges (loop); + res = false; FOR_EACH_VEC_ELT (edge, edges, i, e) if (e->flags & EDGE_COMPLEX) - return true; - return false; + { + res = true; + break; + } + VEC_free (edge, heap, edges); + return res; } #endif Index: gcc/tree-sra.c =================================================================== --- gcc/tree-sra.c (revision 190560) +++ gcc/tree-sra.c (working copy) @@ -4777,6 +4777,8 @@ modify_function (struct cgraph_node *nod new_node = cgraph_function_versioning (node, redirect_callers, NULL, NULL, false, NULL, NULL, "isra"); + VEC_free (cgraph_edge_p, heap, redirect_callers); + current_function_decl = new_node->decl; push_cfun (DECL_STRUCT_FUNCTION (new_node->decl)); Index: gcc/tree-vect-stmts.c =================================================================== --- gcc/tree-vect-stmts.c (revision 190560) +++ gcc/tree-vect-stmts.c (working copy) @@ -3507,22 +3507,6 @@ vectorizable_operation (gimple stmt, gim /* Handle def. */ vec_dest = vect_create_destination_var (scalar_dest, vectype); - /* Allocate VECs for vector operands. In case of SLP, vector operands are - created in the previous stages of the recursion, so no allocation is - needed, except for the case of shift with scalar shift argument. In that - case we store the scalar operand in VEC_OPRNDS1 for every vector stmt to - be created to vectorize the SLP group, i.e., SLP_NODE->VEC_STMTS_SIZE. - In case of loop-based vectorization we allocate VECs of size 1. We - allocate VEC_OPRNDS1 only in case of binary operation. */ - if (!slp_node) - { - vec_oprnds0 = VEC_alloc (tree, heap, 1); - if (op_type == binary_op || op_type == ternary_op) - vec_oprnds1 = VEC_alloc (tree, heap, 1); - if (op_type == ternary_op) - vec_oprnds2 = VEC_alloc (tree, heap, 1); - } - /* In case the vectorization factor (VF) is bigger than the number of elements that we can fit in a vectype (nunits), we have to generate more than one vector stmt - i.e - we need to "unroll" the @@ -5695,7 +5679,7 @@ new_stmt_vec_info (gimple stmt, loop_vec else STMT_VINFO_DEF_TYPE (res) = vect_internal_def; - STMT_VINFO_SAME_ALIGN_REFS (res) = VEC_alloc (dr_p, heap, 5); + STMT_VINFO_SAME_ALIGN_REFS (res) = NULL; STMT_VINFO_INSIDE_OF_LOOP_COST (res) = 0; STMT_VINFO_OUTSIDE_OF_LOOP_COST (res) = 0; STMT_SLP_TYPE (res) = loop_vect; Index: gcc/tree-vect-slp.c =================================================================== --- gcc/tree-vect-slp.c (revision 190560) +++ gcc/tree-vect-slp.c (working copy) @@ -95,6 +95,7 @@ vect_free_slp_instance (slp_instance ins vect_free_slp_tree (SLP_INSTANCE_TREE (instance)); VEC_free (int, heap, SLP_INSTANCE_LOAD_PERMUTATION (instance)); VEC_free (slp_tree, heap, SLP_INSTANCE_LOADS (instance)); + free (instance); } @@ -1567,6 +1568,9 @@ vect_analyze_slp_instance (loop_vec_info if (vect_print_dump_info (REPORT_SLP)) fprintf (vect_dump, "Build SLP failed: unrolling required in basic" " block SLP"); + vect_free_slp_tree (node); + VEC_free (int, heap, load_permutation); + VEC_free (slp_tree, heap, loads); return false; } @@ -1823,8 +1827,11 @@ new_bb_vec_info (basic_block bb) static void destroy_bb_vec_info (bb_vec_info bb_vinfo) { + VEC (slp_instance, heap) *slp_instances; + slp_instance instance; basic_block bb; gimple_stmt_iterator si; + unsigned i; if (!bb_vinfo) return; @@ -1844,6 +1851,9 @@ destroy_bb_vec_info (bb_vec_info bb_vinf free_data_refs (BB_VINFO_DATAREFS (bb_vinfo)); free_dependence_relations (BB_VINFO_DDRS (bb_vinfo)); VEC_free (gimple, heap, BB_VINFO_STRIDED_STORES (bb_vinfo)); + slp_instances = BB_VINFO_SLP_INSTANCES (bb_vinfo); + FOR_EACH_VEC_ELT (slp_instance, slp_instances, i, instance) + vect_free_slp_instance (instance); VEC_free (slp_instance, heap, BB_VINFO_SLP_INSTANCES (bb_vinfo)); free (bb_vinfo); bb->aux = NULL; Index: gcc/params.def =================================================================== --- gcc/params.def (revision 190560) +++ gcc/params.def (working copy) @@ -638,11 +638,12 @@ DEFPARAM(PARAM_MAX_LAST_VALUE_RTL, /* INTEGER_CST nodes are shared for values [{-1,0} .. N) for {signed,unsigned} integral types. This determines N. - Experimentation shows 256 to be a good value. */ + Experimentation shows 251 to be a good value that generates the + least amount of garbage for allocating the TREE_VEC storage. */ DEFPARAM (PARAM_INTEGER_SHARE_LIMIT, "integer-share-limit", "The upper bound for sharing integer constants", - 256, 2, 2) + 251, 2, 2) /* Incremental SSA updates for virtual operands may be very slow if there is a large number of mappings to process. In those cases, it