aboutsummaryrefslogtreecommitdiff
path: root/gcc/integrate.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-03-27 23:20:43 -0800
committerRichard Henderson <rth@gcc.gnu.org>2001-03-27 23:20:43 -0800
commit8cd442715fa8705297549cf90f70e724f4a9214f (patch)
tree75ed5e9b27905299243ca2f77ff55612392c6d4b /gcc/integrate.c
parent89996b6e7cbeecc7e86586fe83d5911c7295043d (diff)
downloadgcc-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.c58
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 (&note, 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 (&note, 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,