recog.c (peephole2_optimize): Distribute EH_REGION -1 notes anywhere in the block.
authorRichard Henderson <rth@redhat.com>
Tue, 26 Mar 2002 00:30:35 +0000 (16:30 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 26 Mar 2002 00:30:35 +0000 (16:30 -0800)
        * 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.

From-SVN: r51357

gcc/ChangeLog
gcc/recog.c

index bab7fdddbb8544dd528ecf2372603b2d78b9133a..e03091718d83f41e4517df9f8cd97634bd2ef342 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 769c267efedd5c52ea947c502083d5a4ee195309..3289f6ebe105dd53e79cd04d7a851ef2ff8ffdf2 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;
                              }
                          }