Commit f1e7c95f by Richard Kenner

(cse_insn): Invalidate CLOBBERed registers.

(count_reg_usage): Count registers in USE rtls on CALL_INSNs.

From-SVN: r7237
parent 6e2d1486
...@@ -5903,6 +5903,13 @@ cse_insn (insn, in_libcall_block) ...@@ -5903,6 +5903,13 @@ cse_insn (insn, in_libcall_block)
Also determine whether there is a CLOBBER that invalidates Also determine whether there is a CLOBBER that invalidates
all memory references, or all references at varying addresses. */ all memory references, or all references at varying addresses. */
if (GET_CODE (insn) == CALL_INSN)
{
for (tem = CALL_INSN_FUNCTION_USAGE (insn); tem; tem = XEXP (tem, 1))
if (GET_CODE (XEXP (tem, 0)) == CLOBBER)
invalidate (SET_DEST (XEXP (tem, 0)));
}
if (GET_CODE (x) == SET) if (GET_CODE (x) == SET)
{ {
sets = (struct set *) alloca (sizeof (struct set)); sets = (struct set *) alloca (sizeof (struct set));
...@@ -8315,11 +8322,14 @@ count_reg_usage (x, counts, dest, incr) ...@@ -8315,11 +8322,14 @@ count_reg_usage (x, counts, dest, incr)
rtx dest; rtx dest;
int incr; int incr;
{ {
enum rtx_code code = GET_CODE (x); enum rtx_code code;
char *fmt; char *fmt;
int i, j; int i, j;
switch (code) if (x == 0)
return;
switch (code = GET_CODE (x))
{ {
case REG: case REG:
if (x != dest) if (x != dest)
...@@ -8352,24 +8362,26 @@ count_reg_usage (x, counts, dest, incr) ...@@ -8352,24 +8362,26 @@ count_reg_usage (x, counts, dest, incr)
incr); incr);
return; return;
case CALL_INSN:
count_reg_usage (CALL_INSN_FUNCTION_USAGE (x), counts, NULL_RTX, incr);
/* ... falls through ... */
case INSN: case INSN:
case JUMP_INSN: case JUMP_INSN:
case CALL_INSN:
count_reg_usage (PATTERN (x), counts, NULL_RTX, incr); count_reg_usage (PATTERN (x), counts, NULL_RTX, incr);
/* Things used in a REG_EQUAL note aren't dead since loop may try to /* Things used in a REG_EQUAL note aren't dead since loop may try to
use them. */ use them. */
if (REG_NOTES (x)) count_reg_usage (REG_NOTES (x), counts, NULL_RTX, incr);
count_reg_usage (REG_NOTES (x), counts, NULL_RTX, incr);
return; return;
case EXPR_LIST: case EXPR_LIST:
case INSN_LIST: case INSN_LIST:
if (REG_NOTE_KIND (x) == REG_EQUAL) if (REG_NOTE_KIND (x) == REG_EQUAL
|| GET_CODE (XEXP (x,0)) == USE)
count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr); count_reg_usage (XEXP (x, 0), counts, NULL_RTX, incr);
if (XEXP (x, 1)) count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
count_reg_usage (XEXP (x, 1), counts, NULL_RTX, incr);
return; return;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment