function.c (purge_addressof_1): In (mem (addressof (reg))) case for reg notes...
* function.c (purge_addressof_1): In (mem (addressof (reg))) case for reg notes, if there are no substitutions, just use a SUBREG. From-SVN: r65934
This commit is contained in:
parent
6adb9463cd
commit
277b3b18b3
@ -1,3 +1,8 @@
|
|||||||
|
2003-04-22 J"orn Rennecke <joern.rennecke@superh.com>
|
||||||
|
|
||||||
|
* function.c (purge_addressof_1): In (mem (addressof (reg))) case
|
||||||
|
for reg notes, if there are no substitutions, just use a SUBREG.
|
||||||
|
|
||||||
2003-04-21 Mark Mitchell <mark@codesourcery.com>
|
2003-04-21 Mark Mitchell <mark@codesourcery.com>
|
||||||
|
|
||||||
* Makefile.in (calls.o): Depend on except.h.
|
* Makefile.in (calls.o): Depend on except.h.
|
||||||
|
@ -3147,6 +3147,36 @@ purge_addressof_1 (loc, insn, force, store, may_postpone, ht)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* When we are processing the REG_NOTES of the last instruction
|
||||||
|
of a libcall, there will be typically no replacements
|
||||||
|
for that insn; the replacements happened before, piecemeal
|
||||||
|
fashion. OTOH we are not interested in the details of
|
||||||
|
this for the REG_EQUAL note, we want to know the big picture,
|
||||||
|
which can be succinctly described with a simple SUBREG.
|
||||||
|
Note that removing the REG_EQUAL note is not an option
|
||||||
|
on the last insn of a libcall, so we must do a replacement. */
|
||||||
|
if (! purge_addressof_replacements
|
||||||
|
&& ! purge_bitfield_addressof_replacements)
|
||||||
|
{
|
||||||
|
/* In compile/990107-1.c:7 compiled at -O1 -m1 for sh-elf,
|
||||||
|
we got
|
||||||
|
(mem:DI (addressof:SI (reg/v:DF 160) 159 0x401c8510)
|
||||||
|
[0 S8 A32]), which can be expressed with a simple
|
||||||
|
same-size subreg */
|
||||||
|
if ((GET_MODE_SIZE (GET_MODE (x))
|
||||||
|
== GET_MODE_SIZE (GET_MODE (sub)))
|
||||||
|
/* Again, invalid pointer casts (as in
|
||||||
|
compile/990203-1.c) can require paradoxical
|
||||||
|
subregs. */
|
||||||
|
|| (GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD
|
||||||
|
&& (GET_MODE_SIZE (GET_MODE (x))
|
||||||
|
> GET_MODE_SIZE (GET_MODE (sub)))))
|
||||||
|
{
|
||||||
|
*loc = gen_rtx_SUBREG (GET_MODE (x), sub, 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
/* ??? Are there other cases we should handle? */
|
||||||
|
}
|
||||||
/* Sometimes we may not be able to find the replacement. For
|
/* Sometimes we may not be able to find the replacement. For
|
||||||
example when the original insn was a MEM in a wider mode,
|
example when the original insn was a MEM in a wider mode,
|
||||||
and the note is part of a sign extension of a narrowed
|
and the note is part of a sign extension of a narrowed
|
||||||
|
Loading…
x
Reference in New Issue
Block a user