From: Jason Merrill <jason@redhat.com>
To: Bernd Edlinger <bernd.edlinger@hotmail.de>,
"Richard Earnshaw (lists)" <Richard.Earnshaw@arm.com>,
"gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>,
Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>,
Nathan Sidwell <nathan@acm.org>,
Christophe Lyon <christophe.lyon@linaro.org>
Subject: Re: [PATCH] Avoid atomic for guard acquire when that is expensive
Date: Mon, 7 Dec 2020 10:04:22 -0500 [thread overview]
Message-ID: <32000d0c-7286-6021-5bb0-eeb43641e5b3@redhat.com> (raw)
In-Reply-To: <AM6PR03MB5170F6B2C134ABDFAAED5DE2E4F00@AM6PR03MB5170.eurprd03.prod.outlook.com>
On 12/5/20 7:37 AM, Bernd Edlinger wrote:
> On 12/2/20 7:57 PM, Jason Merrill wrote:
>> On 12/1/20 1:28 PM, Bernd Edlinger wrote:
>>> On 11/24/20 11:10 PM, Jason Merrill wrote:
>>>> On 11/22/20 3:05 AM, Bernd Edlinger wrote:
>>>>> Hi,
>>>>>
>>>>> this avoids the need to use -fno-threadsafe-statics on
>>>>> arm-none-eabi or working around that problem by supplying
>>>>> a dummy __sync_synchronize function which might
>>>>> just lead to silent code failure of the worst kind
>>>>> (non-reproducable, racy) at runtime, as was pointed out
>>>>> on previous discussions here.
>>>>>
>>>>> When the atomic access involves a call to __sync_synchronize
>>>>> it is better to call __cxa_guard_acquire unconditionally,
>>>>> since it handles the atomics too, or is a non-threaded
>>>>> implementation when there is no gthread support for this target.
>>>>>
>>>>> This fixes also a bug for the ARM EABI big-endian target,
>>>>> that is, previously the wrong bit was checked.
>>>>
>>>> Instead of a new target macro, can't you follow fold_builtin_atomic_always_lock_free/can_atomic_load_p?
>>>
>>> Yes, thanks, that should work too.
>>> Would you like this better?
>>
>>> +is_atomic_expensive_p (machine_mode mode)
>>> +{
>>> + if (!flag_inline_atomics)
>>> + return false;
>>
>> Why not true?
>
> Ooops...
> Yes, I ought to return true here.
> I must have made a mistake when I tested the last version of this patch,
> sorry for the confusion.
>
>>> + if (!can_compare_and_swap_p (mode, false) || !can_atomic_load_p (mode))
>>> + return false;
>>
>> This also seems backwards; I'd think we want to return false if either of those tests are true. Or maybe just can_atomic_load_p, and not bother about compare-and-swap.
>
> Yes, you are right.
> Unfortuately can_atomic_load_p is too weak, since it does not cover
> the memory barrier.
>
> And can_compare_and_swap_p (..., false) is actually a bit too strong,
> but if it returns true, we should be able to use any atomic without
> need for a library call.
>>> + tree type = targetm.cxx.guard_mask_bit ()
>>> + ? TREE_TYPE (guard) : char_type_node;
>>> +
>>> + if (is_atomic_expensive_p (TYPE_MODE (type)))
>>> + guard = integer_zero_node;
>>> + else
>>> + guard = build_atomic_load_type (guard, MEMMODEL_ACQUIRE, type);
>>
>> It should still work to load a single byte, it just needs to be the least-significant byte.
I still don't think you need to load the whole word to check the guard bit.
> And this isn't an EABI issue; it looks like the non-EABI code is also broken for big-endian targets, both the atomic load and the normal load in get_guard_bits.
>>
>
> I think the non-EABI code is always using bit 0 in the first byte,
> by using the endian-neutral #define _GLIBCXX_GUARD_BIT __guard_test_bit (0, 1).
Except that set_guard sets the least-significant bit on all targets.
> Only ARM EABI uses bit 0 in byte 3 if big-endian and bit 0 in byte 0 otherwise.
>
> For all other targets when _GLIBCXX_USE_FUTEX is defined,
> __cxa_guard_XXX accesses the value as int* while the memory
> is a 64-bit long, so I could imagine that is an aliasing violation.
>
>
> But nothing that needs to be fixed immediately.
Agreed.
> Attached is the corrected patch.
>
> Tested again on arm-none-eabi with arm-sim.
> Is it OK for trunk?
>
> Thanks
> Bernd.
>
>> Jason
>>
next prev parent reply other threads:[~2020-12-07 15:04 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-03 15:08 [PATCH] libgcc: Add a weak stub for __sync_synchronize Bernd Edlinger
2020-11-17 5:43 ` [PING] " Bernd Edlinger
2020-11-17 12:44 ` Richard Earnshaw (lists)
2020-11-17 15:18 ` Bernd Edlinger
2020-11-17 15:41 ` Richard Earnshaw (lists)
2020-11-17 15:51 ` Christophe Lyon
2020-11-17 17:17 ` Bernd Edlinger
2020-11-22 8:05 ` [PATCH] Avoid atomic for guard acquire when that is expensive Bernd Edlinger
2020-11-24 22:10 ` Jason Merrill
2020-12-01 18:28 ` Bernd Edlinger
2020-12-02 18:57 ` Jason Merrill
2020-12-05 12:37 ` Bernd Edlinger
2020-12-07 15:04 ` Jason Merrill [this message]
2020-12-07 16:17 ` Bernd Edlinger
2020-12-08 19:50 ` Jason Merrill
2020-11-30 20:08 ` [PING] " Bernd Edlinger
2020-11-30 20:54 ` Jason Merrill
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=32000d0c-7286-6021-5bb0-eeb43641e5b3@redhat.com \
--to=jason@redhat.com \
--cc=Richard.Earnshaw@arm.com \
--cc=bernd.edlinger@hotmail.de \
--cc=christophe.lyon@linaro.org \
--cc=gcc-patches@gcc.gnu.org \
--cc=nathan@acm.org \
--cc=ramana.radhakrishnan@arm.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).