bb-reorder.c (find_traces_1_round): Fixed condition for small destination block with...
authorJosef Zlomek <zlomekj@suse.cz>
Wed, 19 Feb 2003 18:12:54 +0000 (19:12 +0100)
committerJosef Zlomek <zlomek@gcc.gnu.org>
Wed, 19 Feb 2003 18:12:54 +0000 (18:12 +0000)
* bb-reorder.c (find_traces_1_round): Fixed condition for small
destination block with multiple predecessors.
(connect_traces): Check whether the block is a start of trace.

From-SVN: r63127

gcc/ChangeLog
gcc/bb-reorder.c

index 9585c69c2124e5a359dc68a5a6df3fdff3c31de3..d083a31cf0ce21810bd53dec00e482fd1ed78cf2 100644 (file)
@@ -1,3 +1,9 @@
+2003-02-19  Josef Zlomek  <zlomekj@suse.cz>
+
+       * bb-reorder.c (find_traces_1_round): Fixed condition for small
+       destination block with multiple predecessors.
+       (connect_traces): Check whether the block is a start of trace.
+
 Wed Feb 19 19:00:24 CET 2003  Jan Hubicka  <jh@suse.cz>
 
        * calls.c (expand_call): Update call of INIT_CUMULATIVE_ARGS
index 49889ee2ba3eec07ff36f78276e7b8e5d21241c2..f89900d470b12e2e95b1771b1d8bccc7726c0cc1 100644 (file)
@@ -448,12 +448,6 @@ find_traces_1_round (branch_th, exec_th, count_th, traces, n_traces, round,
                  || prob < branch_th || freq < exec_th || e->count < count_th)
                continue;
 
-             /* If the destination has multiple precessesors, and can be
-                duplicated cheaper than a jump, don't allow it to be added
-                to a trace.  We'll duplicate it when connecting traces.  */
-             if (e->dest->pred->pred_next && copy_bb_p (e->dest, 0))
-               continue;
-
              if (better_edge_p (bb, e, prob, freq, best_prob, best_freq))
                {
                  best_edge = e;
@@ -462,6 +456,13 @@ find_traces_1_round (branch_th, exec_th, count_th, traces, n_traces, round,
                }
            }
 
+         /* If the best destination has multiple precessesors, and can be
+            duplicated cheaper than a jump, don't allow it to be added
+            to a trace.  We'll duplicate it when connecting traces.  */
+         if (best_edge && best_edge->dest->pred->pred_next
+             && copy_bb_p (best_edge->dest, 0))
+           best_edge = NULL;
+
          /* Add all non-selected successors to the heaps.  */
          for (e = bb->succ; e; e = e->succ_next)
            {
@@ -922,15 +923,17 @@ connect_traces (n_traces, traces)
                    edge best2 = NULL;
                    int best2_len = 0;
 
-                   /* If the destination trace is only one block
-                      long, then no need to search the successor
+                   /* If the destination is a start of a trace which is only
+                      one block long, then no need to search the successor
                       blocks of the trace.  Accept it.  */
-                  if (traces[bbd[e->dest->index].start_of_trace].length == 1)
-                    {
-                      best = e;
-                      try_copy = true;
-                      continue;
-                    }
+                   if (bbd[e->dest->index].start_of_trace >= 0
+                       && traces[bbd[e->dest->index].start_of_trace].length
+                          == 1)
+                     {
+                       best = e;
+                       try_copy = true;
+                       continue;
+                     }
 
                    for (e2 = e->dest->succ; e2; e2 = e2->succ_next)
                      {