From: amacleod Date: Fri, 1 Dec 2006 19:53:29 +0000 (+0000) Subject: * common.opt (ftree-combine-temps): Remove. X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=ad3a58c88bd70c0a24d1d1403dcc2b6cae09a794 * common.opt (ftree-combine-temps): Remove. * tree-outof-ssa.c (SSANORM_COMBINE_TEMPS): Remove. (coalesce_ssa_name): Don't check for combine-temps. (coalesce_vars): Remove. (check_replaceable): Use num_imm_uses. (remove_ssa_form, insert_backedge_copies, rewrite_out_of_ssa): Don't check for combine-temps. (rewrite_out_of_ssa): Never create a ref_count in the var_map. * tree-ssa-copyrename.c (copy_rename_partition_coalesce): Change parms to register_ssa_partition calls. * tree-ssa-live.c (register_ssa_partition): Remove prototype. (init_var_map, delete_var_map): remove refernces to ref_count. (create_ssa_var_map): Never calculate a ref count. (type_var_init): Remove. * tree-ssa-live.h (typedef struct _var_map): Remove ref_count. (SSA_VAR_MAP_REF_COUNT): Delete. (create_ssa_var_map): Change Prototype to have no parameters. (version_ref_count): Delete. (register_ssa_partition): Remove 'is_use' paramater and don't set the ref_count vector. (type_var_num, type_var, type_var_first_partition, type_var_next_partition, type_var_dump, type_var_delete, type_var_remove_partition, type_var_find, type_var_compact, type_var_decompact): Remove. * gcc.dg/max-1.c: Remove reference to -fno-tree-lrs option. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@119409 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7ac05a73f7f..34ac82f96a6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,30 @@ +2006-12-01 Andrew MacLeod + + * common.opt (ftree-combine-temps): Remove. + * tree-outof-ssa.c (SSANORM_COMBINE_TEMPS): Remove. + (coalesce_ssa_name): Don't check for combine-temps. + (coalesce_vars): Remove. + (check_replaceable): Use num_imm_uses. + (remove_ssa_form, insert_backedge_copies, rewrite_out_of_ssa): Don't + check for combine-temps. + (rewrite_out_of_ssa): Never create a ref_count in the var_map. + * tree-ssa-copyrename.c (copy_rename_partition_coalesce): Change parms + to register_ssa_partition calls. + * tree-ssa-live.c (register_ssa_partition): Remove prototype. + (init_var_map, delete_var_map): remove refernces to ref_count. + (create_ssa_var_map): Never calculate a ref count. + (type_var_init): Remove. + * tree-ssa-live.h (typedef struct _var_map): Remove ref_count. + (SSA_VAR_MAP_REF_COUNT): Delete. + (create_ssa_var_map): Change Prototype to have no parameters. + (version_ref_count): Delete. + (register_ssa_partition): Remove 'is_use' paramater and don't set the + ref_count vector. + (type_var_num, type_var, type_var_first_partition, + type_var_next_partition, type_var_dump, type_var_delete, + type_var_remove_partition, type_var_find, type_var_compact, + type_var_decompact): Remove. + 2006-12-01 Bernd Schmidt * config/bfin/bfin.md (pushsi_insn, popsi_insn): Set correct addrtype diff --git a/gcc/common.opt b/gcc/common.opt index 4aaa4d20f18..e73fbac9e91 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -929,10 +929,6 @@ ftree-ch Common Report Var(flag_tree_ch) Enable loop header copying on trees -ftree-combine-temps -Common Report Var(flag_tree_combine_temps) -Coalesce memory temporaries in the SSA->normal pass - ftree-copyrename Common Report Var(flag_tree_copyrename) Replace SSA temporaries with better names in copies diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ce14b6d9460..08b4e0446e5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2006-12-01 Andrew MacLeod + + * gcc.dg/max-1.c: Remove reference to -fno-tree-lrs option. + 2006-12-01 Ryan Mansfield PR c++/29066 diff --git a/gcc/testsuite/gcc.dg/max-1.c b/gcc/testsuite/gcc.dg/max-1.c index 02aaa46c3b5..3eb7800a7f4 100644 --- a/gcc/testsuite/gcc.dg/max-1.c +++ b/gcc/testsuite/gcc.dg/max-1.c @@ -1,7 +1,9 @@ /* PR middle-end/18548 */ /* Test case reduced by Andrew Pinski */ /* { dg-do run } */ -/* { dg-options "-O1 -fno-tree-lrs" } */ +/* { dg-options "-O1 " } */ +/* Option -fno-tree-lrs removed By Andrew MacLeod since it is no longer + supported in the compiler beginning with GCC 4.3. */ /* m32c has varying sized pointers */ /* { dg-skip-if "" { "m32c-*-*" } { "*" } { "-mcpu=m32c" "-mcpu=m32cm" } } */ diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c index 705066a2805..1bd531a1b65 100644 --- a/gcc/tree-outof-ssa.c +++ b/gcc/tree-outof-ssa.c @@ -51,7 +51,6 @@ Boston, MA 02110-1301, USA. */ /* Flags to pass to remove_ssa_form. */ #define SSANORM_PERFORM_TER 0x1 -#define SSANORM_COMBINE_TEMPS 0x2 #define SSANORM_COALESCE_PARTITIONS 0x4 /* Used to hold all the components required to do SSA PHI elimination. @@ -874,11 +873,8 @@ coalesce_ssa_name (var_map map, int flags) SET_BIT (live, x); } - if ((flags & SSANORM_COMBINE_TEMPS) == 0) - { - delete_tree_live_info (liveinfo); - liveinfo = NULL; - } + delete_tree_live_info (liveinfo); + liveinfo = NULL; /* Assign root variable as partition representative for each live on entry partition. */ @@ -1126,121 +1122,6 @@ eliminate_virtual_phis (void) } -/* This routine will coalesce variables in MAP of the same type which do not - interfere with each other. LIVEINFO is the live range info for variables - of interest. This will both reduce the memory footprint of the stack, and - allow us to coalesce together local copies of globals and scalarized - component refs. */ - -static void -coalesce_vars (var_map map, tree_live_info_p liveinfo) -{ - basic_block bb; - type_var_p tv; - tree var; - unsigned x, p, p2; - coalesce_list_p cl; - conflict_graph graph; - - cl = create_coalesce_list (map); - - /* Merge all the live on entry vectors for coalesced partitions. */ - for (x = 0; x < num_var_partitions (map); x++) - { - var = partition_to_var (map, x); - p = var_to_partition (map, var); - if (p != x) - live_merge_and_clear (liveinfo, p, x); - } - - /* When PHI nodes are turned into copies, the result of each PHI node - becomes live on entry to the block. Mark these now. */ - FOR_EACH_BB (bb) - { - tree phi, arg; - unsigned p; - - for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) - { - p = var_to_partition (map, PHI_RESULT (phi)); - - /* Skip virtual PHI nodes. */ - if (p == (unsigned)NO_PARTITION) - continue; - - make_live_on_entry (liveinfo, bb, p); - - /* Each argument is a potential copy operation. Add any arguments - which are not coalesced to the result to the coalesce list. */ - for (x = 0; x < (unsigned)PHI_NUM_ARGS (phi); x++) - { - arg = PHI_ARG_DEF (phi, x); - if (!phi_ssa_name_p (arg)) - continue; - p2 = var_to_partition (map, arg); - if (p2 == (unsigned)NO_PARTITION) - continue; - if (p != p2) - { - edge e = PHI_ARG_EDGE (phi, x); - - add_coalesce (cl, p, p2, - coalesce_cost (EDGE_FREQUENCY (e), - maybe_hot_bb_p (bb), - EDGE_CRITICAL_P (e))); - } - } - } - } - - - /* Re-calculate live on exit info. */ - calculate_live_on_exit (liveinfo); - - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "Live range info for variable memory coalescing.\n"); - dump_live_info (dump_file, liveinfo, LIVEDUMP_ALL); - - fprintf (dump_file, "Coalesce list from phi nodes:\n"); - dump_coalesce_list (dump_file, cl); - } - - - tv = type_var_init (map); - if (dump_file) - type_var_dump (dump_file, tv); - type_var_compact (tv); - if (dump_file) - type_var_dump (dump_file, tv); - - graph = build_tree_conflict_graph (liveinfo, tv, cl); - - type_var_decompact (tv); - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "type var list now looks like:n"); - type_var_dump (dump_file, tv); - - fprintf (dump_file, "Coalesce list after conflict graph build:\n"); - dump_coalesce_list (dump_file, cl); - } - - sort_coalesce_list (cl); - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "Coalesce list after sorting:\n"); - dump_coalesce_list (dump_file, cl); - } - - coalesce_tpa_members (tv, graph, map, cl, - ((dump_flags & TDF_DETAILS) ? dump_file : NULL)); - - type_var_delete (tv); - delete_coalesce_list (cl); -} - - /* Temporary Expression Replacement (TER) Replace SSA version variables during out-of-ssa with their defining @@ -1553,7 +1434,6 @@ check_replaceable (temp_expr_table_p tab, tree stmt) { tree var, def, basevar; int version; - var_map map = tab->map; ssa_op_iter iter; tree call_expr; bitmap def_vars, use_vars; @@ -1566,7 +1446,7 @@ check_replaceable (temp_expr_table_p tab, tree stmt) if (!def) return false; - if (version_ref_count (map, def) != 1) + if (num_imm_uses (def) != 1) return false; /* There must be no V_MAY_DEFS or V_MUST_DEFS. */ @@ -2338,10 +2218,7 @@ remove_ssa_form (var_map map, int flags) /* If we are not combining temps, don't calculate live ranges for variables with only one SSA version. */ - if ((flags & SSANORM_COMBINE_TEMPS) == 0) - compact_var_map (map, VARMAP_NO_SINGLE_DEFS); - else - compact_var_map (map, VARMAP_NORMAL); + compact_var_map (map, VARMAP_NO_SINGLE_DEFS); if (dump_file && (dump_flags & TDF_DETAILS)) dump_var_map (dump_file, map); @@ -2349,8 +2226,7 @@ remove_ssa_form (var_map map, int flags) liveinfo = coalesce_ssa_name (map, flags); /* Make sure even single occurrence variables are in the list now. */ - if ((flags & SSANORM_COMBINE_TEMPS) == 0) - compact_var_map (map, VARMAP_NORMAL); + compact_var_map (map, VARMAP_NORMAL); if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -2374,16 +2250,6 @@ remove_ssa_form (var_map map, int flags) dump_var_map (dump_file, map); } - if ((flags & SSANORM_COMBINE_TEMPS) && liveinfo) - { - coalesce_vars (map, liveinfo); - if (dump_file && (dump_flags & TDF_DETAILS)) - { - fprintf (dump_file, "After variable memory coalescing:\n"); - dump_var_map (dump_file, map); - } - } - if (liveinfo) delete_tree_live_info (liveinfo); @@ -2449,8 +2315,7 @@ insert_backedge_copies (void) need a copy statement. */ if ((e->flags & EDGE_DFS_BACK) && (TREE_CODE (arg) != SSA_NAME - || (!flag_tree_combine_temps - && SSA_NAME_VAR (arg) != result_var))) + || SSA_NAME_VAR (arg) != result_var)) { tree stmt, name, last = NULL; block_stmt_iterator bsi; @@ -2505,7 +2370,6 @@ static unsigned int rewrite_out_of_ssa (void) { var_map map; - int var_flags = 0; int ssa_flags = 0; /* If elimination of a PHI requires inserting a copy on a backedge, @@ -2524,14 +2388,8 @@ rewrite_out_of_ssa (void) if (dump_file && (dump_flags & TDF_DETAILS)) dump_tree_cfg (dump_file, dump_flags & ~TDF_DETAILS); - /* We cannot allow unssa to un-gimplify trees before we instrument them. */ - if (flag_tree_ter && !flag_mudflap) - var_flags = SSA_VAR_MAP_REF_COUNT; - - map = create_ssa_var_map (var_flags); + map = create_ssa_var_map (); - if (flag_tree_combine_temps) - ssa_flags |= SSANORM_COMBINE_TEMPS; if (flag_tree_ter && !flag_mudflap) ssa_flags |= SSANORM_PERFORM_TER; diff --git a/gcc/tree-ssa-copyrename.c b/gcc/tree-ssa-copyrename.c index a0ffefd0a6c..b2921a2b9eb 100644 --- a/gcc/tree-ssa-copyrename.c +++ b/gcc/tree-ssa-copyrename.c @@ -121,8 +121,8 @@ copy_rename_partition_coalesce (var_map map, tree var1, tree var2, FILE *debug) gcc_assert (TREE_CODE (var1) == SSA_NAME); gcc_assert (TREE_CODE (var2) == SSA_NAME); - register_ssa_partition (map, var1, false); - register_ssa_partition (map, var2, true); + register_ssa_partition (map, var1); + register_ssa_partition (map, var2); p1 = partition_find (map->var_partition, SSA_NAME_VERSION (var1)); p2 = partition_find (map->var_partition, SSA_NAME_VERSION (var2)); diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c index e1525c1d003..3d578ac3ce4 100644 --- a/gcc/tree-ssa-live.c +++ b/gcc/tree-ssa-live.c @@ -45,7 +45,6 @@ static tree_live_info_p new_tree_live_info (var_map); static inline void set_if_valid (var_map, bitmap, tree); static inline void add_livein_if_notdef (tree_live_info_p, bitmap, tree, basic_block); -static inline void register_ssa_partition (var_map, tree, bool); static inline void add_conflicts_if_valid (tpa_p, conflict_graph, var_map, bitmap, tree); static partition_pair_p find_partition_pair (coalesce_list_p, int, int, bool); @@ -79,7 +78,6 @@ init_var_map (int size) map->compact_to_partition = NULL; map->num_partitions = size; map->partition_size = size; - map->ref_count = NULL; return map; } @@ -95,8 +93,6 @@ delete_var_map (var_map map) free (map->partition_to_compact); if (map->compact_to_partition) free (map->compact_to_partition); - if (map->ref_count) - free (map->ref_count); free (map); } @@ -402,11 +398,11 @@ remove_unused_locals (void) new partition map is returned. */ var_map -create_ssa_var_map (int flags) +create_ssa_var_map (void) { block_stmt_iterator bsi; basic_block bb; - tree dest, use; + tree var; tree stmt; var_map map; ssa_op_iter iter; @@ -422,13 +418,6 @@ create_ssa_var_map (int flags) used_in_virtual_ops = BITMAP_ALLOC (NULL); #endif - if (flags & SSA_VAR_MAP_REF_COUNT) - { - map->ref_count - = (int *)xmalloc (((num_ssa_names + 1) * sizeof (int))); - memset (map->ref_count, 0, (num_ssa_names + 1) * sizeof (int)); - } - FOR_EACH_BB (bb) { tree phi, arg; @@ -436,12 +425,12 @@ create_ssa_var_map (int flags) for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi)) { int i; - register_ssa_partition (map, PHI_RESULT (phi), false); + register_ssa_partition (map, PHI_RESULT (phi)); for (i = 0; i < PHI_NUM_ARGS (phi); i++) { arg = PHI_ARG_DEF (phi, i); if (TREE_CODE (arg) == SSA_NAME) - register_ssa_partition (map, arg, true); + register_ssa_partition (map, arg); mark_all_vars_used (&PHI_ARG_DEF_TREE (phi, i)); } @@ -452,31 +441,22 @@ create_ssa_var_map (int flags) stmt = bsi_stmt (bsi); /* Register USE and DEF operands in each statement. */ - FOR_EACH_SSA_TREE_OPERAND (use , stmt, iter, SSA_OP_USE) - { - register_ssa_partition (map, use, true); - -#ifdef ENABLE_CHECKING - bitmap_set_bit (used_in_real_ops, DECL_UID (SSA_NAME_VAR (use))); -#endif - } - - FOR_EACH_SSA_TREE_OPERAND (dest, stmt, iter, SSA_OP_DEF) + FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, (SSA_OP_DEF|SSA_OP_USE)) { - register_ssa_partition (map, dest, false); + register_ssa_partition (map, var); #ifdef ENABLE_CHECKING - bitmap_set_bit (used_in_real_ops, DECL_UID (SSA_NAME_VAR (dest))); + bitmap_set_bit (used_in_real_ops, DECL_UID (SSA_NAME_VAR (var))); #endif } #ifdef ENABLE_CHECKING /* Validate that virtual ops don't get used in funny ways. */ - FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, + FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_VIRTUAL_USES | SSA_OP_VMUSTDEF) { bitmap_set_bit (used_in_virtual_ops, - DECL_UID (SSA_NAME_VAR (use))); + DECL_UID (SSA_NAME_VAR (var))); } #endif /* ENABLE_CHECKING */ @@ -1069,73 +1049,6 @@ root_var_init (var_map map) } -/* Initialize a type_var structure which associates all the partitions in MAP - of the same type to the type node's index. Volatiles are ignored. */ - -type_var_p -type_var_init (var_map map) -{ - type_var_p tv; - int x, y, p; - int num_partitions = num_var_partitions (map); - tree t; - sbitmap seen; - - tv = tpa_init (map); - if (!tv) - return NULL; - - seen = sbitmap_alloc (num_partitions); - sbitmap_zero (seen); - - for (x = num_partitions - 1; x >= 0; x--) - { - t = partition_to_var (map, x); - - /* Disallow coalescing of these types of variables. */ - if (!t - || TREE_THIS_VOLATILE (t) - || TREE_CODE (t) == RESULT_DECL - || TREE_CODE (t) == PARM_DECL - || (DECL_P (t) - && (DECL_REGISTER (t) - || !DECL_IGNORED_P (t) - || DECL_RTL_SET_P (t)))) - continue; - - p = var_to_partition (map, t); - - gcc_assert (p != NO_PARTITION); - - /* If partitions have been coalesced, only add the representative - for the partition to the list once. */ - if (TEST_BIT (seen, p)) - continue; - SET_BIT (seen, p); - t = TREE_TYPE (t); - - /* Find the list for this type. */ - for (y = 0; y < tv->num_trees; y++) - if (t == VEC_index (tree, tv->trees, y)) - break; - if (y == tv->num_trees) - { - tv->num_trees++; - VEC_safe_push (tree, heap, tv->trees, t); - VEC_safe_push (int, heap, tv->first_partition, p); - } - else - { - tv->next_partition[p] = VEC_index (int, tv->first_partition, y); - VEC_replace (int, tv->first_partition, y, p); - } - tv->partition_to_tree_map[p] = y; - } - sbitmap_free (seen); - return tv; -} - - /* Hash function for 2 integer coalesce pairs. */ #define COALESCE_HASH_FN(R1, R2) ((R2) * ((R2) - 1) / 2 + (R1)) diff --git a/gcc/tree-ssa-live.h b/gcc/tree-ssa-live.h index 17ada27bda7..625e833770c 100644 --- a/gcc/tree-ssa-live.h +++ b/gcc/tree-ssa-live.h @@ -44,9 +44,6 @@ typedef struct _var_map /* Original partition size. */ unsigned int partition_size; - - /* Reference count, if required. */ - int *ref_count; } *var_map; #define VAR_ANN_PARTITION(ann) (ann->partition) @@ -74,11 +71,9 @@ static inline tree var_to_partition_to_var (var_map, tree); static inline tree partition_to_var (var_map, int); static inline int var_to_partition (var_map, tree); static inline tree version_to_var (var_map, int); -static inline int version_ref_count (var_map, tree); -static inline void register_ssa_partition (var_map, tree, bool); +static inline void register_ssa_partition (var_map, tree); -#define SSA_VAR_MAP_REF_COUNT 0x01 -extern var_map create_ssa_var_map (int); +extern var_map create_ssa_var_map (void); /* Number of partitions in MAP. */ @@ -89,17 +84,6 @@ num_var_partitions (var_map map) } -/* Return the reference count for SSA_VAR's partition in MAP. */ - -static inline int -version_ref_count (var_map map, tree ssa_var) -{ - int version = SSA_NAME_VERSION (ssa_var); - gcc_assert (map->ref_count); - return map->ref_count[version]; -} - - /* Given partition index I from MAP, return the variable which represents that partition. */ @@ -176,7 +160,7 @@ var_to_partition_to_var (var_map map, tree var) later. */ static inline void -register_ssa_partition (var_map map, tree ssa_var, bool is_use) +register_ssa_partition (var_map map, tree ssa_var) { int version; @@ -185,9 +169,6 @@ register_ssa_partition (var_map map, tree ssa_var, bool is_use) #endif version = SSA_NAME_VERSION (ssa_var); - if (is_use && map->ref_count) - map->ref_count[version]++; - if (map->partition_to_var[version] == NULL_TREE) map->partition_to_var[SSA_NAME_VERSION (ssa_var)] = ssa_var; } @@ -551,120 +532,6 @@ root_var_decompact (root_var_p rv) } -/* A TYPE_VAR object is similar to a root_var object, except this associates - partitions with their type rather than their root variable. This is used to - coalesce memory locations based on type. */ - -typedef tpa_p type_var_p; - -static inline tree type_var (type_var_p, int); -static inline int type_var_first_partition (type_var_p, int); -static inline int type_var_next_partition (type_var_p, int); -static inline int type_var_num (type_var_p); -static inline void type_var_dump (FILE *, type_var_p); -static inline void type_var_remove_partition (type_var_p, int, int); -static inline void type_var_delete (type_var_p); -static inline int type_var_find (type_var_p, int); -static inline int type_var_compact (type_var_p); -static inline void type_var_decompact (type_var_p); - -extern type_var_p type_var_init (var_map); - -/* Value returned when there is no partitions associated with a list. */ -#define TYPE_VAR_NONE TPA_NONE - - -/* Return the number of distinct type lists in TV. */ - -static inline int -type_var_num (type_var_p tv) -{ - return tpa_num_trees (tv); -} - - -/* Return the type of list I in TV. */ - -static inline tree -type_var (type_var_p tv, int i) -{ - return tpa_tree (tv, i); -} - - -/* Return the first partition belonging to type list I in TV. */ - -static inline int -type_var_first_partition (type_var_p tv, int i) -{ - return tpa_first_partition (tv, i); -} - - -/* Return the next partition after partition I in a type list within TV. */ - -static inline int -type_var_next_partition (type_var_p tv, int i) -{ - return tpa_next_partition (tv, i); -} - - -/* Send debug info for type_var object TV to file F. */ - -static inline void -type_var_dump (FILE *f, type_var_p tv) -{ - fprintf (f, "\nType Var dump\n"); - tpa_dump (f, tv); - fprintf (f, "\n"); -} - - -/* Delete type_var object TV. */ - -static inline void -type_var_delete (type_var_p tv) -{ - tpa_delete (tv); -} - - -/* Remove partition PARTITION_INDEX from type list TYPE_INDEX in TV. */ - -static inline void -type_var_remove_partition (type_var_p tv, int type_index, int partition_index) -{ - tpa_remove_partition (tv, type_index, partition_index); -} - - -/* Return the type index in TV for the list partition I is in. */ - -static inline int -type_var_find (type_var_p tv, int i) -{ - return tpa_find_tree (tv, i); -} - - -/* Hide single element lists in TV. */ - -static inline int -type_var_compact (type_var_p tv) -{ - return tpa_compact (tv); -} - - -/* Expose single element lists in TV. */ - -static inline void -type_var_decompact (type_var_p tv) -{ - tpa_decompact (tv); -} - /* This set of routines implements a coalesce_list. This is an object which is used to track pairs of partitions which are desirable to coalesce together at some point. Costs are associated with each pair, and when