* recog.c (peephole2_optimize): Re-distribute EH edges.
authorJan Hubicka <jh@suse.cz>
Fri, 8 Mar 2002 20:14:04 +0000 (21:14 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 8 Mar 2002 20:14:04 +0000 (20:14 +0000)
From-SVN: r50452

gcc/ChangeLog
gcc/recog.c

index 0e63f6667e77f9f166448ff1c5695249d5f83a51..be3f2b74c8fa1ed7b5dcc9e5f728215f633c1552 100644 (file)
@@ -1,3 +1,7 @@
+Fri Mar  8 21:08:52 CET 2002  Jan Hubicka  <jh@suse.cz>
+
+       * recog.c (peephole2_optimize): Re-distribute EH edges.
+
 2002-03-08  Neil Booth  <neil@daikokuya.demon.co.uk>
 
        * expr.c (expand_expr): Use unsave lang hook.
index 968f1e51d08085b1f4bc6015aa8108482f6e96b3..9eb953878af6ce7c982dafa5a572ff143a0c36fd 100644 (file)
@@ -3054,6 +3054,7 @@ peephole2_optimize (dump_file)
            {
              rtx try;
              int match_len;
+             rtx note;
 
              /* Record this insn.  */
              if (--peep2_current < 0)
@@ -3105,7 +3106,6 @@ peephole2_optimize (dump_file)
                           note = XEXP (note, 1))
                        switch (REG_NOTE_KIND (note))
                          {
-                         case REG_EH_REGION:
                          case REG_NORETURN:
                          case REG_SETJMP:
                          case REG_ALWAYS_RETURN:
@@ -3139,6 +3139,27 @@ peephole2_optimize (dump_file)
                  try = emit_insn_after (try, peep2_insn_data[i].insn);
                  delete_insn_chain (insn, peep2_insn_data[i].insn);
 
+                 /* Re-insert the EH_REGION notes.  */
+                 if (try == bb->end
+                     && (note = find_reg_note (peep2_insn_data[i].insn, 
+                                               REG_EH_REGION, NULL_RTX)))
+                   {
+                     rtx x;
+                     for (x = NEXT_INSN (peep2_insn_data[i].insn);
+                          x != NEXT_INSN (try); x = NEXT_INSN (x))
+                       if (GET_CODE (x) == CALL_INSN
+                           || (flag_non_call_exceptions
+                               && may_trap_p (PATTERN (x))))
+                         REG_NOTES (x)
+                           = gen_rtx_EXPR_LIST (REG_EH_REGION,
+                                                XEXP (note, 0),
+                                                REG_NOTES (x));
+                   }
+                 /* Converting possibly trapping insn to non-trapping is
+                    possible.  Zap dummy outgoing edges.  */
+                 if (try == bb->end)
+                   purge_dead_edges (bb);
+
 #ifdef HAVE_conditional_execution
                  /* With conditional execution, we cannot back up the
                     live information so easily, since the conditional