diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1995-07-28 09:06:19 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1995-07-28 09:06:19 -0400 |
commit | a55e9d2b21e897007f739cdbe66d5227b35ebba3 (patch) | |
tree | 1fbb6b3edf66e0fd19ea225a5896e115c517d731 /gcc | |
parent | aa6301773f48e7130fa002def822371f8d7e2975 (diff) | |
download | gcc-a55e9d2b21e897007f739cdbe66d5227b35ebba3.zip gcc-a55e9d2b21e897007f739cdbe66d5227b35ebba3.tar.gz gcc-a55e9d2b21e897007f739cdbe66d5227b35ebba3.tar.bz2 |
(reg_unused_after): New function.
From-SVN: r10183
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/config/sh/sh.c | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index ac018cf..36d489c 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -1850,3 +1850,53 @@ sh_function_arg_partial_nregs (cum, mode, type, named) } return 0; } + +/* Return non-zero if REG is not used after INSN. + We assume REG is a reload reg, and therefore does + not live past labels or calls or jumps. */ +int +reg_unused_after (reg, insn) + rtx reg; + rtx insn; +{ + enum rtx_code code, prev_code = UNKNOWN; + rtx set; + + /* If the reg is set by this instruction, then it is safe for our + case. Disregard the case where this is a store to memory, since + we are checking a register used in the store address. */ + set = single_set (insn); + if (set && GET_CODE (SET_DEST (set)) != MEM + && reg_overlap_mentioned_p (reg, SET_DEST (set))) + return 1; + + while (insn = NEXT_INSN (insn)) + { + if (prev_code == CALL_INSN && call_used_regs[REGNO (reg)]) + return 1; + + code = GET_CODE (insn); + if (GET_CODE (insn) == CODE_LABEL) + return 1; + + if (code == INSN && GET_CODE (PATTERN (insn)) == SEQUENCE) + { + insn = XVECEXP (PATTERN (insn), 0, 0); + code = GET_CODE (insn); + } + + if (GET_RTX_CLASS (code) == 'i') + { + rtx set = single_set (insn); + + if (set && reg_overlap_mentioned_p (reg, SET_SRC (set))) + return 0; + if (set && reg_overlap_mentioned_p (reg, SET_DEST (set))) + return GET_CODE (SET_DEST (set)) != MEM; + if (set == 0 && reg_overlap_mentioned_p (reg, PATTERN (insn))) + return 0; + } + prev_code = code; + } + return 1; +} |