]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gcse.c (compute_pre_ppinout): Zero initial ppout for all exit blocks... releases/egcs-1.1
authorRichard Henderson <rth@cygnus.com>
Fri, 14 May 1999 00:33:31 +0000 (17:33 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 14 May 1999 00:33:31 +0000 (17:33 -0700)
        * gcse.c (compute_pre_ppinout): Zero initial ppout for all
        exit blocks, and don't forward propogate into them either.
        * flow.c (add_pred_succ): Don't add duplicate edges.

From-SVN: r26931

gcc/ChangeLog
gcc/flow.c
gcc/gcse.c

index f1be44ecc5be45ecfa4a9f3049404f212d536623..6e8e4d72a1421041df127626bb6d1aa15f64b53c 100644 (file)
@@ -1,3 +1,10 @@
+Fri May 14 00:31:26 1999  Richard Henderson  <rth@cygnus.com>
+
+       * gcse.c (compute_pre_ppinout): Zero initial ppout for all
+       exit blocks, and don't forward propogate into them either.
+
+       * flow.c (add_pred_succ): Don't add duplicate edges.
+
 Sun Mar 14 02:38:07 PST 1999 Jeff Law  (law@cygnus.com)
 
        * egcs-1.1.2 Released.
index 43ea11d8adc0fe000a4123ffb55cd03e1d5e4e68..4250ebce5637f7a58fe50a7f8a99bb1378030e52 100644 (file)
@@ -3282,15 +3282,28 @@ add_pred_succ (pred_bb, succ_bb, s_preds, s_succs, num_preds, num_succs)
      int *num_preds;
      int *num_succs;
 {
+  int_list_ptr tmp;
   if (succ_bb != EXIT_BLOCK)
     {
-      add_int_list_node (&pred_int_list_blocks, &s_preds[succ_bb], pred_bb);
-      num_preds[succ_bb]++;
+      for (tmp = s_preds[succ_bb]; tmp; tmp = tmp->next)
+       if (tmp->val == pred_bb)
+         break;
+      if (tmp == NULL)
+       {
+         add_int_list_node (&pred_int_list_blocks, &s_preds[succ_bb], pred_bb);
+         num_preds[succ_bb]++;
+       }
     }
   if (pred_bb != ENTRY_BLOCK)
     {
-      add_int_list_node (&pred_int_list_blocks, &s_succs[pred_bb], succ_bb);
-      num_succs[pred_bb]++;
+      for (tmp = s_succs[pred_bb]; tmp; tmp = tmp->next)
+       if (tmp->val == succ_bb)
+         break;
+      if (tmp == NULL)
+       {
+         add_int_list_node (&pred_int_list_blocks, &s_succs[pred_bb], succ_bb);
+         num_succs[pred_bb]++;
+       }
     }
 }
 
index f0efdb7a4aca73e4e8d082cfb01b01a4c1e64818..250d0798754a9b2c9e973a01d97a61007328b6a2 100644 (file)
@@ -4146,12 +4146,18 @@ compute_pre_ppinout ()
   int bb, i, changed, size, passes;
 
   sbitmap_vector_ones (pre_ppin, n_basic_blocks);
-  /* ??? Inefficient as we set pre_ppin[0] twice, but simple.  */
   sbitmap_zero (pre_ppin[0]);
 
+  /* Placement Possible out is initially set on all except exit blocks.
+     That is, either blocks whose sole successor is exit, or who have no
+     successors at all, such as would be created by a function that does
+     not return.  */
   sbitmap_vector_ones (pre_ppout, n_basic_blocks);
-  /* ??? Inefficient as we set pre_ppout[n_basic_blocks-1] twice, but simple.  */
-  sbitmap_zero (pre_ppout[n_basic_blocks - 1]);
+  for (bb = 0; bb < n_basic_blocks; bb++)
+    if (s_succs[bb] == NULL
+       || (s_succs[bb]->next == NULL
+           && s_succs[bb]->val == EXIT_BLOCK))
+      sbitmap_zero (pre_ppout[bb]);
 
   size = pre_ppin[0]->size;
   passes = 0;
@@ -4171,8 +4177,9 @@ compute_pre_ppinout ()
          for (i = 0; i < size; i++)
            {
              int_list_ptr pred;
-             SBITMAP_ELT_TYPE tmp = *antin & *pavin & (*antloc | (*transp & *ppout));
-             SBITMAP_ELT_TYPE pred_val = -1L;
+             SBITMAP_ELT_TYPE tmp, pred_val = -1L;
+
+             tmp = *antin & *pavin & (*antloc | (*transp & *ppout));
 
              for (pred = s_preds[bb]; pred != NULL; pred = pred->next)
                {
@@ -4206,13 +4213,18 @@ compute_pre_ppinout ()
            }
        }
 
-      for (bb = 0; bb < n_basic_blocks - 1; bb++)
+      for (bb = 0; bb < n_basic_blocks; bb++)
        {
          sbitmap_ptr ppout = pre_ppout[bb]->elms;
 
-         for (i = 0; i < size; i++)
+         if (s_succs[bb] == NULL
+             || (s_succs[bb]->next == NULL
+                 && s_succs[bb]->val == EXIT_BLOCK))
+           continue;
+
+         for (i = 0; i < size; i++, ppout++)
            {
-             int_list_ptr succ;
+             int_list_ptr succ = s_succs[bb];
              SBITMAP_ELT_TYPE tmp = -1L;
 
              for (succ = s_succs[bb]; succ != NULL; succ = succ->next)
@@ -4229,10 +4241,8 @@ compute_pre_ppinout ()
              if (*ppout != tmp)
                {
                  changed = 1;
-                 *ppout++ = tmp;
+                 *ppout = tmp;
                }
-             else
-               ppout++;
            }
        }