diff options
author | Jan Hubicka <jh@suse.cz> | 2005-07-31 00:14:17 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2005-07-30 22:14:17 +0000 |
commit | 0bde02b33905ecfb252b96cbe2ea257f0c0606da (patch) | |
tree | 90c26e80fc63e94c4779d3d07c7d2bf90e51f41c | |
parent | ee25d4cbe310fb88f30e64ed49be405e98cf2300 (diff) | |
download | gcc-0bde02b33905ecfb252b96cbe2ea257f0c0606da.zip gcc-0bde02b33905ecfb252b96cbe2ea257f0c0606da.tar.gz gcc-0bde02b33905ecfb252b96cbe2ea257f0c0606da.tar.bz2 |
tree-outof-ssa.c (coalesce_ssa_name): Use coalesce_cost.
* tree-outof-ssa.c (coalesce_ssa_name): Use coalesce_cost.
(coalesce_vars): Likewise.
* tree-ssa-live.c (coalesce_cost): New.
(build_tree_conflict_graph): Use coalesce_cost.
* tree-ssa-live.h (coalesce_cost): Declare.
From-SVN: r102593
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/tree-outof-ssa.c | 22 | ||||
-rw-r--r-- | gcc/tree-ssa-live.c | 25 | ||||
-rw-r--r-- | gcc/tree-ssa-live.h | 1 |
4 files changed, 51 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 59e5c83..a2c7bdc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2005-07-31 Jan Hubicka <jh@suse.cz> + + * tree-outof-ssa.c (coalesce_ssa_name): Use coalesce_cost. + (coalesce_vars): Likewise. + * tree-ssa-live.c (coalesce_cost): New. + (build_tree_conflict_graph): Use coalesce_cost. + * tree-ssa-live.h (coalesce_cost): Declare. + 2005-07-30 Richard Earnshaw <richard.earnshaw@arm.com> * arm.md (all peepholes for post-increment operations): Delete. diff --git a/gcc/tree-outof-ssa.c b/gcc/tree-outof-ssa.c index 38f583e..b8ceaa8 100644 --- a/gcc/tree-outof-ssa.c +++ b/gcc/tree-outof-ssa.c @@ -729,7 +729,13 @@ coalesce_ssa_name (var_map map, int flags) continue; p2 = var_to_partition (map, PHI_ARG_DEF (phi, x)); if (p2 != NO_PARTITION) - add_coalesce (cl, p, p2, 1); + { + 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))); + } } } } @@ -748,7 +754,10 @@ coalesce_ssa_name (var_map map, int flags) i = x; } else - add_coalesce (cl, i, x, 1); + add_coalesce (cl, i, x, + coalesce_cost (EXIT_BLOCK_PTR->frequency, + maybe_hot_bb_p (EXIT_BLOCK_PTR), + false)); } } @@ -1097,7 +1106,14 @@ coalesce_vars (var_map map, tree_live_info_p liveinfo) if (p2 == (unsigned)NO_PARTITION) continue; if (p != p2) - add_coalesce (cl, p, p2, 1); + { + 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))); + } } } } diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c index 1647292..132af92 100644 --- a/gcc/tree-ssa-live.c +++ b/gcc/tree-ssa-live.c @@ -1145,11 +1145,30 @@ find_partition_pair (coalesce_list_p cl, int p1, int p2, bool create) return node; } +/* Return cost of execution of copy instruction with FREQUENCY + possibly on CRITICAL edge and in HOT basic block. */ +int +coalesce_cost (int frequency, bool hot, bool critical) +{ + /* Base costs on BB frequencies bounded by 1. */ + int cost = frequency; + + if (!cost) + cost = 1; + if (optimize_size || hot) + cost = 1; + /* Inserting copy on critical edge costs more + than inserting it elsewhere. */ + if (critical) + cost *= 2; + return cost; +} /* Add a potential coalesce between P1 and P2 in CL with a cost of VALUE. */ void -add_coalesce (coalesce_list_p cl, int p1, int p2, int value) +add_coalesce (coalesce_list_p cl, int p1, int p2, + int value) { partition_pair_p node; @@ -1383,7 +1402,9 @@ build_tree_conflict_graph (tree_live_info_p liveinfo, tpa_p tpa, if (bit) bitmap_set_bit (live, p2); if (cl) - add_coalesce (cl, p1, p2, 1); + add_coalesce (cl, p1, p2, + coalesce_cost (bb->frequency, + maybe_hot_bb_p (bb), false)); set_if_valid (map, live, rhs); } } diff --git a/gcc/tree-ssa-live.h b/gcc/tree-ssa-live.h index d8711c0..2c41274 100644 --- a/gcc/tree-ssa-live.h +++ b/gcc/tree-ssa-live.h @@ -700,6 +700,7 @@ typedef struct coalesce_list_d extern coalesce_list_p create_coalesce_list (var_map); extern void add_coalesce (coalesce_list_p, int, int, int); +extern int coalesce_cost (int, bool, bool); extern void sort_coalesce_list (coalesce_list_p); extern void dump_coalesce_list (FILE *, coalesce_list_p); extern void delete_coalesce_list (coalesce_list_p); |