From 39dd4ec5722b0ac7b2eba832f3e036d56b2cd967 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 13 May 1999 17:33:31 -0700 Subject: gcse.c (compute_pre_ppinout): Zero initial ppout for all exit blocks... * 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 | 7 +++++++ gcc/flow.c | 21 +++++++++++++++++---- gcc/gcse.c | 32 +++++++++++++++++++++----------- 3 files changed, 45 insertions(+), 15 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f1be44e..6e8e4d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Fri May 14 00:31:26 1999 Richard Henderson + + * 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 43ea11d..4250ebc 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 f0efdb7..250d079 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++; } } -- cgit v1.1