!252 upgrade to jdk11.0.19-ga
From: @wanghao_hw Reviewed-by: @kuenking111 Signed-off-by: @kuenking111
This commit is contained in:
commit
a1ee7bface
@ -84,7 +84,7 @@ index 5fc5ee8..708e92c 100644
|
|||||||
};
|
};
|
||||||
@@ -5127,8 +5122,7 @@ void CMSRefProcTaskProxy::work(uint worker_id) {
|
@@ -5127,8 +5122,7 @@ void CMSRefProcTaskProxy::work(uint worker_id) {
|
||||||
CMSIsAliveClosure is_alive_closure(_span, _mark_bit_map);
|
CMSIsAliveClosure is_alive_closure(_span, _mark_bit_map);
|
||||||
_task.work(worker_id, is_alive_closure, par_keep_alive, par_drain_stack);
|
_task.work(worker_id, is_alive_closure, par_keep_alive, enqueue, par_drain_stack);
|
||||||
if (_task.marks_oops_alive()) {
|
if (_task.marks_oops_alive()) {
|
||||||
- do_work_steal(worker_id, &par_drain_stack, &par_keep_alive,
|
- do_work_steal(worker_id, &par_drain_stack, &par_keep_alive,
|
||||||
- _collector->hash_seed(worker_id));
|
- _collector->hash_seed(worker_id));
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -2764,9 +2764,9 @@ index 2f4b9faf0..10dd02f9f 100644
|
|||||||
static int _file_count;
|
static int _file_count;
|
||||||
networkStream *_stream;
|
networkStream *_stream;
|
||||||
xmlStream *_xml;
|
xmlStream *_xml;
|
||||||
@@ -97,10 +93,6 @@ class IdealGraphPrinter : public CHeapObj<mtCompiler> {
|
@@ -98,10 +94,6 @@ class IdealGraphPrinter : public CHeapObj<mtCompiler> {
|
||||||
bool _traverse_outs;
|
|
||||||
Compile *C;
|
Compile *C;
|
||||||
|
double _max_freq;
|
||||||
|
|
||||||
- static void pre_node(Node* node, void *env);
|
- static void pre_node(Node* node, void *env);
|
||||||
- static void post_node(Node* node, void *env);
|
- static void post_node(Node* node, void *env);
|
||||||
|
|||||||
@ -1,27 +0,0 @@
|
|||||||
From 96ac09c507a663b853235c29a607aca2c1edfc10 Mon Sep 17 00:00:00 2001
|
|
||||||
Date: Mon, 2 Dec 2019 17:42:17 +0000
|
|
||||||
Subject: [PATCH] 8225648: [TESTBUG]java/lang/annotation/loaderLeak/Main.java
|
|
||||||
fails with -Xcomp
|
|
||||||
|
|
||||||
Summary: <loaderLeak>: annotations cause memory leak
|
|
||||||
LLT: NA
|
|
||||||
Bug url: https://bugs.openjdk.java.net/browse/JDK-8225648
|
|
||||||
---
|
|
||||||
test/jdk/java/lang/annotation/loaderLeak/Main.java | 1 +
|
|
||||||
1 file changed, 1 insertion(+)
|
|
||||||
|
|
||||||
diff --git a/test/jdk/java/lang/annotation/loaderLeak/Main.java b/test/jdk/java/lang/annotation/loaderLeak/Main.java
|
|
||||||
index 58bd63b..aedbc2e 100644
|
|
||||||
--- a/test/jdk/java/lang/annotation/loaderLeak/Main.java
|
|
||||||
+++ b/test/jdk/java/lang/annotation/loaderLeak/Main.java
|
|
||||||
@@ -54,6 +54,7 @@ public class Main {
|
|
||||||
System.gc();
|
|
||||||
System.gc();
|
|
||||||
if (c.get() == null) throw new AssertionError();
|
|
||||||
+ Reference.reachabilityFence(loader);
|
|
||||||
System.gc();
|
|
||||||
System.gc();
|
|
||||||
loader = null;
|
|
||||||
--
|
|
||||||
2.12.3
|
|
||||||
|
|
||||||
@ -24,17 +24,17 @@ index b64919a62..64985e498 100644
|
|||||||
reg_def R11 ( SOC, SOC, Op_RegI, 11, r11->as_VMReg() );
|
reg_def R11 ( SOC, SOC, Op_RegI, 11, r11->as_VMReg() );
|
||||||
@@ -140,7 +144,7 @@ reg_def R31 ( NS, NS, Op_RegI, 31, r31_sp->as_VMReg() ); // sp
|
@@ -140,7 +144,7 @@ reg_def R31 ( NS, NS, Op_RegI, 31, r31_sp->as_VMReg() ); // sp
|
||||||
reg_def R31_H ( NS, NS, Op_RegI, 31, r31_sp->as_VMReg()->next());
|
reg_def R31_H ( NS, NS, Op_RegI, 31, r31_sp->as_VMReg()->next());
|
||||||
|
|
||||||
// ----------------------------
|
// ----------------------------
|
||||||
-// Float/Double Registers
|
-// Float/Double Registers
|
||||||
+// Float/Double/Vector Registers
|
+// Float/Double/Vector Registers
|
||||||
// ----------------------------
|
// ----------------------------
|
||||||
|
|
||||||
// Double Registers
|
// Double Registers
|
||||||
@@ -161,165 +165,317 @@ reg_def R31_H ( NS, NS, Op_RegI, 31, r31_sp->as_VMReg()->next());
|
@@ -161,165 +165,317 @@ reg_def R31_H ( NS, NS, Op_RegI, 31, r31_sp->as_VMReg()->next());
|
||||||
// the platform ABI treats v8-v15 as callee save). float registers
|
// the platform ABI treats v8-v15 as callee save). float registers
|
||||||
// v16-v31 are SOC as per the platform spec
|
// v16-v31 are SOC as per the platform spec
|
||||||
|
|
||||||
- reg_def V0 ( SOC, SOC, Op_RegF, 0, v0->as_VMReg() );
|
- reg_def V0 ( SOC, SOC, Op_RegF, 0, v0->as_VMReg() );
|
||||||
- reg_def V0_H ( SOC, SOC, Op_RegF, 0, v0->as_VMReg()->next() );
|
- reg_def V0_H ( SOC, SOC, Op_RegF, 0, v0->as_VMReg()->next() );
|
||||||
- reg_def V0_J ( SOC, SOC, Op_RegF, 0, v0->as_VMReg()->next(2) );
|
- reg_def V0_J ( SOC, SOC, Op_RegF, 0, v0->as_VMReg()->next(2) );
|
||||||
@ -505,7 +505,7 @@ index b64919a62..64985e498 100644
|
|||||||
+reg_def P6 (SOC, SOC, Op_RegVMask, 6, p6->as_VMReg());
|
+reg_def P6 (SOC, SOC, Op_RegVMask, 6, p6->as_VMReg());
|
||||||
+reg_def P7 (SOC, SOC, Op_RegVMask, 7, p7->as_VMReg());
|
+reg_def P7 (SOC, SOC, Op_RegVMask, 7, p7->as_VMReg());
|
||||||
+
|
+
|
||||||
|
|
||||||
// ----------------------------
|
// ----------------------------
|
||||||
// Special Registers
|
// Special Registers
|
||||||
@@ -381,50 +536,64 @@ alloc_class chunk0(
|
@@ -381,50 +536,64 @@ alloc_class chunk0(
|
||||||
@ -515,9 +515,9 @@ index b64919a62..64985e498 100644
|
|||||||
+ R8, R8_H, // rscratch1
|
+ R8, R8_H, // rscratch1
|
||||||
+ R9, R9_H, // rscratch2
|
+ R9, R9_H, // rscratch2
|
||||||
);
|
);
|
||||||
|
|
||||||
alloc_class chunk1(
|
alloc_class chunk1(
|
||||||
|
|
||||||
// no save
|
// no save
|
||||||
- V16, V16_H, V16_J, V16_K,
|
- V16, V16_H, V16_J, V16_K,
|
||||||
- V17, V17_H, V17_J, V17_K,
|
- V17, V17_H, V17_J, V17_K,
|
||||||
@ -551,7 +551,7 @@ index b64919a62..64985e498 100644
|
|||||||
+ V29, V29_H, V29_J, V29_K, V29_L, V29_M, V29_N, V29_O,
|
+ V29, V29_H, V29_J, V29_K, V29_L, V29_M, V29_N, V29_O,
|
||||||
+ V30, V30_H, V30_J, V30_K, V30_L, V30_M, V30_N, V30_O,
|
+ V30, V30_H, V30_J, V30_K, V30_L, V30_M, V30_N, V30_O,
|
||||||
+ V31, V31_H, V31_J, V31_K, V31_L, V31_M, V31_N, V31_O,
|
+ V31, V31_H, V31_J, V31_K, V31_L, V31_M, V31_N, V31_O,
|
||||||
|
|
||||||
// arg registers
|
// arg registers
|
||||||
- V0, V0_H, V0_J, V0_K,
|
- V0, V0_H, V0_J, V0_K,
|
||||||
- V1, V1_H, V1_J, V1_K,
|
- V1, V1_H, V1_J, V1_K,
|
||||||
@ -569,7 +569,7 @@ index b64919a62..64985e498 100644
|
|||||||
+ V5, V5_H, V5_J, V5_K, V5_L, V5_M, V5_N, V5_O,
|
+ V5, V5_H, V5_J, V5_K, V5_L, V5_M, V5_N, V5_O,
|
||||||
+ V6, V6_H, V6_J, V6_K, V6_L, V6_M, V6_N, V6_O,
|
+ V6, V6_H, V6_J, V6_K, V6_L, V6_M, V6_N, V6_O,
|
||||||
+ V7, V7_H, V7_J, V7_K, V7_L, V7_M, V7_N, V7_O,
|
+ V7, V7_H, V7_J, V7_K, V7_L, V7_M, V7_N, V7_O,
|
||||||
|
|
||||||
// non-volatiles
|
// non-volatiles
|
||||||
- V8, V8_H, V8_J, V8_K,
|
- V8, V8_H, V8_J, V8_K,
|
||||||
- V9, V9_H, V9_J, V9_K,
|
- V9, V9_H, V9_J, V9_K,
|
||||||
@ -600,16 +600,16 @@ index b64919a62..64985e498 100644
|
|||||||
+ P7,
|
+ P7,
|
||||||
+ // Only use P0~P7 here for performance
|
+ // Only use P0~P7 here for performance
|
||||||
);
|
);
|
||||||
|
|
||||||
-alloc_class chunk2(RFLAGS);
|
-alloc_class chunk2(RFLAGS);
|
||||||
+alloc_class chunk3(RFLAGS);
|
+alloc_class chunk3(RFLAGS);
|
||||||
|
|
||||||
//----------Architecture Description Register Classes--------------------------
|
//----------Architecture Description Register Classes--------------------------
|
||||||
// Several register classes are automatically defined based upon information in
|
// Several register classes are automatically defined based upon information in
|
||||||
@@ -865,6 +1034,42 @@ reg_class double_reg(
|
@@ -865,6 +1034,42 @@ reg_class double_reg(
|
||||||
V31, V31_H
|
V31, V31_H
|
||||||
);
|
);
|
||||||
|
|
||||||
+// Class for all SVE vector registers.
|
+// Class for all SVE vector registers.
|
||||||
+reg_class vectora_reg (
|
+reg_class vectora_reg (
|
||||||
+ V0, V0_H, V0_J, V0_K, V0_L, V0_M, V0_N, V0_O,
|
+ V0, V0_H, V0_J, V0_K, V0_L, V0_M, V0_N, V0_O,
|
||||||
@ -652,7 +652,7 @@ index b64919a62..64985e498 100644
|
|||||||
@@ -1097,6 +1302,31 @@ reg_class v31_reg(
|
@@ -1097,6 +1302,31 @@ reg_class v31_reg(
|
||||||
V31, V31_H
|
V31, V31_H
|
||||||
);
|
);
|
||||||
|
|
||||||
+// Class for all SVE predicate registers.
|
+// Class for all SVE predicate registers.
|
||||||
+reg_class pr_reg (
|
+reg_class pr_reg (
|
||||||
+ P0,
|
+ P0,
|
||||||
@ -680,30 +680,30 @@ index b64919a62..64985e498 100644
|
|||||||
+
|
+
|
||||||
// Singleton class for condition codes
|
// Singleton class for condition codes
|
||||||
reg_class int_flags(RFLAGS);
|
reg_class int_flags(RFLAGS);
|
||||||
|
|
||||||
@@ -1862,7 +2092,7 @@ int MachEpilogNode::safepoint_offset() const {
|
@@ -1862,7 +2092,7 @@ int MachEpilogNode::safepoint_offset() const {
|
||||||
|
|
||||||
// Figure out which register class each belongs in: rc_int, rc_float or
|
// Figure out which register class each belongs in: rc_int, rc_float or
|
||||||
// rc_stack.
|
// rc_stack.
|
||||||
-enum RC { rc_bad, rc_int, rc_float, rc_stack };
|
-enum RC { rc_bad, rc_int, rc_float, rc_stack };
|
||||||
+enum RC { rc_bad, rc_int, rc_float, rc_predicate, rc_stack };
|
+enum RC { rc_bad, rc_int, rc_float, rc_predicate, rc_stack };
|
||||||
|
|
||||||
static enum RC rc_class(OptoReg::Name reg) {
|
static enum RC rc_class(OptoReg::Name reg) {
|
||||||
|
|
||||||
@@ -1870,20 +2100,25 @@ static enum RC rc_class(OptoReg::Name reg) {
|
@@ -1870,20 +2100,25 @@ static enum RC rc_class(OptoReg::Name reg) {
|
||||||
return rc_bad;
|
return rc_bad;
|
||||||
}
|
}
|
||||||
|
|
||||||
- // we have 30 int registers * 2 halves
|
- // we have 30 int registers * 2 halves
|
||||||
- // (rscratch1 and rscratch2 are omitted)
|
- // (rscratch1 and rscratch2 are omitted)
|
||||||
- int slots_of_int_registers = RegisterImpl::max_slots_per_register * (RegisterImpl::number_of_registers - 2);
|
- int slots_of_int_registers = RegisterImpl::max_slots_per_register * (RegisterImpl::number_of_registers - 2);
|
||||||
+ // we have 32 int registers * 2 halves
|
+ // we have 32 int registers * 2 halves
|
||||||
+ int slots_of_int_registers = RegisterImpl::max_slots_per_register * RegisterImpl::number_of_registers;
|
+ int slots_of_int_registers = RegisterImpl::max_slots_per_register * RegisterImpl::number_of_registers;
|
||||||
|
|
||||||
if (reg < slots_of_int_registers) {
|
if (reg < slots_of_int_registers) {
|
||||||
return rc_int;
|
return rc_int;
|
||||||
}
|
}
|
||||||
|
|
||||||
- // we have 32 float register * 4 halves
|
- // we have 32 float register * 4 halves
|
||||||
- if (reg < slots_of_int_registers + FloatRegisterImpl::max_slots_per_register * FloatRegisterImpl::number_of_registers) {
|
- if (reg < slots_of_int_registers + FloatRegisterImpl::max_slots_per_register * FloatRegisterImpl::number_of_registers) {
|
||||||
+ // we have 32 float register * 8 halves
|
+ // we have 32 float register * 8 halves
|
||||||
@ -711,7 +711,7 @@ index b64919a62..64985e498 100644
|
|||||||
+ if (reg < slots_of_int_registers + slots_of_float_registers) {
|
+ if (reg < slots_of_int_registers + slots_of_float_registers) {
|
||||||
return rc_float;
|
return rc_float;
|
||||||
}
|
}
|
||||||
|
|
||||||
- // Between float regs & stack is the flags regs.
|
- // Between float regs & stack is the flags regs.
|
||||||
+ int slots_of_predicate_registers = PRegisterImpl::max_slots_per_register * PRegisterImpl::number_of_registers;
|
+ int slots_of_predicate_registers = PRegisterImpl::max_slots_per_register * PRegisterImpl::number_of_registers;
|
||||||
+ if (reg < slots_of_int_registers + slots_of_float_registers + slots_of_predicate_registers) {
|
+ if (reg < slots_of_int_registers + slots_of_float_registers + slots_of_predicate_registers) {
|
||||||
@ -720,7 +720,7 @@ index b64919a62..64985e498 100644
|
|||||||
+
|
+
|
||||||
+ // Between predicate regs & stack is the flags.
|
+ // Between predicate regs & stack is the flags.
|
||||||
assert(OptoReg::is_stack(reg), "blow up if spilling flags");
|
assert(OptoReg::is_stack(reg), "blow up if spilling flags");
|
||||||
|
|
||||||
return rc_stack;
|
return rc_stack;
|
||||||
@@ -1941,12 +2176,12 @@ uint MachSpillCopyNode::implementation(CodeBuffer *cbuf, PhaseRegAlloc *ra_, boo
|
@@ -1941,12 +2176,12 @@ uint MachSpillCopyNode::implementation(CodeBuffer *cbuf, PhaseRegAlloc *ra_, boo
|
||||||
as_FloatRegister(Matcher::_regEncode[src_lo]));
|
as_FloatRegister(Matcher::_regEncode[src_lo]));
|
||||||
@ -765,18 +765,18 @@ index b64919a62..64985e498 100644
|
|||||||
+ st->print("\t# spill size = %d", is64 ? 64 : 32);
|
+ st->print("\t# spill size = %d", is64 ? 64 : 32);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2204,7 +2454,7 @@ const bool Matcher::match_rule_supported_vector(int opcode, int vlen) {
|
@@ -2204,7 +2454,7 @@ const bool Matcher::match_rule_supported_vector(int opcode, int vlen) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool Matcher::has_predicated_vectors(void) {
|
const bool Matcher::has_predicated_vectors(void) {
|
||||||
- return false;
|
- return false;
|
||||||
+ return UseSVE > 0;
|
+ return UseSVE > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int Matcher::float_pressure(int default_pressure_threshold) {
|
const int Matcher::float_pressure(int default_pressure_threshold) {
|
||||||
@@ -2240,7 +2490,8 @@ const bool Matcher::convL2FSupported(void) {
|
@@ -2240,7 +2490,8 @@ const bool Matcher::convL2FSupported(void) {
|
||||||
|
|
||||||
// Vector width in bytes.
|
// Vector width in bytes.
|
||||||
const int Matcher::vector_width_in_bytes(BasicType bt) {
|
const int Matcher::vector_width_in_bytes(BasicType bt) {
|
||||||
- int size = MIN2(16,(int)MaxVectorSize);
|
- int size = MIN2(16,(int)MaxVectorSize);
|
||||||
@ -795,7 +795,7 @@ index b64919a62..64985e498 100644
|
|||||||
+ // Currently vector length less than SVE vector register size is not supported.
|
+ // Currently vector length less than SVE vector register size is not supported.
|
||||||
+ return max_size;
|
+ return max_size;
|
||||||
+ } else {
|
+ } else {
|
||||||
+ // For the moment limit the vector size to 8 bytes with NEON.
|
+ // For the moment limit the vector size to 8 bytes with NEON.
|
||||||
int size = 8 / type2aelembytes(bt);
|
int size = 8 / type2aelembytes(bt);
|
||||||
if (size < 2) size = 2;
|
if (size < 2) size = 2;
|
||||||
return size;
|
return size;
|
||||||
@ -810,7 +810,7 @@ index b64919a62..64985e498 100644
|
|||||||
+const int Matcher::scalable_vector_reg_size(const BasicType bt) {
|
+const int Matcher::scalable_vector_reg_size(const BasicType bt) {
|
||||||
+ return Matcher::max_vector_size(bt);
|
+ return Matcher::max_vector_size(bt);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Vector ideal reg.
|
// Vector ideal reg.
|
||||||
const uint Matcher::vector_ideal_reg(int len) {
|
const uint Matcher::vector_ideal_reg(int len) {
|
||||||
+ if (UseSVE > 0 && 16 <= len && len <= 256) {
|
+ if (UseSVE > 0 && 16 <= len && len <= 256) {
|
||||||
@ -821,7 +821,7 @@ index b64919a62..64985e498 100644
|
|||||||
case 16: return Op_VecX;
|
case 16: return Op_VecX;
|
||||||
@@ -2270,6 +2539,9 @@ const uint Matcher::vector_ideal_reg(int len) {
|
@@ -2270,6 +2539,9 @@ const uint Matcher::vector_ideal_reg(int len) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const uint Matcher::vector_shift_count_ideal_reg(int size) {
|
const uint Matcher::vector_shift_count_ideal_reg(int size) {
|
||||||
+ if (UseSVE > 0 && 16 <= size && size <= 256) {
|
+ if (UseSVE > 0 && 16 <= size && size <= 256) {
|
||||||
+ return Op_VecA;
|
+ return Op_VecA;
|
||||||
@ -832,7 +832,7 @@ index b64919a62..64985e498 100644
|
|||||||
@@ -4851,6 +5123,18 @@ operand vRegD()
|
@@ -4851,6 +5123,18 @@ operand vRegD()
|
||||||
interface(REG_INTER);
|
interface(REG_INTER);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
+// Generic vector class. This will be used for
|
+// Generic vector class. This will be used for
|
||||||
+// all vector operands, including NEON and SVE,
|
+// all vector operands, including NEON and SVE,
|
||||||
+// but currently only used for SVE VecA.
|
+// but currently only used for SVE VecA.
|
||||||
@ -851,7 +851,7 @@ index b64919a62..64985e498 100644
|
|||||||
@@ -5159,6 +5443,15 @@ operand vRegD_V31()
|
@@ -5159,6 +5443,15 @@ operand vRegD_V31()
|
||||||
interface(REG_INTER);
|
interface(REG_INTER);
|
||||||
%}
|
%}
|
||||||
|
|
||||||
+operand pRegGov()
|
+operand pRegGov()
|
||||||
+%{
|
+%{
|
||||||
+ constraint(ALLOC_IN_RC(gov_pr));
|
+ constraint(ALLOC_IN_RC(gov_pr));
|
||||||
@ -862,7 +862,7 @@ index b64919a62..64985e498 100644
|
|||||||
+%}
|
+%}
|
||||||
+
|
+
|
||||||
// Flags register, used as output of signed compare instructions
|
// Flags register, used as output of signed compare instructions
|
||||||
|
|
||||||
// note that on AArch64 we also use this register as the output for
|
// note that on AArch64 we also use this register as the output for
|
||||||
diff --git a/src/hotspot/cpu/aarch64/assembler_aarch64.hpp b/src/hotspot/cpu/aarch64/assembler_aarch64.hpp
|
diff --git a/src/hotspot/cpu/aarch64/assembler_aarch64.hpp b/src/hotspot/cpu/aarch64/assembler_aarch64.hpp
|
||||||
index 228b82660..6f4e75ff4 100644
|
index 228b82660..6f4e75ff4 100644
|
||||||
@ -871,7 +871,7 @@ index 228b82660..6f4e75ff4 100644
|
|||||||
@@ -273,6 +273,14 @@ public:
|
@@ -273,6 +273,14 @@ public:
|
||||||
f(r->encoding_nocheck(), lsb + 4, lsb);
|
f(r->encoding_nocheck(), lsb + 4, lsb);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ void prf(PRegister r, int lsb) {
|
+ void prf(PRegister r, int lsb) {
|
||||||
+ f(r->encoding_nocheck(), lsb + 3, lsb);
|
+ f(r->encoding_nocheck(), lsb + 3, lsb);
|
||||||
+ }
|
+ }
|
||||||
@ -912,7 +912,7 @@ index 36cbe3fee..3db8e8337 100644
|
|||||||
@@ -33,6 +33,9 @@ const int ConcreteRegisterImpl::max_fpr
|
@@ -33,6 +33,9 @@ const int ConcreteRegisterImpl::max_fpr
|
||||||
= ConcreteRegisterImpl::max_gpr +
|
= ConcreteRegisterImpl::max_gpr +
|
||||||
FloatRegisterImpl::number_of_registers * FloatRegisterImpl::max_slots_per_register;
|
FloatRegisterImpl::number_of_registers * FloatRegisterImpl::max_slots_per_register;
|
||||||
|
|
||||||
+const int ConcreteRegisterImpl::max_pr
|
+const int ConcreteRegisterImpl::max_pr
|
||||||
+ = ConcreteRegisterImpl::max_fpr + PRegisterImpl::number_of_registers;
|
+ = ConcreteRegisterImpl::max_fpr + PRegisterImpl::number_of_registers;
|
||||||
+
|
+
|
||||||
@ -945,12 +945,12 @@ index 20f549188..e7a9cee92 100644
|
|||||||
+ slots_per_neon_register = 4,
|
+ slots_per_neon_register = 4,
|
||||||
+ extra_save_slots_per_neon_register = slots_per_neon_register - save_slots_per_register
|
+ extra_save_slots_per_neon_register = slots_per_neon_register - save_slots_per_register
|
||||||
};
|
};
|
||||||
|
|
||||||
// construction
|
// construction
|
||||||
@@ -198,6 +199,79 @@ CONSTANT_REGISTER_DECLARATION(FloatRegister, v29 , (29));
|
@@ -198,6 +199,79 @@ CONSTANT_REGISTER_DECLARATION(FloatRegister, v29 , (29));
|
||||||
CONSTANT_REGISTER_DECLARATION(FloatRegister, v30 , (30));
|
CONSTANT_REGISTER_DECLARATION(FloatRegister, v30 , (30));
|
||||||
CONSTANT_REGISTER_DECLARATION(FloatRegister, v31 , (31));
|
CONSTANT_REGISTER_DECLARATION(FloatRegister, v31 , (31));
|
||||||
|
|
||||||
+// SVE vector registers, shared with the SIMD&FP v0-v31. Vn maps to Zn[127:0].
|
+// SVE vector registers, shared with the SIMD&FP v0-v31. Vn maps to Zn[127:0].
|
||||||
+CONSTANT_REGISTER_DECLARATION(FloatRegister, z0 , ( 0));
|
+CONSTANT_REGISTER_DECLARATION(FloatRegister, z0 , ( 0));
|
||||||
+CONSTANT_REGISTER_DECLARATION(FloatRegister, z1 , ( 1));
|
+CONSTANT_REGISTER_DECLARATION(FloatRegister, z1 , ( 1));
|
||||||
@ -1028,19 +1028,19 @@ index 20f549188..e7a9cee92 100644
|
|||||||
// Define a class that exports it.
|
// Define a class that exports it.
|
||||||
class ConcreteRegisterImpl : public AbstractRegisterImpl {
|
class ConcreteRegisterImpl : public AbstractRegisterImpl {
|
||||||
@@ -210,12 +284,14 @@ class ConcreteRegisterImpl : public AbstractRegisterImpl {
|
@@ -210,12 +284,14 @@ class ConcreteRegisterImpl : public AbstractRegisterImpl {
|
||||||
|
|
||||||
number_of_registers = (RegisterImpl::max_slots_per_register * RegisterImpl::number_of_registers +
|
number_of_registers = (RegisterImpl::max_slots_per_register * RegisterImpl::number_of_registers +
|
||||||
FloatRegisterImpl::max_slots_per_register * FloatRegisterImpl::number_of_registers +
|
FloatRegisterImpl::max_slots_per_register * FloatRegisterImpl::number_of_registers +
|
||||||
+ PRegisterImpl::max_slots_per_register * PRegisterImpl::number_of_registers +
|
+ PRegisterImpl::max_slots_per_register * PRegisterImpl::number_of_registers +
|
||||||
1) // flags
|
1) // flags
|
||||||
};
|
};
|
||||||
|
|
||||||
// added to make it compile
|
// added to make it compile
|
||||||
static const int max_gpr;
|
static const int max_gpr;
|
||||||
static const int max_fpr;
|
static const int max_fpr;
|
||||||
+ static const int max_pr;
|
+ static const int max_pr;
|
||||||
};
|
};
|
||||||
|
|
||||||
class RegSetIterator;
|
class RegSetIterator;
|
||||||
diff --git a/src/hotspot/cpu/aarch64/register_definitions_aarch64.cpp b/src/hotspot/cpu/aarch64/register_definitions_aarch64.cpp
|
diff --git a/src/hotspot/cpu/aarch64/register_definitions_aarch64.cpp b/src/hotspot/cpu/aarch64/register_definitions_aarch64.cpp
|
||||||
index c18109087..15131ed32 100644
|
index c18109087..15131ed32 100644
|
||||||
@ -1055,7 +1055,7 @@ index c18109087..15131ed32 100644
|
|||||||
*
|
*
|
||||||
@@ -154,3 +154,45 @@ REGISTER_DEFINITION(Register, rthread);
|
@@ -154,3 +154,45 @@ REGISTER_DEFINITION(Register, rthread);
|
||||||
REGISTER_DEFINITION(Register, rheapbase);
|
REGISTER_DEFINITION(Register, rheapbase);
|
||||||
|
|
||||||
REGISTER_DEFINITION(Register, r31_sp);
|
REGISTER_DEFINITION(Register, r31_sp);
|
||||||
+
|
+
|
||||||
+REGISTER_DEFINITION(FloatRegister, z0);
|
+REGISTER_DEFINITION(FloatRegister, z0);
|
||||||
@ -1105,7 +1105,7 @@ index dbad48582..3bf7284a7 100644
|
|||||||
+++ b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp
|
+++ b/src/hotspot/cpu/aarch64/sharedRuntime_aarch64.cpp
|
||||||
@@ -111,11 +111,28 @@ class RegisterSaver {
|
@@ -111,11 +111,28 @@ class RegisterSaver {
|
||||||
};
|
};
|
||||||
|
|
||||||
OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_frame_words, int* total_frame_words, bool save_vectors) {
|
OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_frame_words, int* total_frame_words, bool save_vectors) {
|
||||||
+ bool use_sve = false;
|
+ bool use_sve = false;
|
||||||
+ int sve_vector_size_in_bytes = 0;
|
+ int sve_vector_size_in_bytes = 0;
|
||||||
@ -1135,7 +1135,7 @@ index dbad48582..3bf7284a7 100644
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@@ -158,8 +175,13 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
|
@@ -158,8 +175,13 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
|
||||||
|
|
||||||
for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
|
for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
|
||||||
FloatRegister r = as_FloatRegister(i);
|
FloatRegister r = as_FloatRegister(i);
|
||||||
- int sp_offset = save_vectors ? (FloatRegisterImpl::max_slots_per_register * i) :
|
- int sp_offset = save_vectors ? (FloatRegisterImpl::max_slots_per_register * i) :
|
||||||
@ -1166,7 +1166,7 @@ index c5d4383b4..dde7a7a91 100644
|
|||||||
@@ -36,4 +36,8 @@ inline VMReg FloatRegisterImpl::as_VMReg() {
|
@@ -36,4 +36,8 @@ inline VMReg FloatRegisterImpl::as_VMReg() {
|
||||||
ConcreteRegisterImpl::max_gpr);
|
ConcreteRegisterImpl::max_gpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
+inline VMReg PRegisterImpl::as_VMReg() {
|
+inline VMReg PRegisterImpl::as_VMReg() {
|
||||||
+ return VMRegImpl::as_VMReg(encoding() + ConcreteRegisterImpl::max_fpr);
|
+ return VMRegImpl::as_VMReg(encoding() + ConcreteRegisterImpl::max_fpr);
|
||||||
+}
|
+}
|
||||||
@ -1179,7 +1179,7 @@ index 4a32af54e..0ef4d7f3e 100644
|
|||||||
@@ -1121,6 +1121,14 @@ const int Matcher::vector_width_in_bytes(BasicType bt) {
|
@@ -1121,6 +1121,14 @@ const int Matcher::vector_width_in_bytes(BasicType bt) {
|
||||||
return MaxVectorSize;
|
return MaxVectorSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
+const bool Matcher::supports_scalable_vector() {
|
+const bool Matcher::supports_scalable_vector() {
|
||||||
+ return false;
|
+ return false;
|
||||||
+}
|
+}
|
||||||
@ -1198,7 +1198,7 @@ index 36cbada53..7ee16a975 100644
|
|||||||
@@ -2310,6 +2310,14 @@ const int Matcher::min_vector_size(const BasicType bt) {
|
@@ -2310,6 +2310,14 @@ const int Matcher::min_vector_size(const BasicType bt) {
|
||||||
return max_vector_size(bt); // Same as max.
|
return max_vector_size(bt); // Same as max.
|
||||||
}
|
}
|
||||||
|
|
||||||
+const bool Matcher::supports_scalable_vector() {
|
+const bool Matcher::supports_scalable_vector() {
|
||||||
+ return false;
|
+ return false;
|
||||||
+}
|
+}
|
||||||
@ -1217,7 +1217,7 @@ index 96c231b0a..ea09aaafc 100644
|
|||||||
@@ -1573,6 +1573,14 @@ const int Matcher::min_vector_size(const BasicType bt) {
|
@@ -1573,6 +1573,14 @@ const int Matcher::min_vector_size(const BasicType bt) {
|
||||||
return max_vector_size(bt); // Same as max.
|
return max_vector_size(bt); // Same as max.
|
||||||
}
|
}
|
||||||
|
|
||||||
+const bool Matcher::supports_scalable_vector() {
|
+const bool Matcher::supports_scalable_vector() {
|
||||||
+ return false;
|
+ return false;
|
||||||
+}
|
+}
|
||||||
@ -1243,7 +1243,7 @@ index abdd7483d..76dd6addd 100644
|
|||||||
@@ -1485,6 +1485,14 @@ const int Matcher::min_vector_size(const BasicType bt) {
|
@@ -1485,6 +1485,14 @@ const int Matcher::min_vector_size(const BasicType bt) {
|
||||||
return MIN2(size,max_size);
|
return MIN2(size,max_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
+const bool Matcher::supports_scalable_vector() {
|
+const bool Matcher::supports_scalable_vector() {
|
||||||
+ return false;
|
+ return false;
|
||||||
+}
|
+}
|
||||||
@ -1290,7 +1290,7 @@ index ba61aa4c0..9e41b2dc6 100644
|
|||||||
@@ -939,6 +940,10 @@ const char *ArchDesc::getIdealType(const char *idealOp) {
|
@@ -939,6 +940,10 @@ const char *ArchDesc::getIdealType(const char *idealOp) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
+ if (strncmp(idealOp, "RegVMask", 8) == 0) {
|
+ if (strncmp(idealOp, "RegVMask", 8) == 0) {
|
||||||
+ return "Type::BOTTOM";
|
+ return "Type::BOTTOM";
|
||||||
+ }
|
+ }
|
||||||
@ -1360,7 +1360,7 @@ index 914dc43f6..710af9de8 100644
|
|||||||
+ }
|
+ }
|
||||||
assert(n_type->isa_vect() == NULL || lrg._is_vector || ireg == Op_RegD || ireg == Op_RegL,
|
assert(n_type->isa_vect() == NULL || lrg._is_vector || ireg == Op_RegD || ireg == Op_RegL,
|
||||||
"vector must be in vector registers");
|
"vector must be in vector registers");
|
||||||
|
|
||||||
@@ -912,6 +932,13 @@ void PhaseChaitin::gather_lrg_masks( bool after_aggressive ) {
|
@@ -912,6 +932,13 @@ void PhaseChaitin::gather_lrg_masks( bool after_aggressive ) {
|
||||||
lrg.set_reg_pressure(1);
|
lrg.set_reg_pressure(1);
|
||||||
#endif
|
#endif
|
||||||
@ -1378,7 +1378,7 @@ index 914dc43f6..710af9de8 100644
|
|||||||
@@ -1358,6 +1385,46 @@ static bool is_legal_reg(LRG &lrg, OptoReg::Name reg, int chunk) {
|
@@ -1358,6 +1385,46 @@ static bool is_legal_reg(LRG &lrg, OptoReg::Name reg, int chunk) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
+static OptoReg::Name find_first_set(LRG &lrg, RegMask mask, int chunk) {
|
+static OptoReg::Name find_first_set(LRG &lrg, RegMask mask, int chunk) {
|
||||||
+ int num_regs = lrg.num_regs();
|
+ int num_regs = lrg.num_regs();
|
||||||
+ OptoReg::Name assigned = mask.find_first_set(lrg, num_regs);
|
+ OptoReg::Name assigned = mask.find_first_set(lrg, num_regs);
|
||||||
@ -1421,7 +1421,7 @@ index 914dc43f6..710af9de8 100644
|
|||||||
+
|
+
|
||||||
// Choose a color using the biasing heuristic
|
// Choose a color using the biasing heuristic
|
||||||
OptoReg::Name PhaseChaitin::bias_color( LRG &lrg, int chunk ) {
|
OptoReg::Name PhaseChaitin::bias_color( LRG &lrg, int chunk ) {
|
||||||
|
|
||||||
@@ -1391,7 +1458,7 @@ OptoReg::Name PhaseChaitin::bias_color( LRG &lrg, int chunk ) {
|
@@ -1391,7 +1458,7 @@ OptoReg::Name PhaseChaitin::bias_color( LRG &lrg, int chunk ) {
|
||||||
RegMask tempmask = lrg.mask();
|
RegMask tempmask = lrg.mask();
|
||||||
tempmask.AND(lrgs(copy_lrg).mask());
|
tempmask.AND(lrgs(copy_lrg).mask());
|
||||||
@ -1438,12 +1438,12 @@ index 914dc43f6..710af9de8 100644
|
|||||||
- return OptoReg::add(lrg.mask().find_first_set(lrg.num_regs()),chunk);
|
- return OptoReg::add(lrg.mask().find_first_set(lrg.num_regs()),chunk);
|
||||||
+ return OptoReg::add(find_first_set(lrg, lrg.mask(), chunk), chunk);
|
+ return OptoReg::add(find_first_set(lrg, lrg.mask(), chunk), chunk);
|
||||||
}
|
}
|
||||||
|
|
||||||
// CNC - Fun hack. Alternate 1st and 2nd selection. Enables post-allocate
|
// CNC - Fun hack. Alternate 1st and 2nd selection. Enables post-allocate
|
||||||
@@ -1455,7 +1522,6 @@ uint PhaseChaitin::Select( ) {
|
@@ -1455,7 +1522,6 @@ uint PhaseChaitin::Select( ) {
|
||||||
LRG *lrg = &lrgs(lidx);
|
LRG *lrg = &lrgs(lidx);
|
||||||
_simplified = lrg->_next;
|
_simplified = lrg->_next;
|
||||||
|
|
||||||
-
|
-
|
||||||
#ifndef PRODUCT
|
#ifndef PRODUCT
|
||||||
if (trace_spilling()) {
|
if (trace_spilling()) {
|
||||||
@ -1455,7 +1455,7 @@ index 914dc43f6..710af9de8 100644
|
|||||||
-
|
-
|
||||||
goto retry_next_chunk;
|
goto retry_next_chunk;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1564,12 +1629,21 @@ uint PhaseChaitin::Select( ) {
|
@@ -1564,12 +1629,21 @@ uint PhaseChaitin::Select( ) {
|
||||||
int n_regs = lrg->num_regs();
|
int n_regs = lrg->num_regs();
|
||||||
assert(!lrg->_is_vector || !lrg->_fat_proj, "sanity");
|
assert(!lrg->_is_vector || !lrg->_fat_proj, "sanity");
|
||||||
@ -1505,7 +1505,7 @@ index e5be5b966..5408a24ef 100644
|
|||||||
@@ -139,14 +141,37 @@ public:
|
@@ -139,14 +141,37 @@ public:
|
||||||
void clear_to_pairs() { _mask.clear_to_pairs(); debug_only(_msize_valid=0;) }
|
void clear_to_pairs() { _mask.clear_to_pairs(); debug_only(_msize_valid=0;) }
|
||||||
void clear_to_sets() { _mask.clear_to_sets(_num_regs); debug_only(_msize_valid=0;) }
|
void clear_to_sets() { _mask.clear_to_sets(_num_regs); debug_only(_msize_valid=0;) }
|
||||||
|
|
||||||
- // Number of registers this live range uses when it colors
|
- // Number of registers this live range uses when it colors
|
||||||
private:
|
private:
|
||||||
+ // Number of registers this live range uses when it colors
|
+ // Number of registers this live range uses when it colors
|
||||||
@ -1520,7 +1520,7 @@ index e5be5b966..5408a24ef 100644
|
|||||||
public:
|
public:
|
||||||
int num_regs() const { return _num_regs; }
|
int num_regs() const { return _num_regs; }
|
||||||
void set_num_regs( int reg ) { assert( _num_regs == reg || !_num_regs, "" ); _num_regs = reg; }
|
void set_num_regs( int reg ) { assert( _num_regs == reg || !_num_regs, "" ); _num_regs = reg; }
|
||||||
|
|
||||||
+ uint scalable_reg_slots() { return _scalable_reg_slots; }
|
+ uint scalable_reg_slots() { return _scalable_reg_slots; }
|
||||||
+ void set_scalable_reg_slots(uint slots) {
|
+ void set_scalable_reg_slots(uint slots) {
|
||||||
+ assert(_is_scalable, "scalable register");
|
+ assert(_is_scalable, "scalable register");
|
||||||
@ -1581,7 +1581,7 @@ index 4cc7580a8..4fb732161 100644
|
|||||||
@@ -417,6 +420,8 @@ static RegMask *init_input_masks( uint size, RegMask &ret_adr, RegMask &fp ) {
|
@@ -417,6 +420,8 @@ static RegMask *init_input_masks( uint size, RegMask &ret_adr, RegMask &fp ) {
|
||||||
return rms;
|
return rms;
|
||||||
}
|
}
|
||||||
|
|
||||||
+#define NOF_STACK_MASKS (3*6+6)
|
+#define NOF_STACK_MASKS (3*6+6)
|
||||||
+
|
+
|
||||||
//---------------------------init_first_stack_mask-----------------------------
|
//---------------------------init_first_stack_mask-----------------------------
|
||||||
@ -1589,7 +1589,7 @@ index 4cc7580a8..4fb732161 100644
|
|||||||
// Disallow any debug info in outgoing argument areas by setting the
|
// Disallow any debug info in outgoing argument areas by setting the
|
||||||
@@ -424,7 +429,12 @@ static RegMask *init_input_masks( uint size, RegMask &ret_adr, RegMask &fp ) {
|
@@ -424,7 +429,12 @@ static RegMask *init_input_masks( uint size, RegMask &ret_adr, RegMask &fp ) {
|
||||||
void Matcher::init_first_stack_mask() {
|
void Matcher::init_first_stack_mask() {
|
||||||
|
|
||||||
// Allocate storage for spill masks as masks for the appropriate load type.
|
// Allocate storage for spill masks as masks for the appropriate load type.
|
||||||
- RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * (3*6+5));
|
- RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * (3*6+5));
|
||||||
+ RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * NOF_STACK_MASKS);
|
+ RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * NOF_STACK_MASKS);
|
||||||
@ -1598,13 +1598,13 @@ index 4cc7580a8..4fb732161 100644
|
|||||||
+ for (int i = 0; i < NOF_STACK_MASKS; i++) {
|
+ for (int i = 0; i < NOF_STACK_MASKS; i++) {
|
||||||
+ new (rms + i) RegMask();
|
+ new (rms + i) RegMask();
|
||||||
+ }
|
+ }
|
||||||
|
|
||||||
idealreg2spillmask [Op_RegN] = &rms[0];
|
idealreg2spillmask [Op_RegN] = &rms[0];
|
||||||
idealreg2spillmask [Op_RegI] = &rms[1];
|
idealreg2spillmask [Op_RegI] = &rms[1];
|
||||||
@@ -447,11 +457,12 @@ void Matcher::init_first_stack_mask() {
|
@@ -447,11 +457,12 @@ void Matcher::init_first_stack_mask() {
|
||||||
idealreg2mhdebugmask[Op_RegD] = &rms[16];
|
idealreg2mhdebugmask[Op_RegD] = &rms[16];
|
||||||
idealreg2mhdebugmask[Op_RegP] = &rms[17];
|
idealreg2mhdebugmask[Op_RegP] = &rms[17];
|
||||||
|
|
||||||
- idealreg2spillmask [Op_VecS] = &rms[18];
|
- idealreg2spillmask [Op_VecS] = &rms[18];
|
||||||
- idealreg2spillmask [Op_VecD] = &rms[19];
|
- idealreg2spillmask [Op_VecD] = &rms[19];
|
||||||
- idealreg2spillmask [Op_VecX] = &rms[20];
|
- idealreg2spillmask [Op_VecX] = &rms[20];
|
||||||
@ -1616,15 +1616,15 @@ index 4cc7580a8..4fb732161 100644
|
|||||||
+ idealreg2spillmask [Op_VecX] = &rms[21];
|
+ idealreg2spillmask [Op_VecX] = &rms[21];
|
||||||
+ idealreg2spillmask [Op_VecY] = &rms[22];
|
+ idealreg2spillmask [Op_VecY] = &rms[22];
|
||||||
+ idealreg2spillmask [Op_VecZ] = &rms[23];
|
+ idealreg2spillmask [Op_VecZ] = &rms[23];
|
||||||
|
|
||||||
OptoReg::Name i;
|
OptoReg::Name i;
|
||||||
|
|
||||||
@@ -478,6 +489,7 @@ void Matcher::init_first_stack_mask() {
|
@@ -478,6 +489,7 @@ void Matcher::init_first_stack_mask() {
|
||||||
// Keep spill masks aligned.
|
// Keep spill masks aligned.
|
||||||
aligned_stack_mask.clear_to_pairs();
|
aligned_stack_mask.clear_to_pairs();
|
||||||
assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
|
assert(aligned_stack_mask.is_AllStack(), "should be infinite stack");
|
||||||
+ RegMask scalable_stack_mask = aligned_stack_mask;
|
+ RegMask scalable_stack_mask = aligned_stack_mask;
|
||||||
|
|
||||||
*idealreg2spillmask[Op_RegP] = *idealreg2regmask[Op_RegP];
|
*idealreg2spillmask[Op_RegP] = *idealreg2regmask[Op_RegP];
|
||||||
#ifdef _LP64
|
#ifdef _LP64
|
||||||
@@ -548,28 +560,48 @@ void Matcher::init_first_stack_mask() {
|
@@ -548,28 +560,48 @@ void Matcher::init_first_stack_mask() {
|
||||||
@ -1690,12 +1690,12 @@ index 4cc7580a8..4fb732161 100644
|
|||||||
#endif
|
#endif
|
||||||
- }
|
- }
|
||||||
+ }
|
+ }
|
||||||
|
|
||||||
// Make up debug masks. Any spill slot plus callee-save registers.
|
// Make up debug masks. Any spill slot plus callee-save registers.
|
||||||
// Caller-save registers are assumed to be trashable by the various
|
// Caller-save registers are assumed to be trashable by the various
|
||||||
@@ -872,6 +904,10 @@ void Matcher::init_spill_mask( Node *ret ) {
|
@@ -872,6 +904,10 @@ void Matcher::init_spill_mask( Node *ret ) {
|
||||||
idealreg2regmask[Op_RegP] = &spillP->out_RegMask();
|
idealreg2regmask[Op_RegP] = &spillP->out_RegMask();
|
||||||
|
|
||||||
// Vector regmasks.
|
// Vector regmasks.
|
||||||
+ if (Matcher::supports_scalable_vector()) {
|
+ if (Matcher::supports_scalable_vector()) {
|
||||||
+ MachNode *spillVectA = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTA));
|
+ MachNode *spillVectA = match_tree(new LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTA));
|
||||||
@ -1707,11 +1707,11 @@ index 4cc7580a8..4fb732161 100644
|
|||||||
@@ -1575,7 +1611,6 @@ Node* Matcher::Label_Root(const Node* n, State* svec, Node* control, Node*& mem)
|
@@ -1575,7 +1611,6 @@ Node* Matcher::Label_Root(const Node* n, State* svec, Node* control, Node*& mem)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
-
|
-
|
||||||
// Call DFA to match this node, and return
|
// Call DFA to match this node, and return
|
||||||
svec->DFA( n->Opcode(), n );
|
svec->DFA( n->Opcode(), n );
|
||||||
|
|
||||||
diff --git a/src/hotspot/share/opto/matcher.hpp b/src/hotspot/share/opto/matcher.hpp
|
diff --git a/src/hotspot/share/opto/matcher.hpp b/src/hotspot/share/opto/matcher.hpp
|
||||||
index 244e3d1f8..ed890f88e 100644
|
index 244e3d1f8..ed890f88e 100644
|
||||||
--- a/src/hotspot/share/opto/matcher.hpp
|
--- a/src/hotspot/share/opto/matcher.hpp
|
||||||
@ -1719,7 +1719,7 @@ index 244e3d1f8..ed890f88e 100644
|
|||||||
@@ -333,6 +333,10 @@ public:
|
@@ -333,6 +333,10 @@ public:
|
||||||
Matcher::min_vector_size(bt) <= size);
|
Matcher::min_vector_size(bt) <= size);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ static const bool supports_scalable_vector();
|
+ static const bool supports_scalable_vector();
|
||||||
+ // Actual max scalable vector register length.
|
+ // Actual max scalable vector register length.
|
||||||
+ static const int scalable_vector_reg_size(const BasicType bt);
|
+ static const int scalable_vector_reg_size(const BasicType bt);
|
||||||
@ -1793,17 +1793,17 @@ index d572ac9fe..3514b37bc 100644
|
|||||||
@@ -266,9 +266,9 @@ int PhaseChaitin::elide_copy( Node *n, int k, Block *current_block, Node_List &v
|
@@ -266,9 +266,9 @@ int PhaseChaitin::elide_copy( Node *n, int k, Block *current_block, Node_List &v
|
||||||
Node *val = skip_copies(n->in(k));
|
Node *val = skip_copies(n->in(k));
|
||||||
if (val == x) return blk_adjust; // No progress?
|
if (val == x) return blk_adjust; // No progress?
|
||||||
|
|
||||||
- int n_regs = RegMask::num_registers(val->ideal_reg());
|
- int n_regs = RegMask::num_registers(val->ideal_reg());
|
||||||
uint val_idx = _lrg_map.live_range_id(val);
|
uint val_idx = _lrg_map.live_range_id(val);
|
||||||
OptoReg::Name val_reg = lrgs(val_idx).reg();
|
OptoReg::Name val_reg = lrgs(val_idx).reg();
|
||||||
+ int n_regs = RegMask::num_registers(val->ideal_reg(), lrgs(val_idx));
|
+ int n_regs = RegMask::num_registers(val->ideal_reg(), lrgs(val_idx));
|
||||||
|
|
||||||
// See if it happens to already be in the correct register!
|
// See if it happens to already be in the correct register!
|
||||||
// (either Phi's direct register, or the common case of the name
|
// (either Phi's direct register, or the common case of the name
|
||||||
@@ -305,8 +305,26 @@ int PhaseChaitin::elide_copy( Node *n, int k, Block *current_block, Node_List &v
|
@@ -305,8 +305,26 @@ int PhaseChaitin::elide_copy( Node *n, int k, Block *current_block, Node_List &v
|
||||||
}
|
}
|
||||||
|
|
||||||
Node *vv = value[reg];
|
Node *vv = value[reg];
|
||||||
+ // For scalable register, number of registers may be inconsistent between
|
+ // For scalable register, number of registers may be inconsistent between
|
||||||
+ // "val_reg" and "reg". For example, when "val" resides in register
|
+ // "val_reg" and "reg". For example, when "val" resides in register
|
||||||
@ -1835,7 +1835,7 @@ index d572ac9fe..3514b37bc 100644
|
|||||||
uint pidx = _lrg_map.live_range_id(phi);
|
uint pidx = _lrg_map.live_range_id(phi);
|
||||||
- OptoReg::Name preg = lrgs(_lrg_map.live_range_id(phi)).reg();
|
- OptoReg::Name preg = lrgs(_lrg_map.live_range_id(phi)).reg();
|
||||||
+ OptoReg::Name preg = lrgs(pidx).reg();
|
+ OptoReg::Name preg = lrgs(pidx).reg();
|
||||||
|
|
||||||
// Remove copies remaining on edges. Check for junk phi.
|
// Remove copies remaining on edges. Check for junk phi.
|
||||||
Node *u = NULL;
|
Node *u = NULL;
|
||||||
@@ -619,7 +637,7 @@ void PhaseChaitin::post_allocate_copy_removal() {
|
@@ -619,7 +637,7 @@ void PhaseChaitin::post_allocate_copy_removal() {
|
||||||
@ -1858,7 +1858,7 @@ index d572ac9fe..3514b37bc 100644
|
|||||||
if (!value[ureg_lo] &&
|
if (!value[ureg_lo] &&
|
||||||
@@ -707,7 +725,7 @@ void PhaseChaitin::post_allocate_copy_removal() {
|
@@ -707,7 +725,7 @@ void PhaseChaitin::post_allocate_copy_removal() {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint n_ideal_reg = n->ideal_reg();
|
uint n_ideal_reg = n->ideal_reg();
|
||||||
- int n_regs = RegMask::num_registers(n_ideal_reg);
|
- int n_regs = RegMask::num_registers(n_ideal_reg);
|
||||||
+ int n_regs = RegMask::num_registers(n_ideal_reg, lrgs(lidx));
|
+ int n_regs = RegMask::num_registers(n_ideal_reg, lrgs(lidx));
|
||||||
@ -1877,7 +1877,7 @@ index 2e04c42eb..dd9b5476b 100644
|
|||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@@ -24,6 +24,7 @@
|
@@ -24,6 +24,7 @@
|
||||||
|
|
||||||
#include "precompiled.hpp"
|
#include "precompiled.hpp"
|
||||||
#include "opto/ad.hpp"
|
#include "opto/ad.hpp"
|
||||||
+#include "opto/chaitin.hpp"
|
+#include "opto/chaitin.hpp"
|
||||||
@ -1885,14 +1885,14 @@ index 2e04c42eb..dd9b5476b 100644
|
|||||||
#include "opto/matcher.hpp"
|
#include "opto/matcher.hpp"
|
||||||
#include "opto/node.hpp"
|
#include "opto/node.hpp"
|
||||||
@@ -116,30 +117,47 @@ const RegMask RegMask::Empty(
|
@@ -116,30 +117,47 @@ const RegMask RegMask::Empty(
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
bool RegMask::is_vector(uint ireg) {
|
bool RegMask::is_vector(uint ireg) {
|
||||||
- return (ireg == Op_VecS || ireg == Op_VecD ||
|
- return (ireg == Op_VecS || ireg == Op_VecD ||
|
||||||
+ return (ireg == Op_VecA || ireg == Op_VecS || ireg == Op_VecD ||
|
+ return (ireg == Op_VecA || ireg == Op_VecS || ireg == Op_VecD ||
|
||||||
ireg == Op_VecX || ireg == Op_VecY || ireg == Op_VecZ );
|
ireg == Op_VecX || ireg == Op_VecY || ireg == Op_VecZ );
|
||||||
}
|
}
|
||||||
|
|
||||||
int RegMask::num_registers(uint ireg) {
|
int RegMask::num_registers(uint ireg) {
|
||||||
switch(ireg) {
|
switch(ireg) {
|
||||||
case Op_VecZ:
|
case Op_VecZ:
|
||||||
@ -1919,7 +1919,7 @@ index 2e04c42eb..dd9b5476b 100644
|
|||||||
// Op_VecS and the rest ideal registers.
|
// Op_VecS and the rest ideal registers.
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
+int RegMask::num_registers(uint ireg, LRG &lrg) {
|
+int RegMask::num_registers(uint ireg, LRG &lrg) {
|
||||||
+ int n_regs = num_registers(ireg);
|
+ int n_regs = num_registers(ireg);
|
||||||
+
|
+
|
||||||
@ -1939,7 +1939,7 @@ index 2e04c42eb..dd9b5476b 100644
|
|||||||
@@ -238,14 +256,30 @@ int RegMask::is_bound_pair() const {
|
@@ -238,14 +256,30 @@ int RegMask::is_bound_pair() const {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
+// Check that whether given reg number with size is valid
|
+// Check that whether given reg number with size is valid
|
||||||
+// for current regmask, where reg is the highest number.
|
+// for current regmask, where reg is the highest number.
|
||||||
+bool RegMask::is_valid_reg(OptoReg::Name reg, const int size) const {
|
+bool RegMask::is_valid_reg(OptoReg::Name reg, const int size) const {
|
||||||
@ -2002,7 +2002,7 @@ index c64d08795..b733b87ad 100644
|
|||||||
@@ -28,6 +28,8 @@
|
@@ -28,6 +28,8 @@
|
||||||
#include "code/vmreg.hpp"
|
#include "code/vmreg.hpp"
|
||||||
#include "opto/optoreg.hpp"
|
#include "opto/optoreg.hpp"
|
||||||
|
|
||||||
+class LRG;
|
+class LRG;
|
||||||
+
|
+
|
||||||
// Some fun naming (textual) substitutions:
|
// Some fun naming (textual) substitutions:
|
||||||
@ -2020,13 +2020,13 @@ index c64d08795..b733b87ad 100644
|
|||||||
- SlotsPerVecZ = 16 };
|
- SlotsPerVecZ = 16 };
|
||||||
+ SlotsPerVecZ = 16,
|
+ SlotsPerVecZ = 16,
|
||||||
+ };
|
+ };
|
||||||
|
|
||||||
// A constructor only used by the ADLC output. All mask fields are filled
|
// A constructor only used by the ADLC output. All mask fields are filled
|
||||||
// in directly. Calls to this look something like RM(1,2,3,4);
|
// in directly. Calls to this look something like RM(1,2,3,4);
|
||||||
@@ -204,10 +208,14 @@ public:
|
@@ -204,10 +208,14 @@ public:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ // Check that whether given reg number with size is valid
|
+ // Check that whether given reg number with size is valid
|
||||||
+ // for current regmask, where reg is the highest number.
|
+ // for current regmask, where reg is the highest number.
|
||||||
+ bool is_valid_reg(OptoReg::Name reg, const int size) const;
|
+ bool is_valid_reg(OptoReg::Name reg, const int size) const;
|
||||||
@ -2036,15 +2036,15 @@ index c64d08795..b733b87ad 100644
|
|||||||
// Assert that the mask contains only bit sets.
|
// Assert that the mask contains only bit sets.
|
||||||
- OptoReg::Name find_first_set(const int size) const;
|
- OptoReg::Name find_first_set(const int size) const;
|
||||||
+ OptoReg::Name find_first_set(LRG &lrg, const int size) const;
|
+ OptoReg::Name find_first_set(LRG &lrg, const int size) const;
|
||||||
|
|
||||||
// Clear out partial bits; leave only aligned adjacent bit sets of size.
|
// Clear out partial bits; leave only aligned adjacent bit sets of size.
|
||||||
void clear_to_sets(const int size);
|
void clear_to_sets(const int size);
|
||||||
@@ -226,6 +234,7 @@ public:
|
@@ -226,6 +234,7 @@ public:
|
||||||
|
|
||||||
static bool is_vector(uint ireg);
|
static bool is_vector(uint ireg);
|
||||||
static int num_registers(uint ireg);
|
static int num_registers(uint ireg);
|
||||||
+ static int num_registers(uint ireg, LRG &lrg);
|
+ static int num_registers(uint ireg, LRG &lrg);
|
||||||
|
|
||||||
// Fast overlap test. Non-zero if any registers in common.
|
// Fast overlap test. Non-zero if any registers in common.
|
||||||
int overlap( const RegMask &rm ) const {
|
int overlap( const RegMask &rm ) const {
|
||||||
diff --git a/src/hotspot/share/opto/type.cpp b/src/hotspot/share/opto/type.cpp
|
diff --git a/src/hotspot/share/opto/type.cpp b/src/hotspot/share/opto/type.cpp
|
||||||
@ -2062,7 +2062,7 @@ index 223b7a1c6..1b46cb452 100644
|
|||||||
@@ -655,6 +656,10 @@ void Type::Initialize_shared(Compile* current) {
|
@@ -655,6 +656,10 @@ void Type::Initialize_shared(Compile* current) {
|
||||||
// get_zero_type() should not happen for T_CONFLICT
|
// get_zero_type() should not happen for T_CONFLICT
|
||||||
_zero_type[T_CONFLICT]= NULL;
|
_zero_type[T_CONFLICT]= NULL;
|
||||||
|
|
||||||
+ if (Matcher::supports_scalable_vector()) {
|
+ if (Matcher::supports_scalable_vector()) {
|
||||||
+ TypeVect::VECTA = TypeVect::make(T_BYTE, Matcher::scalable_vector_reg_size(T_BYTE));
|
+ TypeVect::VECTA = TypeVect::make(T_BYTE, Matcher::scalable_vector_reg_size(T_BYTE));
|
||||||
+ }
|
+ }
|
||||||
@ -2080,7 +2080,7 @@ index 223b7a1c6..1b46cb452 100644
|
|||||||
mreg2type[Op_VecD] = TypeVect::VECTD;
|
mreg2type[Op_VecD] = TypeVect::VECTD;
|
||||||
mreg2type[Op_VecX] = TypeVect::VECTX;
|
mreg2type[Op_VecX] = TypeVect::VECTX;
|
||||||
@@ -990,6 +997,7 @@ const Type::TYPES Type::dual_type[Type::lastype] = {
|
@@ -990,6 +997,7 @@ const Type::TYPES Type::dual_type[Type::lastype] = {
|
||||||
|
|
||||||
Bad, // Tuple - handled in v-call
|
Bad, // Tuple - handled in v-call
|
||||||
Bad, // Array - handled in v-call
|
Bad, // Array - handled in v-call
|
||||||
+ Bad, // VectorA - handled in v-call
|
+ Bad, // VectorA - handled in v-call
|
||||||
@ -2090,13 +2090,13 @@ index 223b7a1c6..1b46cb452 100644
|
|||||||
@@ -1890,7 +1898,6 @@ const TypeTuple *TypeTuple::LONG_PAIR;
|
@@ -1890,7 +1898,6 @@ const TypeTuple *TypeTuple::LONG_PAIR;
|
||||||
const TypeTuple *TypeTuple::INT_CC_PAIR;
|
const TypeTuple *TypeTuple::INT_CC_PAIR;
|
||||||
const TypeTuple *TypeTuple::LONG_CC_PAIR;
|
const TypeTuple *TypeTuple::LONG_CC_PAIR;
|
||||||
|
|
||||||
-
|
-
|
||||||
//------------------------------make-------------------------------------------
|
//------------------------------make-------------------------------------------
|
||||||
// Make a TypeTuple from the range of a method signature
|
// Make a TypeTuple from the range of a method signature
|
||||||
const TypeTuple *TypeTuple::make_range(ciSignature* sig) {
|
const TypeTuple *TypeTuple::make_range(ciSignature* sig) {
|
||||||
@@ -2262,6 +2269,7 @@ bool TypeAry::ary_must_be_exact() const {
|
@@ -2262,6 +2269,7 @@ bool TypeAry::ary_must_be_exact() const {
|
||||||
|
|
||||||
//==============================TypeVect=======================================
|
//==============================TypeVect=======================================
|
||||||
// Convenience common pre-built types.
|
// Convenience common pre-built types.
|
||||||
+const TypeVect *TypeVect::VECTA = NULL; // vector length agnostic
|
+const TypeVect *TypeVect::VECTA = NULL; // vector length agnostic
|
||||||
@ -2117,7 +2117,7 @@ index 223b7a1c6..1b46cb452 100644
|
|||||||
return (TypeVect*)(new TypeVectS(elem, length))->hashcons();
|
return (TypeVect*)(new TypeVectS(elem, length))->hashcons();
|
||||||
case Op_RegL:
|
case Op_RegL:
|
||||||
@@ -2307,7 +2316,7 @@ const Type *TypeVect::xmeet( const Type *t ) const {
|
@@ -2307,7 +2316,7 @@ const Type *TypeVect::xmeet( const Type *t ) const {
|
||||||
|
|
||||||
default: // All else is a mistake
|
default: // All else is a mistake
|
||||||
typerr(t);
|
typerr(t);
|
||||||
-
|
-
|
||||||
@ -2138,13 +2138,6 @@ diff --git a/src/hotspot/share/opto/type.hpp b/src/hotspot/share/opto/type.hpp
|
|||||||
index a7eec281e..6787b947d 100644
|
index a7eec281e..6787b947d 100644
|
||||||
--- a/src/hotspot/share/opto/type.hpp
|
--- a/src/hotspot/share/opto/type.hpp
|
||||||
+++ b/src/hotspot/share/opto/type.hpp
|
+++ b/src/hotspot/share/opto/type.hpp
|
||||||
@@ -1,5 +1,5 @@
|
|
||||||
/*
|
|
||||||
- * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
+ * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
@@ -53,6 +53,7 @@ class TypeNarrowKlass;
|
@@ -53,6 +53,7 @@ class TypeNarrowKlass;
|
||||||
class TypeAry;
|
class TypeAry;
|
||||||
class TypeTuple;
|
class TypeTuple;
|
||||||
@ -2154,7 +2147,7 @@ index a7eec281e..6787b947d 100644
|
|||||||
class TypeVectD;
|
class TypeVectD;
|
||||||
class TypeVectX;
|
class TypeVectX;
|
||||||
@@ -87,6 +88,7 @@ public:
|
@@ -87,6 +88,7 @@ public:
|
||||||
|
|
||||||
Tuple, // Method signature or object layout
|
Tuple, // Method signature or object layout
|
||||||
Array, // Array types
|
Array, // Array types
|
||||||
+ VectorA, // (Scalable) Vector types for vector length agnostic
|
+ VectorA, // (Scalable) Vector types for vector length agnostic
|
||||||
@ -2164,7 +2157,7 @@ index a7eec281e..6787b947d 100644
|
|||||||
@@ -758,6 +760,7 @@ public:
|
@@ -758,6 +760,7 @@ public:
|
||||||
virtual const Type *xmeet( const Type *t) const;
|
virtual const Type *xmeet( const Type *t) const;
|
||||||
virtual const Type *xdual() const; // Compute dual right now.
|
virtual const Type *xdual() const; // Compute dual right now.
|
||||||
|
|
||||||
+ static const TypeVect *VECTA;
|
+ static const TypeVect *VECTA;
|
||||||
static const TypeVect *VECTS;
|
static const TypeVect *VECTS;
|
||||||
static const TypeVect *VECTD;
|
static const TypeVect *VECTD;
|
||||||
@ -2172,7 +2165,7 @@ index a7eec281e..6787b947d 100644
|
|||||||
@@ -769,6 +772,11 @@ public:
|
@@ -769,6 +772,11 @@ public:
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
+class TypeVectA : public TypeVect {
|
+class TypeVectA : public TypeVect {
|
||||||
+ friend class TypeVect;
|
+ friend class TypeVect;
|
||||||
+ TypeVectA(const Type* elem, uint length) : TypeVect(VectorA, elem, length) {}
|
+ TypeVectA(const Type* elem, uint length) : TypeVect(VectorA, elem, length) {}
|
||||||
@ -2183,19 +2176,19 @@ index a7eec281e..6787b947d 100644
|
|||||||
TypeVectS(const Type* elem, uint length) : TypeVect(VectorS, elem, length) {}
|
TypeVectS(const Type* elem, uint length) : TypeVect(VectorS, elem, length) {}
|
||||||
@@ -1619,12 +1627,12 @@ inline const TypeAry *Type::is_ary() const {
|
@@ -1619,12 +1627,12 @@ inline const TypeAry *Type::is_ary() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const TypeVect *Type::is_vect() const {
|
inline const TypeVect *Type::is_vect() const {
|
||||||
- assert( _base >= VectorS && _base <= VectorZ, "Not a Vector" );
|
- assert( _base >= VectorS && _base <= VectorZ, "Not a Vector" );
|
||||||
+ assert( _base >= VectorA && _base <= VectorZ, "Not a Vector" );
|
+ assert( _base >= VectorA && _base <= VectorZ, "Not a Vector" );
|
||||||
return (TypeVect*)this;
|
return (TypeVect*)this;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const TypeVect *Type::isa_vect() const {
|
inline const TypeVect *Type::isa_vect() const {
|
||||||
- return (_base >= VectorS && _base <= VectorZ) ? (TypeVect*)this : NULL;
|
- return (_base >= VectorS && _base <= VectorZ) ? (TypeVect*)this : NULL;
|
||||||
+ return (_base >= VectorA && _base <= VectorZ) ? (TypeVect*)this : NULL;
|
+ return (_base >= VectorA && _base <= VectorZ) ? (TypeVect*)this : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline const TypePtr *Type::is_ptr() const {
|
inline const TypePtr *Type::is_ptr() const {
|
||||||
--
|
--
|
||||||
2.19.1
|
2.19.1
|
||||||
|
|
||||||
|
|||||||
@ -1,145 +0,0 @@
|
|||||||
diff --git a/src/hotspot/share/opto/stringopts.cpp b/src/hotspot/share/opto/stringopts.cpp
|
|
||||||
index e8e493bce..91a3c998e 100644
|
|
||||||
--- a/src/hotspot/share/opto/stringopts.cpp
|
|
||||||
+++ b/src/hotspot/share/opto/stringopts.cpp
|
|
||||||
@@ -1028,6 +1028,21 @@ bool StringConcat::validate_control_flow() {
|
|
||||||
fail = true;
|
|
||||||
break;
|
|
||||||
} else if (ptr->is_Proj() && ptr->in(0)->is_Initialize()) {
|
|
||||||
+ // Check for side effect between Initialize and the constructor
|
|
||||||
+ for (SimpleDUIterator iter(ptr); iter.has_next(); iter.next()) {
|
|
||||||
+ Node* use = iter.get();
|
|
||||||
+ if (!use->is_CFG() && !use->is_CheckCastPP() && !use->is_Load()) {
|
|
||||||
+#ifndef PRODUCT
|
|
||||||
+ if (PrintOptimizeStringConcat) {
|
|
||||||
+ tty->print_cr("unexpected control use of Initialize");
|
|
||||||
+ ptr->in(0)->dump(); // Initialize node
|
|
||||||
+ use->dump(1);
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
+ fail = true;
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
ptr = ptr->in(0)->in(0);
|
|
||||||
} else if (ptr->is_Region()) {
|
|
||||||
Node* copy = ptr->as_Region()->is_copy();
|
|
||||||
diff --git a/test/hotspot/jtreg/compiler/stringopts/SideEffectBeforeConstructor.jasm b/test/hotspot/jtreg/compiler/stringopts/SideEffectBeforeConstructor.jasm
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..cbc6d754b
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/test/hotspot/jtreg/compiler/stringopts/SideEffectBeforeConstructor.jasm
|
|
||||||
@@ -0,0 +1,58 @@
|
|
||||||
+/*
|
|
||||||
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
+ *
|
|
||||||
+ * This code is free software; you can redistribute it and/or modify it
|
|
||||||
+ * under the terms of the GNU General Public License version 2 only, as
|
|
||||||
+ * published by the Free Software Foundation.
|
|
||||||
+ *
|
|
||||||
+ * This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
+ * version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
+ * accompanied this code).
|
|
||||||
+ *
|
|
||||||
+ * You should have received a copy of the GNU General Public License version
|
|
||||||
+ * 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
+ *
|
|
||||||
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
+ * or visit www.oracle.com if you need additional information or have any
|
|
||||||
+ * questions.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+super public class compiler/stringopts/SideEffectBeforeConstructor
|
|
||||||
+ version 51:0
|
|
||||||
+{
|
|
||||||
+ public static Field result:I;
|
|
||||||
+
|
|
||||||
+ static Method "<clinit>":"()V"
|
|
||||||
+ stack 2 locals 0
|
|
||||||
+ {
|
|
||||||
+ iconst_0;
|
|
||||||
+ putstatic Field result:"I";
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ public Method "<init>":"()V"
|
|
||||||
+ stack 1 locals 1
|
|
||||||
+ {
|
|
||||||
+ aload_0;
|
|
||||||
+ invokespecial Method java/lang/Object."<init>":"()V";
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public static Method test:"(Ljava/lang/String;)V"
|
|
||||||
+ stack 4 locals 1
|
|
||||||
+ {
|
|
||||||
+ new class java/lang/StringBuffer;
|
|
||||||
+ dup;
|
|
||||||
+ getstatic Field result:"I";
|
|
||||||
+ iconst_1;
|
|
||||||
+ iadd;
|
|
||||||
+ putstatic Field result:"I";
|
|
||||||
+ aload_0;
|
|
||||||
+ invokespecial Method java/lang/StringBuffer."<init>":"(Ljava/lang/String;)V";
|
|
||||||
+ invokevirtual Method java/lang/StringBuffer.toString:"()Ljava/lang/String;";
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
diff --git a/test/hotspot/jtreg/compiler/stringopts/TestSideEffectBeforeConstructor.java b/test/hotspot/jtreg/compiler/stringopts/TestSideEffectBeforeConstructor.java
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000..86c5eca1d
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/test/hotspot/jtreg/compiler/stringopts/TestSideEffectBeforeConstructor.java
|
|
||||||
@@ -0,0 +1,49 @@
|
|
||||||
+/*
|
|
||||||
+ * Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
+ *
|
|
||||||
+ * This code is free software; you can redistribute it and/or modify it
|
|
||||||
+ * under the terms of the GNU General Public License version 2 only, as
|
|
||||||
+ * published by the Free Software Foundation.
|
|
||||||
+ *
|
|
||||||
+ * This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
+ * version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
+ * accompanied this code).
|
|
||||||
+ *
|
|
||||||
+ * You should have received a copy of the GNU General Public License version
|
|
||||||
+ * 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
+ *
|
|
||||||
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
+ * or visit www.oracle.com if you need additional information or have any
|
|
||||||
+ * questions.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * @test
|
|
||||||
+ * @bug 8290705
|
|
||||||
+ * @summary Test correctness of the string concatenation optimization with
|
|
||||||
+ * a store between StringBuffer allocation and constructor invocation.
|
|
||||||
+ * @compile SideEffectBeforeConstructor.jasm
|
|
||||||
+ * @run main/othervm -Xbatch compiler.stringopts.TestSideEffectBeforeConstructor
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+package compiler.stringopts;
|
|
||||||
+
|
|
||||||
+public class TestSideEffectBeforeConstructor {
|
|
||||||
+
|
|
||||||
+ public static void main(String[] args) {
|
|
||||||
+ for (int i = 0; i < 100_000; ++i) {
|
|
||||||
+ try {
|
|
||||||
+ SideEffectBeforeConstructor.test(null);
|
|
||||||
+ } catch (NullPointerException npe) {
|
|
||||||
+ // Expected
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (SideEffectBeforeConstructor.result != 100_000) {
|
|
||||||
+ throw new RuntimeException("Unexpected result: " + SideEffectBeforeConstructor.result);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
@ -220,7 +220,7 @@ index 41533e566..9fa545605 100644
|
|||||||
+ endif
|
+ endif
|
||||||
+endif
|
+endif
|
||||||
+
|
+
|
||||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
ifeq ($(call isTargetOs, windows), true)
|
||||||
PLATFORM_MODULES += jdk.crypto.mscapi
|
PLATFORM_MODULES += jdk.crypto.mscapi
|
||||||
endif
|
endif
|
||||||
@@ -228,6 +234,13 @@ ifeq ($(ENABLE_AOT), false)
|
@@ -228,6 +234,13 @@ ifeq ($(ENABLE_AOT), false)
|
||||||
|
|||||||
@ -10,7 +10,7 @@ index 2cc9c87d0..a86046616 100644
|
|||||||
@@ -171,25 +171,47 @@ void G1FullGCPrepareTask::G1CalculatePointersClosure::prepare_for_compaction(Hea
|
@@ -171,25 +171,47 @@ void G1FullGCPrepareTask::G1CalculatePointersClosure::prepare_for_compaction(Hea
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
-void G1FullGCPrepareTask::G1CalculatePointersClosure::prepare_no_moving_region(const HeapRegion* hr) {
|
-void G1FullGCPrepareTask::G1CalculatePointersClosure::prepare_no_moving_region(const HeapRegion* hr) {
|
||||||
- const HeapRegion* current = hr;
|
- const HeapRegion* current = hr;
|
||||||
+void G1FullGCPrepareTask::G1CalculatePointersClosure::prepare_no_moving_region(HeapRegion* hr) {
|
+void G1FullGCPrepareTask::G1CalculatePointersClosure::prepare_no_moving_region(HeapRegion* hr) {
|
||||||
@ -61,7 +61,7 @@ index 2cc9c87d0..a86046616 100644
|
|||||||
}
|
}
|
||||||
+ assert(next_addr == limit, "Should stop the scan at the limit.");
|
+ assert(next_addr == limit, "Should stop the scan at the limit.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void G1FullGCPrepareTask::prepare_serial_compaction() {
|
void G1FullGCPrepareTask::prepare_serial_compaction() {
|
||||||
diff --git a/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp b/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp
|
diff --git a/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp b/src/hotspot/share/gc/g1/g1FullGCPrepareTask.hpp
|
||||||
index 57b53c9dd..7f4a69e80 100644
|
index 57b53c9dd..7f4a69e80 100644
|
||||||
@ -73,7 +73,7 @@ index 57b53c9dd..7f4a69e80 100644
|
|||||||
void reset_region_metadata(HeapRegion* hr);
|
void reset_region_metadata(HeapRegion* hr);
|
||||||
- void prepare_no_moving_region(const HeapRegion* hr);
|
- void prepare_no_moving_region(const HeapRegion* hr);
|
||||||
+ void prepare_no_moving_region(HeapRegion* hr);
|
+ void prepare_no_moving_region(HeapRegion* hr);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
G1CalculatePointersClosure(G1CMBitMap* bitmap,
|
G1CalculatePointersClosure(G1CMBitMap* bitmap,
|
||||||
diff --git a/src/hotspot/share/gc/g1/g1MarkLiveWords.cpp b/src/hotspot/share/gc/g1/g1MarkLiveWords.cpp
|
diff --git a/src/hotspot/share/gc/g1/g1MarkLiveWords.cpp b/src/hotspot/share/gc/g1/g1MarkLiveWords.cpp
|
||||||
@ -109,7 +109,7 @@ index 32da3800a..aec32f9e4 100644
|
|||||||
+ * questions.
|
+ * questions.
|
||||||
+ *
|
+ *
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "gc/g1/g1MarkLiveWords.hpp"
|
#include "gc/g1/g1MarkLiveWords.hpp"
|
||||||
diff --git a/src/hotspot/share/gc/g1/g1MarkLiveWords.hpp b/src/hotspot/share/gc/g1/g1MarkLiveWords.hpp
|
diff --git a/src/hotspot/share/gc/g1/g1MarkLiveWords.hpp b/src/hotspot/share/gc/g1/g1MarkLiveWords.hpp
|
||||||
index a11a4ca52..e8632fe5d 100644
|
index a11a4ca52..e8632fe5d 100644
|
||||||
@ -144,7 +144,7 @@ index a11a4ca52..e8632fe5d 100644
|
|||||||
+ * questions.
|
+ * questions.
|
||||||
+ *
|
+ *
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SHARE_VM_GC_G1_G1MARKLIVEWORDS_HPP
|
#ifndef SHARE_VM_GC_G1_G1MARKLIVEWORDS_HPP
|
||||||
diff --git a/src/hotspot/share/gc/g1/g1MarkRegionCache.cpp b/src/hotspot/share/gc/g1/g1MarkRegionCache.cpp
|
diff --git a/src/hotspot/share/gc/g1/g1MarkRegionCache.cpp b/src/hotspot/share/gc/g1/g1MarkRegionCache.cpp
|
||||||
index 37922e8cf..1fb6d9929 100644
|
index 37922e8cf..1fb6d9929 100644
|
||||||
@ -179,7 +179,7 @@ index 37922e8cf..1fb6d9929 100644
|
|||||||
+ * questions.
|
+ * questions.
|
||||||
+ *
|
+ *
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "gc/g1/g1MarkRegionCache.hpp"
|
#include "gc/g1/g1MarkRegionCache.hpp"
|
||||||
diff --git a/src/hotspot/share/gc/g1/g1MarkRegionCache.hpp b/src/hotspot/share/gc/g1/g1MarkRegionCache.hpp
|
diff --git a/src/hotspot/share/gc/g1/g1MarkRegionCache.hpp b/src/hotspot/share/gc/g1/g1MarkRegionCache.hpp
|
||||||
index 0615fcab6..00d2931a6 100644
|
index 0615fcab6..00d2931a6 100644
|
||||||
@ -214,7 +214,7 @@ index 0615fcab6..00d2931a6 100644
|
|||||||
+ * questions.
|
+ * questions.
|
||||||
+ *
|
+ *
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SHARE_VM_GC_G1_G1MARKREGIONCACHE_HPP
|
#ifndef SHARE_VM_GC_G1_G1MARKREGIONCACHE_HPP
|
||||||
diff --git a/test/hotspot/jtreg/compiler/c2/Test8217359.java b/test/hotspot/jtreg/compiler/c2/Test8217359.java
|
diff --git a/test/hotspot/jtreg/compiler/c2/Test8217359.java b/test/hotspot/jtreg/compiler/c2/Test8217359.java
|
||||||
index ca0d2cc75..533bdce4b 100644
|
index ca0d2cc75..533bdce4b 100644
|
||||||
@ -290,9 +290,9 @@ index 94c79c9c2..780c09211 100644
|
|||||||
/*
|
/*
|
||||||
- * Copyright (c) 2019, Huawei Technologies Co. Ltd. All rights reserved.
|
- * Copyright (c) 2019, Huawei Technologies Co. Ltd. All rights reserved.
|
||||||
+ * Copyright (c) 2019, Huawei Technologies Co., Ltd. All rights reserved.
|
+ * Copyright (c) 2019, Huawei Technologies Co., Ltd. All rights reserved.
|
||||||
|
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestSearchAlignment.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestSearchAlignment.java
|
diff --git a/test/hotspot/jtreg/compiler/loopopts/superword/TestSearchAlignment.java b/test/hotspot/jtreg/compiler/loopopts/superword/TestSearchAlignment.java
|
||||||
index 37be01524..5242adb43 100644
|
index 37be01524..5242adb43 100644
|
||||||
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestSearchAlignment.java
|
--- a/test/hotspot/jtreg/compiler/loopopts/superword/TestSearchAlignment.java
|
||||||
@ -337,7 +337,7 @@ index 2f892773b..2383c3a94 100644
|
|||||||
+ * questions.
|
+ * questions.
|
||||||
+ *
|
+ *
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
diff --git a/test/hotspot/jtreg/runtime/invokedynamic/DynamicConstantHelper.jasm b/test/hotspot/jtreg/runtime/invokedynamic/DynamicConstantHelper.jasm
|
diff --git a/test/hotspot/jtreg/runtime/invokedynamic/DynamicConstantHelper.jasm b/test/hotspot/jtreg/runtime/invokedynamic/DynamicConstantHelper.jasm
|
||||||
index 01ab0c9f1..4fa919e94 100644
|
index 01ab0c9f1..4fa919e94 100644
|
||||||
@ -367,4 +367,4 @@ index 000000000..85b49171c
|
|||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/version.txt
|
+++ b/version.txt
|
||||||
@@ -0,0 +1 @@
|
@@ -0,0 +1 @@
|
||||||
+11.0.17.0.13
|
+11.0.19.0.13
|
||||||
|
|||||||
@ -120,14 +120,14 @@ index 122a01901..c131bd493 100644
|
|||||||
+ File.separator + "security" + File.separator + "cacerts";
|
+ File.separator + "security" + File.separator + "cacerts";
|
||||||
|
|
||||||
// The numbers of certs now.
|
// The numbers of certs now.
|
||||||
- private static final int COUNT = 89;
|
- private static final int COUNT = 90;
|
||||||
+ private static final int COUNT = 86;
|
+ private static final int COUNT = 87;
|
||||||
|
|
||||||
// SHA-256 of cacerts, can be generated with
|
// SHA-256 of cacerts, can be generated with
|
||||||
// shasum -a 256 cacerts | sed -e 's/../&:/g' | tr '[:lower:]' '[:upper:]' | cut -c1-95
|
// shasum -a 256 cacerts | sed -e 's/../&:/g' | tr '[:lower:]' '[:upper:]' | cut -c1-95
|
||||||
private static final String CHECKSUM
|
private static final String CHECKSUM
|
||||||
- = "CC:AD:BB:49:70:97:3F:42:AD:73:91:A0:A2:C4:B8:AA:D1:95:59:F3:B3:22:09:2A:1F:2C:AB:04:47:08:EF:AA";
|
- = "21:8C:35:29:4C:E2:49:D2:83:30:DF:8B:5E:39:F8:8C:D6:C5:2B:59:05:32:74:E5:79:A5:91:9F:3C:57:B9:E3";
|
||||||
+ = "89:78:5A:96:F4:B2:68:4C:91:C0:32:2C:ED:2D:6B:3B:26:B8:37:C3:07:DD:9E:50:87:53:53:7A:24:98:97:E0";
|
+ = "D5:5B:7A:BD:8F:4A:DA:19:75:90:28:61:E7:40:6D:A2:54:F5:64:C0:F0:30:29:16:FB:46:9B:57:D5:F7:04:D7";
|
||||||
|
|
||||||
// map of cert alias to SHA-256 fingerprint
|
// map of cert alias to SHA-256 fingerprint
|
||||||
@SuppressWarnings("serial")
|
@SuppressWarnings("serial")
|
||||||
|
|||||||
Binary file not shown.
@ -114,7 +114,7 @@
|
|||||||
|
|
||||||
# New Version-String scheme-style defines
|
# New Version-String scheme-style defines
|
||||||
%global majorver 11
|
%global majorver 11
|
||||||
%global securityver 17
|
%global securityver 19
|
||||||
# buildjdkver is usually same as %%{majorver},
|
# buildjdkver is usually same as %%{majorver},
|
||||||
# but in time of bootstrap of next jdk, it is majorver-1,
|
# but in time of bootstrap of next jdk, it is majorver-1,
|
||||||
# and this it is better to change it here, on single place
|
# and this it is better to change it here, on single place
|
||||||
@ -130,12 +130,12 @@
|
|||||||
%global origin_nice OpenJDK
|
%global origin_nice OpenJDK
|
||||||
%global top_level_dir_name %{origin}
|
%global top_level_dir_name %{origin}
|
||||||
%global minorver 0
|
%global minorver 0
|
||||||
%global buildver 8
|
%global buildver 7
|
||||||
%global patchver 0
|
%global patchver 0
|
||||||
|
|
||||||
%global project jdk-updates
|
%global project jdk-updates
|
||||||
%global repo jdk11u
|
%global repo jdk11u
|
||||||
%global revision jdk-11.0.17-ga
|
%global revision jdk-11.0.19-ga
|
||||||
%global full_revision %{project}-%{repo}-%{revision}
|
%global full_revision %{project}-%{repo}-%{revision}
|
||||||
# priority must be 7 digits in total
|
# priority must be 7 digits in total
|
||||||
# setting to 1, so debug ones can have 0
|
# setting to 1, so debug ones can have 0
|
||||||
@ -773,7 +773,7 @@ License: ASL 1.1 and ASL 2.0 and BSD and BSD with advertising and GPL+ and GPLv
|
|||||||
URL: http://openjdk.java.net/
|
URL: http://openjdk.java.net/
|
||||||
|
|
||||||
|
|
||||||
Source0: %{full_revision}.tar.xz
|
Source0: %{full_revision}.tar.gz
|
||||||
|
|
||||||
# Use 'icedtea_sync.sh' to update the following
|
# Use 'icedtea_sync.sh' to update the following
|
||||||
# They are based on code contained in the IcedTea project (3.x).
|
# They are based on code contained in the IcedTea project (3.x).
|
||||||
@ -801,7 +801,6 @@ Patch1000: rh1648249-add_commented_out_nss_cfg_provider_to_java_security.patch
|
|||||||
#
|
#
|
||||||
#############################################
|
#############################################
|
||||||
|
|
||||||
Patch2: 8225648-TESTBUG-java-lang-annotation-loaderLeak-Main.patch
|
|
||||||
Patch5: Add-ability-to-configure-third-port-for-remote-JMX.patch
|
Patch5: Add-ability-to-configure-third-port-for-remote-JMX.patch
|
||||||
Patch6: 8214527-AArch64-ZGC-for-Aarch64.patch
|
Patch6: 8214527-AArch64-ZGC-for-Aarch64.patch
|
||||||
Patch7: 8224675-Late-GC-barrier-insertion-for-ZGC.patch
|
Patch7: 8224675-Late-GC-barrier-insertion-for-ZGC.patch
|
||||||
@ -875,8 +874,9 @@ Patch89: downgrade-the-symver-of-memcpy-GLIBC_2.14-on-x86.patch
|
|||||||
|
|
||||||
# 11.0.16
|
# 11.0.16
|
||||||
Patch90: fix_Internal_and_external_code_inconsistency.patch
|
Patch90: fix_Internal_and_external_code_inconsistency.patch
|
||||||
Patch91: 8290705_fix_StringConcat_validate_mem_flow_asserts_with_unexpected_userStoreI.patch
|
|
||||||
|
|
||||||
|
# 11.0.18
|
||||||
|
Patch91: 8222289-Overhaul-logic-for-reading-writing-constant-pool-entries.patch
|
||||||
|
|
||||||
BuildRequires: elfutils-extra
|
BuildRequires: elfutils-extra
|
||||||
BuildRequires: autoconf
|
BuildRequires: autoconf
|
||||||
@ -1109,7 +1109,6 @@ fi
|
|||||||
pushd %{top_level_dir_name}
|
pushd %{top_level_dir_name}
|
||||||
|
|
||||||
# OpenJDK patches
|
# OpenJDK patches
|
||||||
%patch2 -p1
|
|
||||||
%patch5 -p1
|
%patch5 -p1
|
||||||
%patch6 -p1
|
%patch6 -p1
|
||||||
%patch7 -p1
|
%patch7 -p1
|
||||||
@ -1678,6 +1677,18 @@ cjc.mainProgram(arg)
|
|||||||
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon May 08 2023 wanghao <wanghao564@huawei.com> - 1:11.0.19.7-0
|
||||||
|
- update to 11.0.19+7(GA)
|
||||||
|
- deleted 8225648-TESTBUG-java-lang-annotation-loaderLeak-Main.patch
|
||||||
|
- modified Add-KAE-implementation.patch
|
||||||
|
- modified G1-iterate-region-by-bitmap-rather-than-obj-size-in.patch
|
||||||
|
- modified delete_expired_certificates.patch
|
||||||
|
- modified 8205921-Optimizing-best_of_2-work-stealing-queue-selection.patch
|
||||||
|
- add 8222289-Overhaul-logic-for-reading-writing-constant-pool-entries.patch
|
||||||
|
- modified 8224675-Late-GC-barrier-insertion-for-ZGC.patch
|
||||||
|
- modified 8231441-2-AArch64-Initial-SVE-backend-support.patch
|
||||||
|
- deleted 8290705_fix_StringConcat_validate_mem_flow_asserts_with_unexpected_userStoreI.patch
|
||||||
|
|
||||||
* Wed Oct 19 2022 DXwangg <wangjiawei80@huawei.com> - 1:11.0.17.8-0
|
* Wed Oct 19 2022 DXwangg <wangjiawei80@huawei.com> - 1:11.0.17.8-0
|
||||||
- update to 11.0.17+8(GA)
|
- update to 11.0.17+8(GA)
|
||||||
- modified G1-iterate-region-by-bitmap-rather-than-obj-size-in.patch
|
- modified G1-iterate-region-by-bitmap-rather-than-obj-size-in.patch
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user