aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-09-19 11:27:49 -0700
committerRichard Henderson <rth@gcc.gnu.org>2001-09-19 11:27:49 -0700
commit216183ce28d62a3897632d1077ff039a714ad280 (patch)
tree5e0436718b5f6ede8ae870058e44c21f125230f9 /gcc
parentf068df3fe6fe7c87e74a999dca926594aae2c84b (diff)
downloadgcc-216183ce28d62a3897632d1077ff039a714ad280.zip
gcc-216183ce28d62a3897632d1077ff039a714ad280.tar.gz
gcc-216183ce28d62a3897632d1077ff039a714ad280.tar.bz2
emit-rtl.c (try_split): Copy NORETURN, SETJMP, ALWAYS_RETURN and NON_LOCAL_GOTO notes.
* emit-rtl.c (try_split): Copy NORETURN, SETJMP, ALWAYS_RETURN and NON_LOCAL_GOTO notes. From-SVN: r45691
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/emit-rtl.c63
2 files changed, 53 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1ce0936..7dd1da4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -2,6 +2,9 @@
* cfgbuild.c (find_sub_basic_blocks): Handle insns that can throw.
+ * emit-rtl.c (try_split): Copy NORETURN, SETJMP, ALWAYS_RETURN
+ and NON_LOCAL_GOTO notes.
+
2001-09-18 Catherine Moore <clm@redhat.com>
* config/stormy16/stormy16.h (DEFAULT_PCC_STRUCT_RETURN):
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 82bff92..4c48797 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -2513,7 +2513,6 @@ try_split (pat, trial, last)
if (GET_CODE (seq) == SEQUENCE)
{
int i, njumps = 0;
- rtx eh_note;
/* Avoid infinite loop if any insn of the result matches
the original pattern. */
@@ -2546,6 +2545,7 @@ try_split (pat, trial, last)
REG_NOTES (insn));
}
}
+
/* If we are splitting a CALL_INSN, look for the CALL_INSN
in SEQ and copy our CALL_INSN_FUNCTION_USAGE to it. */
if (GET_CODE (trial) == CALL_INSN)
@@ -2554,18 +2554,55 @@ try_split (pat, trial, last)
CALL_INSN_FUNCTION_USAGE (XVECEXP (seq, 0, i))
= CALL_INSN_FUNCTION_USAGE (trial);
- /* Copy EH notes. */
- if ((eh_note = find_reg_note (trial, REG_EH_REGION, NULL_RTX)))
- for (i = 0; i < XVECLEN (seq, 0); i++)
- {
- rtx insn = XVECEXP (seq, 0, i);
- if (GET_CODE (insn) == CALL_INSN
- || (flag_non_call_exceptions
- && may_trap_p (PATTERN (insn))))
- REG_NOTES (insn)
- = gen_rtx_EXPR_LIST (REG_EH_REGION, XEXP (eh_note, 0),
- REG_NOTES (insn));
- }
+ /* Copy notes, particularly those related to the CFG. */
+ for (note = REG_NOTES (trial); note ; note = XEXP (note, 1))
+ {
+ switch (REG_NOTE_KIND (note))
+ {
+ case REG_EH_REGION:
+ for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
+ {
+ rtx insn = XVECEXP (seq, 0, i);
+ if (GET_CODE (insn) == CALL_INSN
+ || (flag_non_call_exceptions
+ && may_trap_p (PATTERN (insn))))
+ REG_NOTES (insn)
+ = gen_rtx_EXPR_LIST (REG_EH_REGION,
+ XEXP (note, 0),
+ REG_NOTES (insn));
+ }
+ break;
+
+ case REG_NORETURN:
+ case REG_SETJMP:
+ case REG_ALWAYS_RETURN:
+ for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
+ {
+ rtx insn = XVECEXP (seq, 0, i);
+ if (GET_CODE (insn) == CALL_INSN)
+ REG_NOTES (insn)
+ = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
+ XEXP (note, 0),
+ REG_NOTES (insn));
+ }
+ break;
+
+ case REG_NON_LOCAL_GOTO:
+ for (i = XVECLEN (seq, 0) - 1; i >= 0; i--)
+ {
+ rtx insn = XVECEXP (seq, 0, i);
+ if (GET_CODE (insn) == JUMP_INSN)
+ REG_NOTES (insn)
+ = gen_rtx_EXPR_LIST (REG_NOTE_KIND (note),
+ XEXP (note, 0),
+ REG_NOTES (insn));
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
/* If there are LABELS inside the split insns increment the
usage count so we don't delete the label. */