(aggregate_value_p): Return 1 if regs we would use are not all call-clobbered.

From-SVN: r2384
This commit is contained in:
Richard Stallman 1992-10-09 16:59:56 +00:00
parent 6ed1d6c5ed
commit 9d790a4f73

View File

@ -2543,6 +2543,8 @@ int
aggregate_value_p (exp) aggregate_value_p (exp)
tree exp; tree exp;
{ {
int i, regno, nregs;
rtx reg;
if (TYPE_MODE (TREE_TYPE (exp)) == BLKmode) if (TYPE_MODE (TREE_TYPE (exp)) == BLKmode)
return 1; return 1;
if (RETURN_IN_MEMORY (TREE_TYPE (exp))) if (RETURN_IN_MEMORY (TREE_TYPE (exp)))
@ -2551,6 +2553,14 @@ aggregate_value_p (exp)
&& (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE && (TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE
|| TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE)) || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE))
return 1; return 1;
/* Make sure we have suitable call-clobbered regs to return
the value in; if not, we must return it in memory. */
reg = hard_function_value (TREE_TYPE (exp), 0);
regno = REGNO (reg);
nregs = HARD_REGNO_NREGS (regno, TYPE_MODE (TREE_TYPE (exp)));
for (i = 0; i < nregs; i++)
if (! call_used_regs[regno + i])
return 1;
return 0; return 0;
} }