From 18f3f864d38d18ffbdfdbc2e7f3c75b06d101565 Mon Sep 17 00:00:00 2001 From: Jeffrey A Law Date: Sat, 31 Oct 1998 11:32:02 +0000 Subject: [PATCH] jump.c (jump_optimize): Initialize mappings from INSN_UID to EH region if... * 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 | 7 +++++++ gcc/jump.c | 13 +++++++++++++ 2 files changed, 20 insertions(+) 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); -- 2.30.2