basic-block.h (fixup_abnormal_edges): Declare.
authorJan Hubicka <jh@suse.cz>
Thu, 7 Mar 2002 15:38:00 +0000 (16:38 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Thu, 7 Mar 2002 15:38:00 +0000 (15:38 +0000)
* 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

gcc/ChangeLog
gcc/basic-block.h
gcc/gcse.c
gcc/reg-stack.c
gcc/reload1.c

index 2940fceffa308f5abe142d5644cc3a1f5864c4cd..c259bcd1cd9aeafa57288928f3d5908ae2cd464f 100644 (file)
@@ -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.
index e615a5dbd5f69ece53a02f055a0b58cdb2086136..c9fc4b8e706067326b7d7b6a21144b3f6b9b1bc1 100644 (file)
@@ -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 */
 
index 52013c1ddd1b285404793bd20fa518a253ae9b80..d78f82ee89218263b52ad1a5e62a7a0eaa754e58 100644 (file)
@@ -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
index c0915a59b3c30c3ef274c57337fe5a5dc4e63fb8..424b204e6a5d40c7d59872d35517f7702a56ddcd 100644 (file)
@@ -2854,6 +2854,7 @@ convert_regs (file)
        }
     }
 
+  fixup_abnormal_edges ();
   if (inserted)
     commit_edge_insertions ();
 
index a4a9c0cfa91c8c4d26b2a3ed498f66a30a53f365..3b4bb2d0cbdecb72d11b20af1e153968ab5b02f8 100644 (file)
@@ -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 *));
 \f
 /* 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;