mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-26 12:29:33 +08:00
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:
parent
0376d694c2
commit
b2df20b404
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user