aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1995-07-28 09:06:19 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1995-07-28 09:06:19 -0400
commita55e9d2b21e897007f739cdbe66d5227b35ebba3 (patch)
tree1fbb6b3edf66e0fd19ea225a5896e115c517d731 /gcc
parentaa6301773f48e7130fa002def822371f8d7e2975 (diff)
downloadgcc-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.c50
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;
+}