diff options
author | Richard Henderson <rth@redhat.com> | 2001-03-27 23:20:43 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2001-03-27 23:20:43 -0800 |
commit | 8cd442715fa8705297549cf90f70e724f4a9214f (patch) | |
tree | 75ed5e9b27905299243ca2f77ff55612392c6d4b /gcc/integrate.c | |
parent | 89996b6e7cbeecc7e86586fe83d5911c7295043d (diff) | |
download | gcc-8cd442715fa8705297549cf90f70e724f4a9214f.zip gcc-8cd442715fa8705297549cf90f70e724f4a9214f.tar.gz gcc-8cd442715fa8705297549cf90f70e724f4a9214f.tar.bz2 |
integrate.c (copy_insn_list): Use returnjump_p.
* integrate.c (copy_insn_list): Use returnjump_p.
(copy_insn_notes): Recurse for CALL_PLACEHOLDER.
From-SVN: r40912
Diffstat (limited to 'gcc/integrate.c')
-rw-r--r-- | gcc/integrate.c | 58 |
1 files changed, 36 insertions, 22 deletions
diff --git a/gcc/integrate.c b/gcc/integrate.c index 76104c0..bedfd14 100644 --- a/gcc/integrate.c +++ b/gcc/integrate.c @@ -1391,9 +1391,7 @@ copy_insn_list (insns, map, static_chain_value) break; case JUMP_INSN: - if (GET_CODE (PATTERN (insn)) == RETURN - || (GET_CODE (PATTERN (insn)) == PARALLEL - && GET_CODE (XVECEXP (PATTERN (insn), 0, 0)) == RETURN)) + if (map->integrating && returnjump_p (insn)) { if (map->local_return_label == 0) map->local_return_label = gen_label_rtx (); @@ -1593,30 +1591,46 @@ copy_insn_notes (insns, map) rtx insns; struct inline_remap *map; { - rtx insn; + rtx insn, new_insn; map->const_age++; for (insn = insns; insn; insn = NEXT_INSN (insn)) - if (INSN_P (insn) - && map->insn_map[INSN_UID (insn)] - && REG_NOTES (insn)) - { - rtx next, note = copy_rtx_and_substitute (REG_NOTES (insn), map, 0); + { + if (! INSN_P (insn)) + continue; - /* We must also do subst_constants, in case one of our parameters - has const type and constant value. */ - subst_constants (¬e, NULL_RTX, map, 0); - apply_change_group (); - REG_NOTES (map->insn_map[INSN_UID (insn)]) = note; + new_insn = map->insn_map[INSN_UID (insn)]; + if (! new_insn) + continue; - /* Finally, delete any REG_LABEL notes from the chain. */ - for (; note; note = next) - { - next = XEXP (note, 1); - if (REG_NOTE_KIND (note) == REG_LABEL) - remove_note (map->insn_map[INSN_UID (insn)], note); - } - } + if (REG_NOTES (insn)) + { + rtx next, note = copy_rtx_and_substitute (REG_NOTES (insn), map, 0); + + /* We must also do subst_constants, in case one of our parameters + has const type and constant value. */ + subst_constants (¬e, NULL_RTX, map, 0); + apply_change_group (); + REG_NOTES (new_insn) = note; + + /* Delete any REG_LABEL notes from the chain. Remap any + REG_EH_REGION notes. */ + for (; note; note = next) + { + next = XEXP (note, 1); + if (REG_NOTE_KIND (note) == REG_LABEL) + remove_note (new_insn, note); + } + } + + if (GET_CODE (insn) == CALL_INSN + && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER) + { + int i; + for (i = 0; i < 3; i++) + copy_insn_notes (XEXP (PATTERN (insn), i), map); + } + } } /* Given a chain of PARM_DECLs, ARGS, copy each decl into a VAR_DECL, |