This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix alpha and arm bootstrap failures


On Wed, 26 Feb 2003, Richard Henderson wrote:
> On Wed, Feb 26, 2003 at 02:50:37PM -0700, Roger Sayle wrote:
> > But we handle const, pure, nothrow and malloc attributes on
> > arbitrary non-libcall functions just fine without having to use
> > REG_EQUAL notes.
>
> How's that?  What other mechanism do we use to prove that
> two calls to foo are identical?

For non-libcall functions, the (use (mem:BLK (scratch))) used
to distinguish pure from const functions is maintained in the
CALL_INSN_FUNCTION_USAGE field of the CALL_INSN when the
CONST_OR_PURE_CALL_P bit is set.

For libcall functions, this is placed in the REG_EQUAL note of
the last instruction of the sequence that bears the REG_RETVAL
note.  This is not necessarily the call insn.


> > We can also recover much of our ability to CSE/GCSE by using
> > perfectly valid REG_EQUAL notes, such as "REG_EQUAL (lt:DF (reg:DF 1)
> > (reg: DF 2))" rather than the current "REG_EQUAL (expr_list ((symbol_ref
> > "__ltfdf2") (expr_list (reg:DF 1)..."
>
> Except that lt:DF would evaluate to FLOAT_STORE_FLAG_VALUE and lt:SI
> would evaluate to STORE_FLAG_VALUE.  Neither of which is what __ltfdf2
> returns.

We could abuse (if_then_else (lt:DF ...)) such that we make the return
values from the libgcc functions explicit in the RTL.  The should we
constant propagate "fabs" and "0.0" into the REG_EQUAL note, simplify_rtx
should be able to reduce the expression to the return value constant.
Once done, DCE should eliminate the actual pure/const call altogether,


However I now appreciate having scanned more of the source code that
the correct quick fix to Kazu's patch is something like:

  if (note && !find_reg_note (insn, REG_RETVAL, NULL_RTX))
    ...

i.e. ignore REG_EQUAL notes on instructions that also have REG_RETVAL
notes.  This seems to be a fairly common idiom.


However mid-term it would be nice to be able to use REG_EQUAL notes
on libcalls productively, by marking the libcall's call insn with
its' CALL_INSN_FUNCTION_USAGE.  By unifying the libcall/non-libcall
notes, it should simplify the GCC code that looks at either field.

Roger
--


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]