aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeresa Johnson <tejohnson@google.com>2013-10-18 14:36:53 +0000
committerTeresa Johnson <tejohnson@gcc.gnu.org>2013-10-18 14:36:53 +0000
commitadc7a8127ae13139fc1ea7ea375180f2b3a912ea (patch)
tree1251f3b4d2edb124429726444e94bce59d1e4080
parent4db45577b797e63299dc362106bd4c562c5ea41b (diff)
downloadgcc-adc7a8127ae13139fc1ea7ea375180f2b3a912ea.zip
gcc-adc7a8127ae13139fc1ea7ea375180f2b3a912ea.tar.gz
gcc-adc7a8127ae13139fc1ea7ea375180f2b3a912ea.tar.bz2
tree-ssa-tail-merge.c (replace_block_by): Update edge weights during merging.
2013-10-18 Teresa Johnson <tejohnson@google.com> * tree-ssa-tail-merge.c (replace_block_by): Update edge weights during merging. From-SVN: r203823
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/tree-ssa-tail-merge.c14
2 files changed, 19 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7129891..a677fa4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-18 Teresa Johnson <tejohnson@google.com>
+
+ * tree-ssa-tail-merge.c (replace_block_by): Update edge
+ weights during merging.
+
2013-10-18 Andrew MacLeod <amacleod@redhat.com>
* tree-cfg.h: Rename from tree-flow.h. Remove #includes.
diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
index 4998b7e..9094935 100644
--- a/gcc/tree-ssa-tail-merge.c
+++ b/gcc/tree-ssa-tail-merge.c
@@ -1462,6 +1462,8 @@ static void
replace_block_by (basic_block bb1, basic_block bb2)
{
edge pred_edge;
+ edge e1;
+ edge_iterator ei;
unsigned int i;
gimple bb2_phi;
@@ -1494,6 +1496,18 @@ replace_block_by (basic_block bb1, basic_block bb2)
bb2->count += bb1->count;
+ /* Merge the outgoing edge counts from bb1 onto bb2. */
+ FOR_EACH_EDGE (e1, ei, bb1->succs)
+ {
+ edge e2;
+ e2 = find_edge (bb2, e1->dest);
+ gcc_assert (e2);
+ e2->count += e1->count;
+ /* Recompute the probability from the new merged edge count (bb2->count
+ was updated above). */
+ e2->probability = GCOV_COMPUTE_SCALE (e2->count, bb2->count);
+ }
+
/* Do updates that use bb1, before deleting bb1. */
release_last_vdef (bb1);
same_succ_flush_bb (bb1);