* recog.c (peephole2_optimize): Distribute EH_REGION -1 notes
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Mar 2002 00:30:35 +0000 (00:30 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 26 Mar 2002 00:30:35 +0000 (00:30 +0000)
        anywhere in the block.  Don't refer to insns that have been
        removed from the chain.  Iterate backward through the new insns.
        Don't refer to edges that have been removed.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@51357 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/recog.c

index bab7fdd..e030917 100644 (file)
@@ -1,3 +1,10 @@
+2002-03-25  Richard Henderson  <rth@redhat.com>
+
+       * recog.c (peephole2_optimize): Distribute EH_REGION -1 notes
+       anywhere in the block.  Don't refer to insns that have been
+       removed from the chain.  Iterate backward through the new insns.
+       Don't refer to edges that have been removed.
+
 2002-03-26  Alan Modra  <amodra@bigpond.net.au>
 
        * combine.c (simplify_comparison <ASHIFTRT, LSHIFTRT>): Correct
index 769c267..3289f6e 100644 (file)
@@ -3045,7 +3045,7 @@ peephole2_optimize (dump_file)
          prev = PREV_INSN (insn);
          if (INSN_P (insn))
            {
-             rtx try;
+             rtx try, before_try;
              int match_len;
              rtx note;
 
@@ -3128,14 +3128,16 @@ peephole2_optimize (dump_file)
                  if (i >= MAX_INSNS_PER_PEEP2 + 1)
                    i -= MAX_INSNS_PER_PEEP2 + 1;
 
+                 note = find_reg_note (peep2_insn_data[i].insn, 
+                                       REG_EH_REGION, NULL_RTX);
+
                  /* Replace the old sequence with the new.  */
                  try = emit_insn_after (try, peep2_insn_data[i].insn);
+                 before_try = PREV_INSN (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)))
+                 if (note)
                    {
                      rtx x;
                      edge eh_edge;
@@ -3145,11 +3147,11 @@ peephole2_optimize (dump_file)
                        if (eh_edge->flags & EDGE_EH)
                          break;
 
-                     for (x = NEXT_INSN (peep2_insn_data[i].insn);
-                          x != NEXT_INSN (try); x = NEXT_INSN (x))
+                     for (x = try ; x != before_try ; x = PREV_INSN (x))
                        if (GET_CODE (x) == CALL_INSN
                            || (flag_non_call_exceptions
-                               && may_trap_p (PATTERN (x))))
+                               && may_trap_p (PATTERN (x))
+                               && !find_reg_note (x, REG_EH_REGION, NULL)))
                          {
                            REG_NOTES (x)
                              = gen_rtx_EXPR_LIST (REG_EH_REGION,
@@ -3158,9 +3160,16 @@ peephole2_optimize (dump_file)
 
                            if (x != bb->end && eh_edge)
                              {
-                               edge nfte = split_block (bb, x);
-                               edge nehe = make_edge (nfte->src, eh_edge->dest,
-                                                      eh_edge->flags);
+                               edge nfte, nehe;
+                               int flags;
+
+                               nfte = split_block (bb, x);
+                               flags = EDGE_EH | EDGE_ABNORMAL;
+                               if (GET_CODE (x) == CALL_INSN)
+                                 flags |= EDGE_ABNORMAL_CALL;
+                               nehe = make_edge (nfte->src, eh_edge->dest,
+                                                 flags);
+
                                nehe->probability = eh_edge->probability;
                                nfte->probability
                                  = REG_BR_PROB_BASE - nehe->probability;
@@ -3171,6 +3180,7 @@ peephole2_optimize (dump_file)
                                changed = true;
 #endif
                                bb = nfte->src;
+                               eh_edge = nehe;
                              }
                          }