aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMichael Matz <matzmich@cs.tu-berlin.de>2000-12-06 18:45:31 +0000
committerRichard Henderson <rth@gcc.gnu.org>2000-12-06 10:45:31 -0800
commitb614171efe3bc88f74a91f3903d97d977b5c3c5c (patch)
tree132c51a832ee578c60a08a99cb44c05490e8842a /gcc
parent8954e858e668197d24695957a64d316253355c25 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/gcse.c28
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.
diff --git a/gcc/gcse.c b/gcc/gcse.c
index 25736df..73f49f3 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -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 */