summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1999-05-13 17:33:31 -0700
committerRichard Henderson <rth@gcc.gnu.org>1999-05-13 17:33:31 -0700
commit39dd4ec5722b0ac7b2eba832f3e036d56b2cd967 (patch)
tree591c583279c587fbb905ab26899a4afe39d666ad
parent05c82e09def8bf9245448504919c247d9fd02968 (diff)
downloadgcc-releases/egcs-1.1.tar.gz
gcse.c (compute_pre_ppinout): Zero initial ppout for all exit blocks...releases/egcs-1.1
* 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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/flow.c21
-rw-r--r--gcc/gcse.c32
3 files changed, 45 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f1be44ecc5b..6e8e4d72a14 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/flow.c b/gcc/flow.c
index 43ea11d8adc..4250ebce563 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -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]++;
+ }
}
}
diff --git a/gcc/gcse.c b/gcc/gcse.c
index f0efdb7a4ac..250d0798754 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -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++;
}
}