diff options
author | Michael Matz <matzmich@cs.tu-berlin.de> | 2000-12-06 18:45:31 +0000 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2000-12-06 10:45:31 -0800 |
commit | b614171efe3bc88f74a91f3903d97d977b5c3c5c (patch) | |
tree | 132c51a832ee578c60a08a99cb44c05490e8842a /gcc | |
parent | 8954e858e668197d24695957a64d316253355c25 (diff) | |
download | gcc-b614171efe3bc88f74a91f3903d97d977b5c3c5c.zip gcc-b614171efe3bc88f74a91f3903d97d977b5c3c5c.tar.gz gcc-b614171efe3bc88f74a91f3903d97d977b5c3c5c.tar.bz2 |
gcse.c (compute_pre_data): Kill trapping expressions in destination blocks of abnormal edges.
* gcse.c (compute_pre_data): Kill trapping expressions in
destination blocks of abnormal edges.
From-SVN: r38068
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/gcse.c | 28 |
2 files changed, 33 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 69b5ecc..3ea0e3b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-12-06 Michael Matz <matzmich@cs.tu-berlin.de> + + * gcse.c (compute_pre_data): Kill trapping expressions in + destination blocks of abnormal edges. + 2000-12-05 Richard Sandiford <r.sandiford@redhat.com> * config/mn10300/mn10300.c (mn10300_print_reg_list): Added. @@ -4157,11 +4157,24 @@ free_pre_mem () static void compute_pre_data () { + sbitmap trapping_expr; int i; + unsigned int ui; compute_local_properties (transp, comp, antloc, 0); sbitmap_vector_zero (ae_kill, n_basic_blocks); + /* Collect expressions which might trap. */ + trapping_expr = sbitmap_alloc (n_exprs); + sbitmap_zero (trapping_expr); + for (ui = 0; ui < expr_hash_table_size; ui++) + { + struct expr *e; + for (e = expr_hash_table[ui]; e != NULL; e = e->next_same_hash) + if (may_trap_p (e->expr)) + SET_BIT (trapping_expr, e->bitmap_index); + } + /* Compute ae_kill for each basic block using: ~(TRANSP | COMP) @@ -4170,6 +4183,20 @@ compute_pre_data () for (i = 0; i < n_basic_blocks; i++) { + edge e; + + /* If the current block is the destination of an abnormal edge, we + kill all trapping expressions because we won't be able to properly + place the instruction on the edge. So make them neither + anticipatable nor transparent. This is fairly conservative. */ + for (e = BASIC_BLOCK (i)->pred; e ; e = e->pred_next) + if (e->flags & EDGE_ABNORMAL) + { + sbitmap_difference (antloc[i], antloc[i], trapping_expr); + sbitmap_difference (transp[i], transp[i], trapping_expr); + break; + } + sbitmap_a_or_b (ae_kill[i], transp[i], comp[i]); sbitmap_not (ae_kill[i], ae_kill[i]); } @@ -4180,6 +4207,7 @@ compute_pre_data () antloc = NULL; free (ae_kill); ae_kill = NULL; + free (trapping_expr); } /* PRE utilities */ |