[aarch64-port-dev ] Backports from jdk9 to aarch64-port/jdk8u

Stuart Monteith stuart.monteith at linaro.org
Mon Apr 3 17:50:05 UTC 2017


Hi,
   Thanks for that. There was one error - 8169901 does not apply and I
shouldn't have included it on the list. Those intrinsics are generated
by cas.m4, and aren't meaningful for jdk8u.
The patchset compiles cleanly against the current tip of
aarch64-port/jdk8u . A sniff test runs ok (a short SPECjbb2015 run) -
I'll kick off a JCStress/JTReg run too.

For clarity, the patchset is:

8173472: AArch64: C1 comparisons with null only use 32-bit instructions
         https://bugs.openjdk.java.net/browse/JDK-8173472
         http://hg.openjdk.java.net/jdk9/dev/hotspot/rev/b53b0251e250

8172881: AArch64: assertion failure: the int pressure is incorrect
         https://bugs.openjdk.java.net/browse/JDK-8172881
         http://hg.openjdk.java.net/jdk9/dev/hotspot/rev/bfa8e4b0d4e2


8170100: AArch64: Crash in C1-compiled code accessing References
         https://bugs.openjdk.java.net/browse/JDK-8170100
         http://hg.openjdk.java.net/jdk9/dev/hotspot/rev/52d18f20804b


BR,
    Stuart

# HG changeset patch
# User aph
# Date 1479749893 0
#      Mon Nov 21 17:38:13 2016 +0000
# Node ID 67dfa7ba19e65e69526b940a422345eafba44dec
# Parent  64d241247b0662f0f77e7eda2d1ea09a5b63a524
8170100: AArch64: Crash in C1-compiled code accessing References
Reviewed-by: roland

diff -r 64d241247b06 -r 67dfa7ba19e6
src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp
--- a/src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp Fri Oct 07
15:59:38 2016 +0200
+++ b/src/cpu/aarch64/vm/templateInterpreter_aarch64.cpp Mon Nov 21
17:38:13 2016 +0000
@@ -694,7 +694,7 @@
   //   and so we don't need to call the G1 pre-barrier. Thus we can use the
   //   regular method entry code to generate the NPE.
   //
-  // This code is based on generate_accessor_enty.
+  // This code is based on generate_accessor_entry.
   //
   // rmethod: Method*
   // r13: senderSP must preserve for slow path, set SP to it on fast path
@@ -712,11 +712,11 @@
     __ ldr(local_0, Address(esp, 0));
     __ cbz(local_0, slow_path);

-
     // Load the value of the referent field.
     const Address field_address(local_0, referent_offset);
     __ load_heap_oop(local_0, field_address);

+    __ mov(r19, r13);   // Move senderSP to a callee-saved register
     // Generate the G1 pre-barrier code to log the value of
     // the referent field in an SATB buffer.
     __ enter(); // g1_write may call runtime
@@ -728,7 +728,7 @@
                             true /* expand_call */);
     __ leave();
     // areturn
-    __ andr(sp, r13, -16);  // done with stack
+    __ andr(sp, r19, -16);  // done with stack
     __ ret(lr);

     // generate a vanilla interpreter entry as the slow path
# HG changeset patch
# User njian
# Date 1485074034 -28800
#      Sun Jan 22 16:33:54 2017 +0800
# Node ID ee08f247222da94981c3c8ff4e0ff0e713b168fd
# Parent  35600737c103f09e399697f6f3cf22fc4c862b7e
8172881: AArch64: assertion failure: the int pressure is incorrect
Summary: Change the dst register type of get_and_setI/L/N/P from any
register to non-special register.
Reviewed-by: aph
Contributed-by: yang.zhang at linaro.org

diff -r 35600737c103 -r ee08f247222d src/cpu/aarch64/vm/aarch64.ad
--- a/src/cpu/aarch64/vm/aarch64.ad Tue Dec 20 15:49:30 2016 -0500
+++ b/src/cpu/aarch64/vm/aarch64.ad Sun Jan 22 16:33:54 2017 +0800
@@ -9677,7 +9677,7 @@
 %}


-instruct get_and_setI(indirect mem, iRegINoSp newv, iRegI prev) %{
+instruct get_and_setI(indirect mem, iRegI newv, iRegINoSp prev) %{
   match(Set prev (GetAndSetI mem newv));
   format %{ "atomic_xchgw  $prev, $newv, [$mem]" %}
   ins_encode %{
@@ -9686,7 +9686,7 @@
   ins_pipe(pipe_serial);
 %}

-instruct get_and_setL(indirect mem, iRegLNoSp newv, iRegL prev) %{
+instruct get_and_setL(indirect mem, iRegL newv, iRegLNoSp prev) %{
   match(Set prev (GetAndSetL mem newv));
   format %{ "atomic_xchg  $prev, $newv, [$mem]" %}
   ins_encode %{
@@ -9695,7 +9695,7 @@
   ins_pipe(pipe_serial);
 %}

-instruct get_and_setN(indirect mem, iRegNNoSp newv, iRegI prev) %{
+instruct get_and_setN(indirect mem, iRegN newv, iRegINoSp prev) %{
   match(Set prev (GetAndSetN mem newv));
   format %{ "atomic_xchgw $prev, $newv, [$mem]" %}
   ins_encode %{
@@ -9704,7 +9704,7 @@
   ins_pipe(pipe_serial);
 %}

-instruct get_and_setP(indirect mem, iRegPNoSp newv, iRegP prev) %{
+instruct get_and_setP(indirect mem, iRegP newv, iRegPNoSp prev) %{
   match(Set prev (GetAndSetP mem newv));
   format %{ "atomic_xchg  $prev, $newv, [$mem]" %}
   ins_encode %{
# HG changeset patch
# User aph
# Date 1485510615 0
#      Fri Jan 27 09:50:15 2017 +0000
# Node ID a2c49092763aa13f0c64e6ad14e50052b6131190
# Parent  ee08f247222da94981c3c8ff4e0ff0e713b168fd
8173472: AArch64: C1 comparisons with null only use 32-bit instructions
Reviewed-by: roland

diff -r bfa8e4b0d4e2 -r b53b0251e250
src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp

diff -r ee08f247222d -r a2c49092763a
src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp
--- a/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp Sun Jan 22
16:33:54 2017 +0800
+++ b/src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp Fri Jan 27
09:50:15 2017 +0000
@@ -1982,12 +1982,17 @@
     }

     if (opr2->is_constant()) {
+      bool is_32bit = false; // width of register operand
       jlong imm;
+
       switch(opr2->type()) {
-      case T_LONG:
+      case T_INT:
+        imm = opr2->as_constant_ptr()->as_jint();
+        is_32bit = true;
+        break;
+     case T_LONG:
  imm = opr2->as_constant_ptr()->as_jlong();
  break;
-      case T_INT:
       case T_ADDRESS:
  imm = opr2->as_constant_ptr()->as_jint();
  break;
@@ -2001,14 +2006,14 @@
       }

       if (Assembler::operand_valid_for_add_sub_immediate(imm)) {
- if (type2aelembytes(opr1->type()) <= 4)
+ if (is_32bit)
   __ cmpw(reg1, imm);
  else
   __ cmp(reg1, imm);
  return;
       } else {
  __ mov(rscratch1, imm);
- if (type2aelembytes(opr1->type()) <= 4)
+ if (is_32bit)
   __ cmpw(reg1, rscratch1);
  else
   __ cmp(reg1, rscratch1);


More information about the aarch64-port-dev mailing list