public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
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
>>


  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).