jump.c (jump_optimize): Initialize mappings from INSN_UID to EH region if...
authorJeffrey A Law <law@cygnus.com>
Sat, 31 Oct 1998 11:32:02 +0000 (11:32 +0000)
committerJeff Law <law@gcc.gnu.org>
Sat, 31 Oct 1998 11:32:02 +0000 (04:32 -0700)
        * jump.c (jump_optimize): Initialize mappings from INSN_UID to
        EH region if exceptions are enabled and we're performing cross
        jump optimizations.
        (find_cross_jump): Exit loop if the insns are in different EH regions.

From-SVN: r23475

gcc/ChangeLog
gcc/jump.c

index 248bf0e8e28288256a5b7e8687b450a7a0cb4408..4b89ef3d161a87c2cc01f8dc9a044d6bff9d2c82 100644 (file)
@@ -1,3 +1,10 @@
+Sat Oct 31 12:30:02 1998  Jeffrey A Law  (law@cygnus.com)
+
+       * jump.c (jump_optimize): Initialize mappings from INSN_UID to
+       EH region if exceptions are enabled and we're performing cross
+       jump optimizations.
+       (find_cross_jump): Exit loop if the insns are in different EH regions.
+
 Sat Oct 31 10:02:48 1998  Mark Mitchell  <mark@markmitchell.com>
 
        * dwarf2out.c (output_call_frame_info): Use
index 9748fb230467e76b53327920050deca8b81e888d..18696ec8806f208e1f4529569a914bc1b097bf5a 100644 (file)
@@ -182,6 +182,12 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan)
 
   max_uid++;
 
+  /* If we are performing cross jump optimizations, then initialize
+     tables mapping UIDs to EH regions to avoid incorrect movement
+     of insns from one EH region to another.  */
+  if (flag_exceptions && cross_jump)
+    init_insn_eh_region (f, max_uid);
+
   /* Delete insns following barriers, up to next label.  */
 
   for (insn = f; insn;)
@@ -2715,6 +2721,13 @@ find_cross_jump (e1, e2, minimum, f1, f2)
       if (i2 == 0 || GET_CODE (i1) != GET_CODE (i2))
        break;
 
+      /* Avoid moving insns across EH regions if either of the insns
+        can throw.  */
+      if (flag_exceptions
+         && (asynchronous_exceptions || GET_CODE (i1) == CALL_INSN)
+         && !in_same_eh_region (i1, i2))
+       break;
+
       p1 = PATTERN (i1);
       p2 = PATTERN (i2);