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 ();
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);
+ }
+ }
}
\f
/* Given a chain of PARM_DECLs, ARGS, copy each decl into a VAR_DECL,