From: Richard Earnshaw <Richard.Earnshaw@foss.arm.com>
To: Jeff Law <jeffreyalaw@gmail.com>, gcc-patches@gcc.gnu.org
Subject: Re: [PATCH v2] cselib: add function to check if SET is redundant [PR106187]
Date: Tue, 2 Aug 2022 17:06:02 +0100 [thread overview]
Message-ID: <e71a7121-6c46-12d3-d4c8-c1e5b96701c9@foss.arm.com> (raw)
In-Reply-To: <5df3ffd0-9a15-f4ad-325b-1507107a3504@foss.arm.com>
On 01/08/2022 11:38, Richard Earnshaw via Gcc-patches wrote:
>
>
> On 30/07/2022 20:57, Jeff Law via Gcc-patches wrote:
>>
>>
>> On 7/29/2022 7:52 AM, Richard Earnshaw via Gcc-patches wrote:
>>> A SET operation that writes memory may have the same value as an
>>> earlier store but if the alias sets of the new and earlier store do
>>> not conflict then the set is not truly redundant. This can happen,
>>> for example, if objects of different types share a stack slot.
>>>
>>> To fix this we define a new function in cselib that first checks for
>>> equality and if that is successful then finds the earlier store in the
>>> value history and checks the alias sets.
>>>
>>> The routine is used in two places elsewhere in the compiler. Firstly
>>> in cfgcleanup and secondly in postreload.
>>>
>>> gcc/ChangeLog:
>>> * alias.h (mems_same_for_tbaa_p): Declare.
>>> * alias.cc (mems_same_for_tbaa_p): New function.
>>> * dse.cc (record_store): Use it instead of open-coding
>>> alias check.
>>> * cselib.h (cselib_redundant_set_p): Declare.
>>> * cselib.cc: Include alias.h
>>> (cselib_redundant_set_p): New function.
>>> * cfgcleanup.cc: (mark_effect): Use cselib_redundant_set_p instead
>>> of rtx_equal_for_cselib_p.
>>> * postreload.c (reload_cse_simplify): Use cselib_redundant_set_p.
>>> (reload_cse_noop_set_p): Delete.
>> Seems quite reasonable. The only question I would have would be
>> whether or not you considered including the aliasing info into the
>> hashing used by cselib. You'd probably still need the bulk of this
>> patch as well since we could presumably still get a hash conflict with
>> two stores of the same value to the same location, but with different
>> alias sets (it's just much less likely), so perhaps it doesn't really
>> buy us anything.
>
> I thought about this, but if the alias set were included in the hash,
> then surely you'd get every alias set in a different value. Then you'd
> miss the cases where the alias sets do conflict even though they are not
> the same. Anyway, the values /are/ the same so in some circumstances
> you might want to know that.
>
>>
>> Ideally this would include a testcase. You might be able to turn that
>> non-executawble reduced case into something useful by scanning the
>> post-reload dumps.
>
> I considered this as well, but the testcase I have is far too fragile, I
> think. The existing test only fails on Arm, only fails on 11.2 (not
> 11.3 or gcc-12 onwards), relies on two objects with the same value being
> in distinct alias sets but still assigned to the same stack slot and for
> some copy dance to end up trying to write back the original value to the
> same slot but with a non-conflicting set. And finally, the scheduler
> has to then try to move a load past the non-aliasing store.
>
> To get anywhere close to this I think we'd need something akin to the
> gimple reader but for RTL so that we could set up all the conditions for
> the failure without the risk of an earlier transform blowing the test away.
I wasn't aware of the rtl reader already in the compiler. But it
doesn't really get me any closer as it is lacking in so many regards:
- It can't handle (const_double:SF ...) - it tries to handle the
argument as an int. This is a consequence, I think, of the reader being
based on that for reading machine descriptions where FP const_double is
simply never encountered.
- It doesn't seem to handle anything much more than very basic types,
and in particular appears to have no way of ensuring that alias sets
match up with the type system.
>
> I even considered whether we could start with a gimple dump and
> bypassing all the tree/gimple transformations, but even that would be
> still at the mercy of the stack-slot allocation algorithm.
I spent a while trying to get some gimple out of the dumpers in a form
that was usable, but that's pretty much a non-starter. To make it work
we'd need to add support for gimple clobbers on objects - without that
there's no way to get the stack-slot sharing code to work. Furthermore,
even feeding fully-optimized gimple directly into expand is such a long
way from the postreload pass, that I can't believe the testcase would
remain stable for long.
And the other major issue is that the original testcase is heavily
templated C++ and neither of the parsers gimple or rtl is supported in
cc1plus: converting the boilerplate to be C-friendly is probably going
to be hard.
I can't afford to spend much more time on this, especially given the
low-quality test we're going to get out of the end of the process.
>
>>
>> Jeff
>
> R.
R.
next prev parent reply other threads:[~2022-08-02 16:06 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-07-29 13:52 Richard Earnshaw
2022-07-30 19:57 ` Jeff Law
2022-08-01 10:38 ` Richard Earnshaw
2022-08-02 16:06 ` Richard Earnshaw [this message]
2022-08-02 23:36 ` Jeff Law
2022-08-03 9:09 ` Richard Earnshaw
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=e71a7121-6c46-12d3-d4c8-c1e5b96701c9@foss.arm.com \
--to=richard.earnshaw@foss.arm.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jeffreyalaw@gmail.com \
/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).