On Fri, Apr 27, 2012 at 2:31 PM, Andrew MacLeod <amacl...@redhat.com> wrote:
> On 04/27/2012 04:37 AM, Richard Guenther wrote:
>>
>> Since integral atomics are always of an unsigned type ,  I could switch
>> over
>> and use 'unsigned size' instead of 'tree fntype' for them (I will rename
>> it), but then things may  be more complicated when dealing with generic
>> atomics...  those can be structure or array types and I was planning to
>> allow leaving the type in case I discover something useful I can do with
>> it.
>>  It may ultimately turn out that the real type isn't going to matter, in
>> which case I will remove it and replace it with an unsigned int for size.
>> So it eventually will support variable-size types?
>
> we support arbitrary sized objects now for exchange, compare_exchange, load,
> and store. I just havent added the support to gimple_atomic yet.  Thats next
> on my list.
>
>>> And the reason memmodel is a tree is because, as ridiculous as it seems,
>>> it
>>> can ultimately be a runtime value.    Even barring that, it shows up as a
>>> variable after inlining before various propagation engines run,
>>> especially
>>> in the  C++ templates.  So it must be a tree.
>>
>> Ick.  That sounds gross.  So, if it ends up a variable at the time we
>> generate
>> assembly we use a "conservative" constant value for it?
>
> Indeed,  ICK,  and yes, I make it SEQ_CST at compile time if a variable
> value gets all the way through to codegen.
>
>> Hmm, ok. So you are changing GENERIC in fact. I suppose _Atomic is
>> restricted to global variables. Can I attach _Atomic to allocated storage
>> via pointer casts? Consider writing up semantics of _Atomic into
>> generic.texi please.
>
>
> Yes, I have a start on implementing _Atomic which adds the bit to the type.
>  And no, it isn't restricted to globals... it just indicates said hunk of
> memory must be accessed in an atomic manner.   You can use it on automatics
> if you want...
>
> I believe _Atomic can also be used in casts as well.  so an atomic call may
> have to be injected into a dereference expression as well to load or update
> memory.
>
> I'll update .texi along with the patch when I get to it.
>
>
>
>
>> Well, they are calls with a very well-defined set of side-effects.
>> Otherwise not representing them as calls would be a waste of time. Thus, no
>> - they do not need to be considered "calls" everywhere (well, treating them
>> the same as calls should be conservative) but treating them as "atomics"
>> even if they were expanded as calls needs to be correct.
>
>
> Yeah, I was starting with them as calls just to be conservative and get the
> same behaviour, then refine them by examining each GIMPLE_ATOMIC use in
> detail.
>
>> Looks like a hieararchy "no target or anything else" ->  "target" ->
>> "expr" ->  "memorder" would work, with only "lhs" being optional and
>> present everywhere.
>> Of course the hierarchy only makes sense for things that are not trees
>> (I was thinking of memorder originally - but that thought fell apart).
>>  So in the
>> end apart from abstracting a base for FENCE the flat hieararchy makes
>> sense
>> (all but FENCE have a type / size).
>
> Is it really worth it to have 2 different types of gimple_atomic nodes in
> order to avoid having an unused type field in atomic_fence?  Atomic_fence
> has an order field, so it requires the use of op[0] in order for
> gimple_atomic_order() to work properly, we can't have all the other gimple
> nodes inherit from that, so we'd need a base which basically has just the
> KIND in it, and target/no-target nodes inherit from that.  So we'd have:
>
>                    /    gimple_atomic_fence
> atomic_base
>                    \   gimple_atomic_all_others
>
> then all the checks for is_gimple_atomic() have to look for both
> gimple_atomic_all_others and gimple_atomic_fence.
>
>
> Perhaps a better option is to shift all the operands by one since the type
> is a tree... ie, if there is a a target, there is also a type entry, so
> op[0] remains ORDER,
> op[1] is the newly inserted TYPE
> op[2] then becomes the TARGET,
> op[3...] ,when present, are all shifted over by one.
>
> the type can be removed from the structure and now there would be no
> wastage.  Is that reasonable?

types in ops is a bad idea (tried that once - heh), it wrecks too much generic
code.

Richard.

> Andrew

Reply via email to