[8u] RFR: JDK-8257192: Integrate AArch64 JIT port into 8u

Andrew Hughes gnu.andrew at redhat.com
Fri Nov 27 07:21:26 UTC 2020

Umbrella Bug: https://bugs.openjdk.java.net/browse/JDK-8257192
  jdk: https://cr.openjdk.java.net/~andrew/openjdk8/8257192/jdk/webrev.01/
  hotspot: https://cr.openjdk.java.net/~andrew/openjdk8/8257192/hotspot/webrev.01/

The aarch64 port was originally developed at Red Hat against OpenJDK 7
and 8, then later integrated into OpenJDK 9.

The 8u port has continued to be maintained in the aarch64-port/jdk8u
and aarch64-port/shenandoah-jdk8u trees since and has been used for
Red Hat's AArch64 binaries.  It was also merged into the IcedTea
HotSpot tree early in the development of OpenJDK 8u support, and
later fixes have been cherry-picked across from the aarch64-port
trees for each release.

The port has been stable for a long time and, although it is a large
patch, finally integrating it into 8u upstream should be low
risk. There are few changes to shared HotSpot code (mostly header
inclusion, the main one is memory barrier support for AArch64) and the
8u version of the port has had over half a decade of production use.

To create the patch, the HotSpot sources for 8u275 and IcedTea's
3.17.1 (based on 8u275) were compared and a few minor unrelated fixes
removed.  The new sources were also compared against the copies in
aarch64/shenandoah-jdk8u which showed only changes related to
the Shenandoah garbage collector as missing.

For the JDK changes, the few differences between aarch64/shenandoah-jdk8u's
jdk repository and 8u's were resolved.

The patch has fully bootstrapped on RHEL 7 + AArch64, applied on top
of jdk8u282-b03.

The bug list below was constructed by collating the AArch64 sections of
the IcedTea release notes. It doesn't include any changes that don't have
OpenJDK bugs, mainly from the initial development process.

Let's get this integrated for 8u282 and make AArch64 a first class member
of OpenJDK 8u.

Just before rampdown is the best time to do this, as it always gives us
the option to roll back to this point, without losing other 8u282 changes.
This is what we also did with TLSv1.3. Such a rollback should be unnecessary
though, as this port has been in production for a long time!

  - JDK-7009641: Don't fail VM when CodeCache is full
  - JDK-8073108: [AArch64] Use x86 and SPARC CPU instructions for GHASH acceleration
  - JDK-8130309: Need to bailout cleanly if creation of stubs fails when codecache is out of space (AArch64 changes)
  - JDK-8131779: AARCH64: add Montgomery multiply intrinsic
  - JDK-8132875: AArch64: Fix error introduced into AArch64 CodeCache by commit for 8130309
  - JDK-8135018: AARCH64: Missing memory barriers for CMS collector
  - JDK-8145320: Create unsafe_arraycopy and generic_arraycopy for AArch64
  - JDK-8148328: aarch64: redundant lsr instructions in stub code.
  - JDK-8148783: aarch64: SEGV running SpecJBB2013
  - JDK-8148948: aarch64: generate_copy_longs calls align() incorrectly
  - JDK-8149080: AArch64: Recognise disjoint array copy in stub code
  - JDK-8149365: aarch64: memory copy does not prefetch on backwards copy
  - JDK-8149907: aarch64: use load/store pair instructions in call_stub
  - JDK-8150038: aarch64: make use of CBZ and CBNZ when comparing narrow pointer with zero
  - JDK-8150045: arraycopy causes segfaults in SATB during garbage collection
  - JDK-8150082: aarch64: optimise small array copy
  - JDK-8150229: aarch64: pipeline class for several instructions is not set correctly
  - JDK-8150313: aarch64: optimise array copy using SIMD instructions
  - JDK-8150394: aarch64: add support for 8.1 LSE CAS instructions
  - JDK-8150652: Remove unused code in AArch64 back end
  - JDK-8151340: aarch64: prefetch the destination word for write prior to ldxr/stxr loops.
  - JDK-8151502: optimize pd_disjoint_words and pd_conjoint_words
  - JDK-8151775: aarch64: add support for 8.1 LSE atomic operations
  - JDK-8152537: aarch64: Make use of CBZ and CBNZ when comparing unsigned values with zero.
  - JDK-8152840: aarch64: improve _unsafe_arraycopy stub routine
  - JDK-8153172: aarch64: hotspot crashes after the 8.1 LSE patch is merged
  - JDK-8153713: aarch64: improve short array clearing using store pair
  - JDK-8153797: aarch64: Add Arrays.fill stub code
  - JDK-8154413: AArch64: Better byte behaviour
  - JDK-8154537: AArch64: some integer rotate instructions are never emitted
  - JDK-8154739: AArch64: TemplateTable::fast_xaccess loads in wrong mode
  - JDK-8155015: Aarch64: bad assert in spill generation code
  - JDK-8155100: AArch64: Relax alignment requirement for byte_map_base
  - JDK-8155612: Aarch64: vector nodes need to support misaligned offset
  - JDK-8155617: aarch64: ClearArray does not use DC ZVA
  - JDK-8155627: Enable SA on AArch64
  - JDK-8155653: TestVectorUnalignedOffset.java not pushed with 8155612
  - JDK-8156731: aarch64: java/util/Arrays/Correct.java fails due to _generic_arraycopy stub routine
  - JDK-8157841: aarch64: prefetch ignores cache line size
  - JDK-8157906: aarch64: some more integer rotate instructions are never emitted
  - JDK-8158913: aarch64: SEGV running Spark terasort
  - JDK-8159052: aarch64: optimise unaligned copies in pd_disjoint_words and pd_conjoint_words
  - JDK-8159063: aarch64: optimise unaligned array copy long
  - JDK-8160748: [AArch64] Inconsistent types for ideal_reg
  - JDK-8161072: AArch64: jtreg compiler/uncommontrap/TestDeoptOOM failure
  - JDK-8161190: AArch64: Fix overflow in immediate cmp instruction
  - JDK-8164113: AArch64: follow-up the fix for 8161598
  - JDK-8165673: AArch64: Fix JNI floating point argument handling
  - JDK-8167200: AArch64: Broken stack pointer adjustment in interpreter
  - JDK-8167421: AArch64: in one core system, fatal error: Illegal threadstate encountered
  - JDK-8167595: AArch64: SEGV in stub code cipherBlockChaining_decryptAESCrypt
  - JDK-8168699: Validate special case invocations [AArch64 support]
  - JDK-8168888: Port 8160591: Improve internal array handling to AArch64.
  - JDK-8170100: AArch64: Crash in C1-compiled code accessing References
  - JDK-8170188: jtreg test compiler/types/TestMeetIncompatibleInterfaceArrays.java causes JVM crash
  - JDK-8170873: PPC64/aarch64: Poor StrictMath performance due to non-optimized compilation
  - JDK-8171537: aarch64: compiler/c1/Test6849574.java generates guarantee failure in C1
  - JDK-8172881: AArch64: assertion failure: the int pressure is incorrect
  - JDK-8173472: AArch64: C1 comparisons with null only use 32-bit instructions
  - JDK-8176100: [AArch64] [REDO][REDO] G1 Needs pre barrier on dereference of weak JNI handles
  - JDK-8177661: Correct ad rule output register types from iRegX to iRegXNoSp
  - JDK-8179954: AArch64: C1 and C2 volatile accesses are not sequentially consistent
  - JDK-8182581: aarch64: fix for crash caused by earlyret of compiled method
  - JDK-8183925: [AArch64] Decouple crash protection from watcher thread
  - JDK-8186325: AArch64: jtreg test hotspot/test/gc/g1/TestJNIWeakG1/TestJNIWeakG1.java SEGV
  - JDK-8187224: aarch64: some inconsistency between aarch64_ad.m4 and aarch64.ad
  - JDK-8189170: [AArch64] Add option to disable stack overflow checking in primordial thread for use with JNI_CreateJavaJVM
  - JDK-8193133: Assertion failure because 0xDEADDEAD can be in-heap
  - JDK-8195685: AArch64 port of 8174962: Better interface invocations
  - JDK-8195859: AArch64: vtableStubs gtest fails after 8174962
  - JDK-8196136: AArch64: Correct register use in patch for JDK-8194686
  - JDK-8196221: AArch64: Mistake in committed patch for JDK-8195859
  - JDK-8199712: [AArch64] Flight Recorder
  - JDK-8203481: Incorrect constraint for unextended_sp in frame:safe_for_sender
  - JDK-8203699: java/lang/invoke/SpecialInterfaceCall fails with SIGILL on aarch64
  - JDK-8205421: AARCH64: StubCodeMark should be placed after alignment
  - JDK-8206163: AArch64: incorrect code generation for StoreCM
  - JDK-8207345: Trampoline generation code reads from uninitialized memory
  - JDK-8207838: AArch64: Float registers incorrectly restored in JNI call
  - JDK-8209413: AArch64: NPE in clhsdb jstack command
  - JDK-8209414: [AArch64] method handle invocation does not respect JVMTI interp_only mode
  - JDK-8209415: Fix JVMTI test failure HS202
  - JDK-8209420: Track membars for volatile accesses so they can be properly optimized
  - JDK-8209835: Aarch64: elide barriers on all volatile operations
  - JDK-8210425: [AArch64] sharedRuntimeTrig/sharedRuntimeTrans compiled without optimization
  - JDK-8211064: [AArch64] Interpreter and c1 don't correctly handle jboolean results in native calls
  - JDK-8211233: MemBarNode::trailing_membar() and MemBarNode::leading_membar() need to handle dying subgraphs better
  - JDK-8213134: AArch64: vector shift failed with MaxVectorSize=8
  - JDK-8213419: [AArch64] C2 may hang in MulLNode::Ideal()/MulINode::Ideal() with gcc 8.2.1
  - JDK-8214857: "bad trailing membar" assert failure at memnode.cpp:3220
  - JDK-8215951: AArch64: jtreg test vmTestbase/nsk/jvmti/PopFrame/popframe005 segfaults
  - JDK-8215961: jdk/jfr/event/os/TestCPUInformation.java fails on AArch64
  - JDK-8216350: AArch64: monitor unlock fast path not called
  - JDK-8216989: CardTableBarrierSetAssembler::gen_write_ref_array_post_barrier() does not check for zero length on AARCH64
  - JDK-8217368: AArch64: C2 recursive stack locking optimisation not triggered
  - JDK-8218185: aarch64: missing LoadStore barrier in TemplateTable::putfield_or_static
  - JDK-8219011: Implement MacroAssembler::warn method on AArch64
  - JDK-8219635: aarch64: missing LoadStore barrier in TemplateTable::fast_storefield
  - JDK-8221220: AArch64: Add StoreStore membar explicitly for Volatile Writes in TemplateTable
  - JDK-8221658: aarch64: add necessary predicate for ubfx patterns
  - JDK-8224671: AArch64: mauve System.arraycopy test failure
  - JDK-8224828: aarch64: rflags is not correct after safepoint poll
  - JDK-8224851: AArch64: fix warnings and errors with Clang and GCC 8.3
  - JDK-8224880: AArch64: java/javac error with AllocatePrefetchDistance
  - JDK-8228400: Remove built-in AArch64 simulator
  - JDK-8228406: Superfluous change in chaitin.hpp
  - JDK-8228593: Revert explicit JDK 7 support additions
  - JDK-8228716: Revert InstanceKlass::print_on debug additions
  - JDK-8228718: Revert incorrect backport of JDK-8129757 to 8-aarch64
  - JDK-8228725: AArch64: Purge method call format support
  - JDK-8228747: Revert "unused" attribute from test_arraycopy_func
  - JDK-8228767: Revert ResourceMark additions
  - JDK-8228770: Revert development hsdis changes
  - JDK-8229123: Revert build fixes for aarch64/zero
  - JDK-8229124: Revert disassembler.cpp changes
  - JDK-8229145: Revert TemplateTable::bytecode() visibility change
  - JDK-8233839: aarch64: missing memory barrier in NewObjectArrayStub and NewTypeArrayStub
  - JDK-8237512: AArch64: aarch64TestHook leaks a BufferBlob
  - JDK-8246482: Build failures with +JFR -PCH
  - JDK-8247979: aarch64: missing side effect of killing flags for clearArray_reg_reg
  - JDK-8248219: aarch64: missing memory barrier in fast_storefield and fast_accessfield

Andrew :)

Senior Free Java Software Engineer
OpenJDK Package Owner
Red Hat, Inc. (http://www.redhat.com)

PGP Key: ed25519/0xCFDA0F9B35964222 (hkp://keys.gnupg.net)
Fingerprint = 5132 579D D154 0ED2 3E04  C5A0 CFDA 0F9B 3596 4222

More information about the jdk8u-dev mailing list