diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 248bf0e8e28..4b89ef3d161 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 * dwarf2out.c (output_call_frame_info): Use diff --git a/gcc/jump.c b/gcc/jump.c index 9748fb23046..18696ec8806 100644 --- a/gcc/jump.c +++ b/gcc/jump.c @@ -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);