diff options
Diffstat (limited to 'gcc/resource.c')
-rw-r--r-- | gcc/resource.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/gcc/resource.c b/gcc/resource.c index aed00edc6f4..b55568256c3 100644 --- a/gcc/resource.c +++ b/gcc/resource.c @@ -655,10 +655,12 @@ mark_set_resources (rtx x, struct resources *res, int in_dest, if (mark_type == MARK_SRC_DEST_CALL) { rtx link; + HARD_REG_SET regs; res->cc = res->memory = 1; - IOR_HARD_REG_SET (res->regs, regs_invalidated_by_call); + get_call_reg_set_usage (x, ®s, regs_invalidated_by_call); + IOR_HARD_REG_SET (res->regs, regs); for (link = CALL_INSN_FUNCTION_USAGE (x); link; link = XEXP (link, 1)) @@ -1011,11 +1013,15 @@ mark_target_live_regs (rtx insns, rtx target, struct resources *res) predicated instruction, or if the CALL is NORETURN. */ if (GET_CODE (PATTERN (real_insn)) != COND_EXEC) { + HARD_REG_SET regs_invalidated_by_this_call; + get_call_reg_set_usage (real_insn, + ®s_invalidated_by_this_call, + regs_invalidated_by_call); /* CALL clobbers all call-used regs that aren't fixed except sp, ap, and fp. Do this before setting the result of the call live. */ AND_COMPL_HARD_REG_SET (current_live_regs, - regs_invalidated_by_call); + regs_invalidated_by_this_call); } /* A CALL_INSN sets any global register live, since it may |