diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-02-19 16:25:58 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2016-02-19 16:25:58 +0000 |
commit | 743d9602b2607f78d71022e989e65258f13d60c7 (patch) | |
tree | e98c952fbd29c96afb4bdeec09d0b83795625bd1 /gcc/lra.c | |
parent | 6263dde1ca1907900babb51a45761ababb793def (diff) | |
download | gcc-743d9602b2607f78d71022e989e65258f13d60c7.tar.gz |
PR middle-end/69838
* lra.c (lra_process_new_insns): If non-call exceptions are enabled,
call copy_reg_eh_region_note_forward on before and/or after sequences
and remove note from insn if it no longer can throw.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@233562 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/lra.c')
-rw-r--r-- | gcc/lra.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gcc/lra.c b/gcc/lra.c index ee92ca57e63..a6ce36529f8 100644 --- a/gcc/lra.c +++ b/gcc/lra.c @@ -1742,20 +1742,29 @@ lra_process_new_insns (rtx_insn *insn, rtx_insn *before, rtx_insn *after, } if (before != NULL_RTX) { + if (cfun->can_throw_non_call_exceptions) + copy_reg_eh_region_note_forward (insn, before, NULL); emit_insn_before (before, insn); push_insns (PREV_INSN (insn), PREV_INSN (before)); setup_sp_offset (before, PREV_INSN (insn)); } if (after != NULL_RTX) { + if (cfun->can_throw_non_call_exceptions) + copy_reg_eh_region_note_forward (insn, after, NULL); for (last = after; NEXT_INSN (last) != NULL_RTX; last = NEXT_INSN (last)) ; emit_insn_after (after, insn); push_insns (last, insn); setup_sp_offset (after, last); } + if (cfun->can_throw_non_call_exceptions) + { + rtx note = find_reg_note (insn, REG_EH_REGION, NULL_RTX); + if (note && !insn_could_throw_p (insn)) + remove_note (insn, note); + } } - /* Replace all references to register OLD_REGNO in *LOC with pseudo |