AARCH64: 8064611: Changes to HotSpot shared code
Vladimir Kozlov
vladimir.kozlov at oracle.com
Fri Nov 21 18:06:58 UTC 2014
On 11/21/14 9:33 AM, Andrew Haley wrote:
> On 11/20/2014 06:13 PM, Andrew Haley wrote:
>> On 11/20/2014 06:05 PM, Vladimir Kozlov wrote:
>>> I based the name on your comment:
>>>
>>> + // AArch64 uses store release (which does everything we need to keep
>>> + // the machine in order) but we still need a compiler barrier here.
>>
>> Ah. Okay, I'll have to think of a good name for it, then.
>>
>>> You can name it as you like. Our main suggestion is to use such Boolean
>>> constant and normal if() statements instead of ifdef AARCH64 and
>>> AARCH64_ONLY/NOT_AARCH64 macros in C2 code (src/share/vm/opto/* files).
>>>
>>> We already do similar things for PPC64 port which sets
>>> support_IRIW_for_* constant.
>>
>> Okay,
>
> I've done something similar but more useful. I've added an
> experimental flag: UseBarriersForVolatile. This defaults to true for
> all targets, but we can override it in the back end. That gives me
> the chance to do some benchmarking on various AArch64 targets to see
> which ones benefit from the new load acquire/store release
> instructions.
Okay.
>
> I have kept AARCH64_ONLY for two hunks:
>
> --- old/src/share/vm/opto/memnode.hpp 2014-11-21 12:09:22.766963837 -0500
> +++ new/src/share/vm/opto/memnode.hpp 2014-11-21 12:09:22.546983320 -0500
> @@ -503,6 +503,10 @@
> // Conservatively release stores of object references in order to
> // ensure visibility of object initialization.
> static inline MemOrd release_if_reference(const BasicType t) {
> + // AArch64 doesn't need a release store here because object
> + // initialization contains the necessary barriers.
> + AARCH64_ONLY(return unordered);
> +
> const MemOrd mo = (t == T_ARRAY ||
> t == T_ADDRESS || // Might be the address of an object reference (`boxing').
> t == T_OBJECT) ? release : unordered;
This could be needed for ppc64 too, not only for IA64.
>
> --- old/src/share/vm/opto/graphKit.cpp 2014-11-21 12:09:20.017207376 -0500
> +++ new/src/share/vm/opto/graphKit.cpp 2014-11-21 12:09:19.787227745 -0500
> @@ -3813,7 +3813,8 @@
>
> // Smash zero into card
> if( !UseConcMarkSweepGC ) {
> - __ store(__ ctrl(), card_adr, zero, bt, adr_type, MemNode::release);
> + __ store(__ ctrl(), card_adr, zero, bt, adr_type,
> + NOT_AARCH64(MemNode::release) AARCH64_ONLY(MemNode::unordered));
> } else {
> // Specialized path for CM store barrier
> __ storeCM(__ ctrl(), card_adr, zero, oop_store, adr_idx, bt, adr_type);
Looks like PPC64 needs that. In ppc.ad:
// Use release_store for card-marking to ensure that previous
// oop-stores are visible before the card-mark change.
enc_class enc_cms_card_mark(memory mem, iRegLdst releaseFieldAddr) %{
>
> The first hunk is only required by IA64 as far as I am aware, but I
> am nervous about making it IA64_ONLY. The second hunk is a release
> node which is not as far as I am aware required by any target, and
> should simply be removed.
>
> This isn't a RFA because it's not tested yet, but what do you think?
Since it affects ppc64 and ia64 we need to ask Goetz and Co.
I would suggest to put both these places under platform specific
flags/bool constant.
Thanks,
Vladimir
>
> Andrew.
>
More information about the ppc-aix-port-dev
mailing list