This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: RFA: non-const libcalls
On May 13, 2001, Alexandre Oliva <aoliva@redhat.com> wrote:
> On May 12, 2001, Richard Henderson <rth@redhat.com> wrote:
>> On Sat, May 12, 2001 at 03:21:56PM -0300, Alexandre Oliva wrote:
>>> I'm pretty sure there was no problem in case the stores came before
>>> a regular call because this thing operated only within basic blocks,
>> No. There was no problem on regular calls because they are
>> assumed to read and write all memory.
>> /* Non-constant calls clobber memory. */
>> if (! CONST_CALL_P (insn))
> Hmm... So we probably still have a problem with regular function
> calls declared with attribute const, don't we? We should probably be
> emitting CALL_INSN_FUNCTION_USAGE notes for arguments passed by
> reference to non-libcall const functions, shouldn't we?
Anyway, ok to install this so far?
Index: gcc/ChangeLog
from Alexandre Oliva <aoliva@redhat.com>
* rtl.texi (CALL_INSN_FUNCTION_USAGE): Note that (and when) it may
contain MEMs. Remove useless distinction about clobbering
registers.
Index: gcc/rtl.texi
===================================================================
RCS file: /cvs/gcc/egcs/gcc/rtl.texi,v
retrieving revision 1.38
diff -u -p -r1.38 rtl.texi
--- gcc/rtl.texi 2001/04/19 19:44:12 1.38
+++ gcc/rtl.texi 2001/05/13 22:42:40
@@ -2523,12 +2523,25 @@ unpredictably.
accessed in the same way and in addition contain a field
@code{CALL_INSN_FUNCTION_USAGE}, which contains a list (chain of
@code{expr_list} expressions) containing @code{use} and @code{clobber}
-expressions that denote hard registers used or clobbered by the called
-function. A register specified in a @code{clobber} in this list is
-modified @emph{after} the execution of the @code{call_insn}, while a
-register in a @code{clobber} in the body of the @code{call_insn} is
-clobbered before the insn completes execution. @code{clobber}
-expressions in this list augment registers specified in
+expressions that denote hard registers and @code{MEM}s used or
+clobbered by the called function.
+
+A @code{MEM} generally points to a stack slots in which arguments passed
+to the libcall by reference (@pxref{Register Arguments,
+FUNCTION_ARG_PASS_BY_REFERENCE}) are stored. If the argument is
+caller-copied (@pxref{Register Arguments, FUNCTION_ARG_CALLEE_COPIES}),
+the stack slot will be mentioned in @code{CLOBBER} and @code{USE}
+entries; if it's callee-copied, only a @code{USE} will appear, and the
+@code{MEM} may point to addresses that are not stack slots. These
+@code{MEM}s are used only in libcalls, because, unlike regular function
+calls, @code{CONST_CALL}s (which libcalls generally are, @pxref{Flags,
+CONST_CALL_P}) aren't assumed to read and write all memory, so flow
+would consider the stores dead and remove them. Note that, since a
+libcall must never return values in memory (@pxref{Aggregate Return,
+RETURN_IN_MEMORY}), there will never be a @code{CLOBBER} for a memory
+address holding a return value.
+
+@code{CLOBBER}ed registers in this list augment registers specified in
@code{CALL_USED_REGISTERS} (@pxref{Register Basics}).
@findex code_label
--
Alexandre Oliva Enjoy Guarana', see http://www.ic.unicamp.br/~oliva/
Red Hat GCC Developer aoliva@{cygnus.com, redhat.com}
CS PhD student at IC-Unicamp oliva@{lsd.ic.unicamp.br, gnu.org}
Free Software Evangelist *Please* write to mailing lists, not to me