rtlanal.c (find_first_parameter_load): Rewrite to return actual first param load or the call if none...

2005-03-16 Dale Johannesen  <dalej@apple.com>

        * rtlanal.c (find_first_parameter_load):  Rewrite to
        return actual first param load or the call if none,
        instead of first in block, when not all loads exist.

From-SVN: r96578
This commit is contained in:
Dale Johannesen 2005-03-16 20:42:37 +00:00 committed by Dale Johannesen
parent 0376d694c2
commit b2df20b404
2 changed files with 24 additions and 3 deletions

View File

@ -1,3 +1,9 @@
2005-03-16 Dale Johannesen <dalej@apple.com>
* rtlanal.c (find_first_parameter_load): Rewrite to
return actual first param load or the call if none,
instead of first in block, when not all loads exist.
2005-03-16 Roger Sayle <roger@eyesopen.com>
* optabs.c (expand_copysign_absneg): Make static.

View File

@ -3159,12 +3159,15 @@ parms_set (rtx x, rtx pat ATTRIBUTE_UNUSED, void *data)
}
/* Look backward for first parameter to be loaded.
Note that loads of all parameters will not necessarily be
found if CSE has eliminated some of them (e.g., an argument
to the outer function is passed down as a parameter).
Do not skip BOUNDARY. */
rtx
find_first_parameter_load (rtx call_insn, rtx boundary)
{
struct parms_set_data parm;
rtx p, before;
rtx p, before, first_set;
/* Since different machines initialize their parameter registers
in different orders, assume nothing. Collect the set of all
@ -3186,6 +3189,7 @@ find_first_parameter_load (rtx call_insn, rtx boundary)
parm.nregs++;
}
before = call_insn;
first_set = call_insn;
/* Search backward for the first set of a register in this set. */
while (parm.nregs && before != boundary)
@ -3208,9 +3212,20 @@ find_first_parameter_load (rtx call_insn, rtx boundary)
}
if (INSN_P (before))
note_stores (PATTERN (before), parms_set, &parm);
{
int nregs_old = parm.nregs;
note_stores (PATTERN (before), parms_set, &parm);
/* If we found something that did not set a parameter reg,
we're done. Do not keep going, as that might result
in hoisting an insn before the setting of a pseudo
that is used by the hoisted insn. */
if (nregs_old != parm.nregs)
first_set = before;
else
break;
}
}
return before;
return first_set;
}
/* Return true if we should avoid inserting code between INSN and preceding