From: Jeff Law <jeffreyalaw@gmail.com>
To: Richard Earnshaw <Richard.Earnshaw@foss.arm.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:36:29 -0600 [thread overview]
Message-ID: <7a7a8864-49d9-b0f0-604b-ec5d98466200@gmail.com> (raw)
In-Reply-To: <e71a7121-6c46-12d3-d4c8-c1e5b96701c9@foss.arm.com>
On 8/2/2022 10:06 AM, Richard Earnshaw wrote:
>
>
> 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.
Understood. Let's just go with the patch as-is. That's normal for
cases where we can't produce a reasonable test.
jeff
next prev parent reply other threads:[~2022-08-02 23:36 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
2022-08-02 23:36 ` Jeff Law [this message]
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=7a7a8864-49d9-b0f0-604b-ec5d98466200@gmail.com \
--to=jeffreyalaw@gmail.com \
--cc=Richard.Earnshaw@foss.arm.com \
--cc=gcc-patches@gcc.gnu.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).