diff options
author | Jan Hubicka <jh@suse.cz> | 2002-03-07 16:38:00 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2002-03-07 15:38:00 +0000 |
commit | 068473ec92aa0bca1066db130b95abef40c6d418 (patch) | |
tree | c7a003366839afcd2db5a7c045eff45c5926c4b0 /gcc | |
parent | a9a437be8dc325ab24c33c3e2ebec3115b3ee53d (diff) | |
download | gcc-068473ec92aa0bca1066db130b95abef40c6d418.zip gcc-068473ec92aa0bca1066db130b95abef40c6d418.tar.gz gcc-068473ec92aa0bca1066db130b95abef40c6d418.tar.bz2 |
basic-block.h (fixup_abnormal_edges): Declare.
* basic-block.h (fixup_abnormal_edges): Declare.
* reload1.c (fixup_abnormal_edges): New function.
* reg-stack.c (convert_regs): Use it.
* gcse.c (insert_insn_end_bb): Handle trapping insns.
* gcse.c (hash_scan_set): Refuse instructions with EH edges.
From-SVN: r50405
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/basic-block.h | 1 | ||||
-rw-r--r-- | gcc/gcse.c | 21 | ||||
-rw-r--r-- | gcc/reg-stack.c | 1 | ||||
-rw-r--r-- | gcc/reload1.c | 4 |
5 files changed, 32 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2940fce..c259bcd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +Thu Mar 7 16:33:54 CET 2002 Jan Hubicka <jh@suse.cz> + + * basic-block.h (fixup_abnormal_edges): Declare. + * reload1.c (fixup_abnormal_edges): New function. + * reg-stack.c (convert_regs): Use it. + + * gcse.c (insert_insn_end_bb): Handle trapping insns. + + * gcse.c (hash_scan_set): Refuse instructions with EH edges. + 2002-03-07 Richard Sandiford <rsandifo@redhat.com> * defaults.h (MODE_HAS_NANS, MODE_HAS_INFINITIES): New. diff --git a/gcc/basic-block.h b/gcc/basic-block.h index e615a5d..c9fc4b8 100644 --- a/gcc/basic-block.h +++ b/gcc/basic-block.h @@ -697,6 +697,7 @@ extern conflict_graph conflict_graph_compute partition)); extern bool mark_dfs_back_edges PARAMS ((void)); extern void update_br_prob_note PARAMS ((basic_block)); +extern void fixup_abnormal_edges PARAMS ((void)); /* In dominance.c */ @@ -2189,6 +2189,10 @@ hash_scan_set (pat, insn, set_p) && regno >= FIRST_PSEUDO_REGISTER /* Don't GCSE something if we can't do a reg/reg copy. */ && can_copy_p [GET_MODE (dest)] + /* GCSE commonly inserts instruction after the insn. We can't + do that easily for EH_REGION notes so disable GCSE on these + for now. */ + && !find_reg_note (insn, REG_EH_REGION, NULL_RTX) /* Is SET_SRC something we want to gcse? */ && want_to_gcse_p (src) /* Don't CSE a nop. */ @@ -4609,13 +4613,23 @@ insert_insn_end_bb (expr, bb, pre) pat = process_insert_insn (expr); /* If the last insn is a jump, insert EXPR in front [taking care to - handle cc0, etc. properly]. */ + handle cc0, etc. properly]. Similary we need to care trapping + instructions in presence of non-call exceptions. */ - if (GET_CODE (insn) == JUMP_INSN) + if (GET_CODE (insn) == JUMP_INSN + || (GET_CODE (insn) == INSN + && (bb->succ->succ_next || (bb->succ->flags & EDGE_ABNORMAL)))) { #ifdef HAVE_cc0 rtx note; #endif + /* It should always be the case that we can put these instructions + anywhere in the basic block with performing PRE optimizations. + Check this. */ + if (GET_CODE (insn) == insn && pre + && !TEST_BIT (antloc[bb->index], expr->bitmap_index) + && !TEST_BIT (transp[bb->index], expr->bitmap_index)) + abort (); /* If this is a jump table, then we can't insert stuff here. Since we know the previous real insn must be the tablejump, we insert @@ -4645,7 +4659,8 @@ insert_insn_end_bb (expr, bb, pre) /* Likewise if the last insn is a call, as will happen in the presence of exception handling. */ - else if (GET_CODE (insn) == CALL_INSN) + else if (GET_CODE (insn) == CALL_INSN + && (bb->succ->succ_next || (bb->succ->flags & EDGE_ABNORMAL))) { /* Keeping in mind SMALL_REGISTER_CLASSES and parameters in registers, we search backward and place the instructions before the first diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c index c0915a5..424b204 100644 --- a/gcc/reg-stack.c +++ b/gcc/reg-stack.c @@ -2854,6 +2854,7 @@ convert_regs (file) } } + fixup_abnormal_edges (); if (inserted) commit_edge_insertions (); diff --git a/gcc/reload1.c b/gcc/reload1.c index a4a9c0c..3b4bb2d 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -459,7 +459,7 @@ static void failed_reload PARAMS ((rtx, int)); static int set_reload_reg PARAMS ((int, int)); static void reload_cse_delete_noop_set PARAMS ((rtx, rtx)); static void reload_cse_simplify PARAMS ((rtx)); -static void fixup_abnormal_edges PARAMS ((void)); +void fixup_abnormal_edges PARAMS ((void)); extern void dump_needs PARAMS ((struct insn_chain *)); /* Initialize the reload pass once per compilation. */ @@ -9465,7 +9465,7 @@ copy_eh_notes (insn, x) proper call and fix the damage. Similar handle instructions throwing exceptions internally. */ -static void +void fixup_abnormal_edges () { int i; |