bb-reorder.c (find_traces_1_round): Force fallthru edge from a call to be best_edge.
authorRichard Henderson <rth@redhat.com>
Tue, 15 Feb 2005 09:26:27 +0000 (01:26 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 15 Feb 2005 09:26:27 +0000 (01:26 -0800)
        * bb-reorder.c (find_traces_1_round): Force fallthru edge from a
        call to be best_edge.

From-SVN: r95062

gcc/ChangeLog
gcc/bb-reorder.c

index dfc44b867150e0fa686c65dab3e30297ec66e2a9..4f92feb7aa07e9ae958dd0f525514ffe3dcdd2df 100644 (file)
@@ -1,3 +1,8 @@
+2005-02-15  Richard Henderson  <rth@redhat.com>
+
+       * bb-reorder.c (find_traces_1_round): Force fallthru edge from a 
+       call to be best_edge.
+
 2005-02-14  Kazu Hirata  <kazu@cs.umass.edu>
 
        * basic-block.h: Adjust the prototype for find_basic_blocks.
index f454ce0a3c37f50ef0e67ab33adbaf19bc138432..d054ffd9201cecbcb68bc9993ad4828a5cbf9dec 100644 (file)
@@ -488,6 +488,7 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
       do
        {
          int prob, freq;
+         bool ends_in_call;
 
          /* The probability and frequency of the best edge.  */
          int best_prob = INT_MIN / 2;
@@ -501,6 +502,8 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
            fprintf (dump_file, "Basic block %d was visited in trace %d\n",
                     bb->index, *n_traces - 1);
 
+          ends_in_call = block_ends_with_call_p (bb);
+
          /* Select the successor that will be placed after BB.  */
          FOR_EACH_EDGE (e, ei, bb->succs)
            {
@@ -520,6 +523,19 @@ find_traces_1_round (int branch_th, int exec_th, gcov_type count_th,
              prob = e->probability;
              freq = EDGE_FREQUENCY (e);
 
+             /* The only sensible preference for a call instruction is the
+                fallthru edge.  Don't bother selecting anything else.  */
+             if (ends_in_call)
+               {
+                 if (e->flags & EDGE_CAN_FALLTHRU)
+                   {
+                     best_edge = e;
+                     best_prob = prob;
+                     best_freq = freq;
+                   }
+                 continue;
+               }
+
              /* Edge that cannot be fallthru or improbable or infrequent
                 successor (i.e. it is unsuitable successor).  */
              if (!(e->flags & EDGE_CAN_FALLTHRU) || (e->flags & EDGE_COMPLEX)