public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: Richard Sandiford <richard.sandiford@arm.com>
To: Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org>
Cc: gcc Patches <gcc-patches@gcc.gnu.org>
Subject: Re: [PING] set libfunc entry for sdivmod_optab to NULL in optabs.def
Date: Thu, 15 Sep 2016 12:12:00 -0000	[thread overview]
Message-ID: <878tut77fg.fsf@e105548-lin.cambridge.arm.com> (raw)
In-Reply-To: <CAAgBjMmsPq5az_nvHSv1sui_KXTLSvb7b9aHmm7C-oEfinpD2g@mail.gmail.com>	(Prathamesh Kulkarni's message of "Thu, 15 Sep 2016 16:09:45 +0530")

Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> writes:
> On 15 September 2016 at 04:21, Richard Sandiford
> <rdsandiford@googlemail.com> wrote:
>> Richard Sandiford <rdsandiford@googlemail.com> writes:
>>> Prathamesh Kulkarni <prathamesh.kulkarni@linaro.org> writes:
>>>> Hi,
>>>> I would like to ping the following patch:
>>>> https://gcc.gnu.org/ml/gcc-patches/2016-08/msg01015.html
>>>>
>>>> While implementing divmod transform:
>>>> https://gcc.gnu.org/ml/gcc-patches/2016-05/msg01757.html
>>>>
>>>> I ran into an  issue with optab_libfunc().
>>>> It appears optab_libfunc (sdivmod_optab, mode) returns
>>>> bogus libfunc for unsupported modes, for instance
>>>> on x86_64, optab_libfunc (sdivmod_optab, DImode) returns
>>>> a libfunc with name "__divmoddi4", even though such a libfunc
>>>> does not exist in libgcc. This happens because in optabs.def
>>>> the libfunc entry for sdivmod_optab has gen_int_libfunc,
>>>> and call to optab_libfunc (sdivmo_optab, DImode) lazily
>>>> creates a bogus libfunc "__divmoddi4" by calling gen_int_libfunc().
>>>>
>>>> To work around this issue I set libfunc entry for sdivmod_optab to NULL
>>>> and verified that optab_libfunc (sdivmod_optab, DImode) returns NULL_RTX
>>>> instead of a bogus libfunc if it's not overriden by the target.
>>>>
>>>> Bootstrapped and tested on ppc64le-linux-gnu, x86_64-linux-gnu.
>>>> Cross tested on arm*-*-*, aarch64*-*-*.
>>>> OK for trunk ?
>>>
>>> I'm not a maintainer for this area, but:
>>
>> ...in https://gcc.gnu.org/ml/gcc-patches/2016-05/msg01757.html
>> you said that c6x follows the return-by-pointer convention.
>> I'm no c6x expert, but from a quick look, I think its divrem
>> function returns a div/mod pair in A4/A5, which matches the
>> ARM convention of returning both results by value.
>>
>> Does anyone know if the optab function registered by the SPU
>> backend is ever called directly?
>>
>> You mention that this is latent as far as expand_twoval_binop_libfunc
>> is concerned.  AIUI expand_twoval_binop_libfunc implements the ARM/c6x
>> convention and expects the two values to be returned as a pair.
>> It then extracts one half of the pair and discards the other.
>> So my worry is that we're leaving the udivmod entry intact even though
>> the standard __udivmoddi4 doesn't do what expand_twoval_binop_libfunc
>> expects.
>>
>> Would it make sense to set both entries to null and treat __udivmoddi4
>> as a non-optab function?  ARM and c6x could then continue to register
>> their current optab functions and a non-null optab function would
>> indicate a return value pair.
> AFAIU, there are only three targets (c6x, spu, arm) that override
> optab_libfunc for udivmod_optab for following modes:
> ./c6x/c6x.c:  set_optab_libfunc (udivmod_optab, SImode, "__c6xabi_divremu");
> ./c6x/c6x.c:  set_optab_libfunc (udivmod_optab, DImode, "__c6xabi_divremull");
> ./arm/arm.c:  set_optab_libfunc (udivmod_optab, DImode, "__aeabi_uldivmod");
> ./arm/arm.c:  set_optab_libfunc (udivmod_optab, SImode, "__aeabi_uidivmod");
> ./spu/spu.c:  set_optab_libfunc (udivmod_optab, DImode, "__udivmoddi4");
> ./spu/spu.c:  set_optab_libfunc (udivmod_optab, TImode, "__udivmodti4");
>
> Out of these only the arm, and c6x have target-specific divmod libfuncs which
> return <div, mod> pair, while spu merely makes it point to the
> standard functions.
>
> So we could set libfunc entry for udivmod_optab to NULL, thus dropping
> support for generic
> divmod functions (__udivmoddi4, __udivmodti4). For targets that
> require standard divmod libfuncs like __udivmoddi4,
> they could explicitly override  optab_libfunc and set it to
> __udivmoddi4, just as spu does.
>
> However this implies that non-null optab function doesn't necessarily
> follow arm/c6x convention.
> (i686-gcc for instance generates call to libgcc routines
> __udivdi3/__umoddi3 for DImode division/mod operations
> and could profit from divmod transform by calling __udivmoddi4).

What I meant was that we shouldn't treat udivmoddi4 as an optab function
at all, but handle it with some on-the-side mechanism.  That seems like
quite a natural fit if we handle the fused div/mod operation as an
internal function during gimple.

I think the current SPU code is wrong, but it looks like a latent bug.
(Like I say, does the udivmodti4 function that it registers ever
actually get used?  It seems unlikely.)

In that scenario no other targets should do what SPU does.

Thanks,
Richard

  reply	other threads:[~2016-09-15 11:02 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-09-09 22:05 Prathamesh Kulkarni
2016-09-15  0:21 ` Richard Sandiford
2016-09-15  3:08   ` Richard Sandiford
2016-09-15 10:53     ` Prathamesh Kulkarni
2016-09-15 12:12       ` Richard Sandiford [this message]
2016-09-15 12:16         ` Prathamesh Kulkarni
2016-09-15 12:42           ` Richard Biener
2016-09-16 11:31             ` Prathamesh Kulkarni

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=878tut77fg.fsf@e105548-lin.cambridge.arm.com \
    --to=richard.sandiford@arm.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=prathamesh.kulkarni@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).