mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-05 07:58:40 +00:00
Merge
This commit is contained in:
commit
df4d1c44ff
@ -962,7 +962,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
__ lea(d, Address(d, count, Address::lsl(exact_log2(-step))));
|
||||
}
|
||||
|
||||
Label done, tail;
|
||||
Label tail;
|
||||
|
||||
__ cmp(count, 16/granularity);
|
||||
__ br(Assembler::LO, tail);
|
||||
@ -987,7 +987,8 @@ class StubGenerator: public StubCodeGenerator {
|
||||
}
|
||||
// rscratch2 is the byte adjustment needed to align s.
|
||||
__ cbz(rscratch2, aligned);
|
||||
__ lsr(rscratch2, rscratch2, exact_log2(granularity));
|
||||
int shift = exact_log2(granularity);
|
||||
if (shift) __ lsr(rscratch2, rscratch2, shift);
|
||||
__ sub(count, count, rscratch2);
|
||||
|
||||
#if 0
|
||||
|
||||
@ -45,13 +45,6 @@ void VM_Version::initialize() {
|
||||
if( cache_line_size > AllocatePrefetchStepSize )
|
||||
AllocatePrefetchStepSize = cache_line_size;
|
||||
|
||||
assert(AllocatePrefetchLines > 0, "invalid value");
|
||||
if( AllocatePrefetchLines < 1 ) // set valid value in product VM
|
||||
AllocatePrefetchLines = 3;
|
||||
assert(AllocateInstancePrefetchLines > 0, "invalid value");
|
||||
if( AllocateInstancePrefetchLines < 1 ) // set valid value in product VM
|
||||
AllocateInstancePrefetchLines = 1;
|
||||
|
||||
AllocatePrefetchDistance = allocate_prefetch_distance();
|
||||
AllocatePrefetchStyle = allocate_prefetch_style();
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2016, 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
|
||||
@ -114,15 +114,20 @@ class RegisterSaver {
|
||||
|
||||
OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_frame_words,
|
||||
int* total_frame_words, bool verify_fpu, bool save_vectors) {
|
||||
int vect_words = 0;
|
||||
int num_xmm_regs = XMMRegisterImpl::number_of_registers;
|
||||
int ymm_bytes = num_xmm_regs * 16;
|
||||
int zmm_bytes = num_xmm_regs * 32;
|
||||
#ifdef COMPILER2
|
||||
if (save_vectors) {
|
||||
assert(UseAVX > 0, "512bit vectors are supported only with EVEX");
|
||||
assert(MaxVectorSize == 64, "only 512bit vectors are supported now");
|
||||
// Save upper half of ZMM/YMM registers :
|
||||
vect_words = 8 * 16 / wordSize;
|
||||
additional_frame_words += vect_words;
|
||||
assert(UseAVX > 0, "up to 512bit vectors are supported with EVEX");
|
||||
assert(MaxVectorSize <= 64, "up to 512bit vectors are supported now");
|
||||
// Save upper half of YMM registers
|
||||
int vect_bytes = ymm_bytes;
|
||||
if (UseAVX > 2) {
|
||||
// Save upper half of ZMM registers as well
|
||||
vect_bytes += zmm_bytes;
|
||||
}
|
||||
additional_frame_words += vect_bytes / wordSize;
|
||||
}
|
||||
#else
|
||||
assert(!save_vectors, "vectors are generated only by C2");
|
||||
@ -185,13 +190,14 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
|
||||
|
||||
off = xmm0_off;
|
||||
delta = xmm1_off - off;
|
||||
if(UseSSE == 1) { // Save the XMM state
|
||||
if(UseSSE == 1) {
|
||||
// Save the XMM state
|
||||
for (int n = 0; n < num_xmm_regs; n++) {
|
||||
__ movflt(Address(rsp, off*wordSize), as_XMMRegister(n));
|
||||
off += delta;
|
||||
}
|
||||
} else if(UseSSE >= 2) {
|
||||
// Save whole 128bit (16 bytes) XMM regiters
|
||||
// Save whole 128bit (16 bytes) XMM registers
|
||||
for (int n = 0; n < num_xmm_regs; n++) {
|
||||
__ movdqu(Address(rsp, off*wordSize), as_XMMRegister(n));
|
||||
off += delta;
|
||||
@ -199,13 +205,14 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
|
||||
}
|
||||
|
||||
if (save_vectors) {
|
||||
assert(vect_words*wordSize == 128, "");
|
||||
__ subptr(rsp, 128); // Save upper half of YMM registes
|
||||
__ subptr(rsp, ymm_bytes);
|
||||
// Save upper half of YMM registers
|
||||
for (int n = 0; n < num_xmm_regs; n++) {
|
||||
__ vextractf128h(Address(rsp, n*16), as_XMMRegister(n));
|
||||
}
|
||||
if (UseAVX > 2) {
|
||||
__ subptr(rsp, 256); // Save upper half of ZMM registes
|
||||
__ subptr(rsp, zmm_bytes);
|
||||
// Save upper half of ZMM registers
|
||||
for (int n = 0; n < num_xmm_regs; n++) {
|
||||
__ vextractf64x4h(Address(rsp, n*32), as_XMMRegister(n), 1);
|
||||
}
|
||||
@ -255,50 +262,59 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
|
||||
|
||||
void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_vectors) {
|
||||
int num_xmm_regs = XMMRegisterImpl::number_of_registers;
|
||||
int ymm_bytes = num_xmm_regs * 16;
|
||||
int zmm_bytes = num_xmm_regs * 32;
|
||||
// Recover XMM & FPU state
|
||||
int additional_frame_bytes = 0;
|
||||
#ifdef COMPILER2
|
||||
if (restore_vectors) {
|
||||
assert(UseAVX > 0, "512bit vectors are supported only with EVEX");
|
||||
assert(MaxVectorSize == 64, "only 512bit vectors are supported now");
|
||||
additional_frame_bytes = 128;
|
||||
assert(UseAVX > 0, "up to 512bit vectors are supported with EVEX");
|
||||
assert(MaxVectorSize <= 64, "up to 512bit vectors are supported now");
|
||||
// Save upper half of YMM registers
|
||||
additional_frame_bytes = ymm_bytes;
|
||||
if (UseAVX > 2) {
|
||||
// Save upper half of ZMM registers as well
|
||||
additional_frame_bytes += zmm_bytes;
|
||||
}
|
||||
}
|
||||
#else
|
||||
assert(!restore_vectors, "vectors are generated only by C2");
|
||||
#endif
|
||||
|
||||
if (restore_vectors) {
|
||||
assert(additional_frame_bytes == 128, "");
|
||||
if (UseAVX > 2) {
|
||||
// Restore upper half of ZMM registers.
|
||||
for (int n = 0; n < num_xmm_regs; n++) {
|
||||
__ vinsertf64x4h(as_XMMRegister(n), Address(rsp, n*32), 1);
|
||||
}
|
||||
__ addptr(rsp, additional_frame_bytes*2); // Save upper half of ZMM registes
|
||||
}
|
||||
// Restore upper half of YMM registes.
|
||||
for (int n = 0; n < num_xmm_regs; n++) {
|
||||
__ vinsertf128h(as_XMMRegister(n), Address(rsp, n*16));
|
||||
}
|
||||
__ addptr(rsp, additional_frame_bytes); // Save upper half of YMM registes
|
||||
}
|
||||
|
||||
int off = xmm0_off;
|
||||
int delta = xmm1_off - off;
|
||||
|
||||
if (UseSSE == 1) {
|
||||
// Restore XMM registers
|
||||
assert(additional_frame_bytes == 0, "");
|
||||
for (int n = 0; n < num_xmm_regs; n++) {
|
||||
__ movflt(as_XMMRegister(n), Address(rsp, off*wordSize));
|
||||
off += delta;
|
||||
}
|
||||
} else if (UseSSE >= 2) {
|
||||
// additional_frame_bytes only populated for the restore_vector case, else it is 0
|
||||
// Restore whole 128bit (16 bytes) XMM registers. Do this before restoring YMM and
|
||||
// ZMM because the movdqu instruction zeros the upper part of the XMM register.
|
||||
for (int n = 0; n < num_xmm_regs; n++) {
|
||||
__ movdqu(as_XMMRegister(n), Address(rsp, off*wordSize+additional_frame_bytes));
|
||||
off += delta;
|
||||
}
|
||||
}
|
||||
|
||||
if (restore_vectors) {
|
||||
if (UseAVX > 2) {
|
||||
// Restore upper half of ZMM registers.
|
||||
for (int n = 0; n < num_xmm_regs; n++) {
|
||||
__ vinsertf64x4h(as_XMMRegister(n), Address(rsp, n*32), 1);
|
||||
}
|
||||
__ addptr(rsp, zmm_bytes);
|
||||
}
|
||||
// Restore upper half of YMM registers.
|
||||
for (int n = 0; n < num_xmm_regs; n++) {
|
||||
__ vinsertf128h(as_XMMRegister(n), Address(rsp, n*16));
|
||||
}
|
||||
__ addptr(rsp, ymm_bytes);
|
||||
}
|
||||
|
||||
__ pop_FPU_state();
|
||||
__ addptr(rsp, FPU_regs_live*wordSize); // Pop FPU registers
|
||||
|
||||
@ -306,7 +322,6 @@ void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_ve
|
||||
__ popa();
|
||||
// Get the rbp, described implicitly by the frame sender code (no oopMap)
|
||||
__ pop(rbp);
|
||||
|
||||
}
|
||||
|
||||
void RegisterSaver::restore_result_registers(MacroAssembler* masm) {
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2016, 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
|
||||
@ -150,8 +150,8 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
|
||||
}
|
||||
#if defined(COMPILER2) || INCLUDE_JVMCI
|
||||
if (save_vectors) {
|
||||
assert(UseAVX > 0, "512bit vectors are supported only with EVEX");
|
||||
assert(MaxVectorSize == 64, "only 512bit vectors are supported now");
|
||||
assert(UseAVX > 0, "up to 512bit vectors are supported with EVEX");
|
||||
assert(MaxVectorSize <= 64, "up to 512bit vectors are supported now");
|
||||
}
|
||||
#else
|
||||
assert(!save_vectors, "vectors are generated only by C2 and JVMCI");
|
||||
@ -176,18 +176,18 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
|
||||
|
||||
// push cpu state handles this on EVEX enabled targets
|
||||
if (save_vectors) {
|
||||
// Save upper half of YMM registes(0..15)
|
||||
// Save upper half of YMM registers(0..15)
|
||||
int base_addr = XSAVE_AREA_YMM_BEGIN;
|
||||
for (int n = 0; n < 16; n++) {
|
||||
__ vextractf128h(Address(rsp, base_addr+n*16), as_XMMRegister(n));
|
||||
}
|
||||
if (VM_Version::supports_evex()) {
|
||||
// Save upper half of ZMM registes(0..15)
|
||||
// Save upper half of ZMM registers(0..15)
|
||||
base_addr = XSAVE_AREA_ZMM_BEGIN;
|
||||
for (int n = 0; n < 16; n++) {
|
||||
__ vextractf64x4h(Address(rsp, base_addr+n*32), as_XMMRegister(n), 1);
|
||||
}
|
||||
// Save full ZMM registes(16..num_xmm_regs)
|
||||
// Save full ZMM registers(16..num_xmm_regs)
|
||||
base_addr = XSAVE_AREA_UPPERBANK;
|
||||
off = 0;
|
||||
int vector_len = Assembler::AVX_512bit;
|
||||
@ -321,8 +321,8 @@ void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_ve
|
||||
|
||||
#if defined(COMPILER2) || INCLUDE_JVMCI
|
||||
if (restore_vectors) {
|
||||
assert(UseAVX > 0, "512bit vectors are supported only with EVEX");
|
||||
assert(MaxVectorSize == 64, "only 512bit vectors are supported now");
|
||||
assert(UseAVX > 0, "up to 512bit vectors are supported with EVEX");
|
||||
assert(MaxVectorSize <= 64, "up to 512bit vectors are supported now");
|
||||
}
|
||||
#else
|
||||
assert(!restore_vectors, "vectors are generated only by C2");
|
||||
@ -330,18 +330,18 @@ void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_ve
|
||||
|
||||
// On EVEX enabled targets everything is handled in pop fpu state
|
||||
if (restore_vectors) {
|
||||
// Restore upper half of YMM registes (0..15)
|
||||
// Restore upper half of YMM registers (0..15)
|
||||
int base_addr = XSAVE_AREA_YMM_BEGIN;
|
||||
for (int n = 0; n < 16; n++) {
|
||||
__ vinsertf128h(as_XMMRegister(n), Address(rsp, base_addr+n*16));
|
||||
}
|
||||
if (VM_Version::supports_evex()) {
|
||||
// Restore upper half of ZMM registes (0..15)
|
||||
// Restore upper half of ZMM registers (0..15)
|
||||
base_addr = XSAVE_AREA_ZMM_BEGIN;
|
||||
for (int n = 0; n < 16; n++) {
|
||||
__ vinsertf64x4h(as_XMMRegister(n), Address(rsp, base_addr+n*32), 1);
|
||||
}
|
||||
// Restore full ZMM registes(16..num_xmm_regs)
|
||||
// Restore full ZMM registers(16..num_xmm_regs)
|
||||
base_addr = XSAVE_AREA_UPPERBANK;
|
||||
int vector_len = Assembler::AVX_512bit;
|
||||
int off = 0;
|
||||
@ -351,7 +351,7 @@ void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_ve
|
||||
}
|
||||
} else {
|
||||
if (VM_Version::supports_evex()) {
|
||||
// Restore upper bank of ZMM registes(16..31) for double/float usage
|
||||
// Restore upper bank of ZMM registers(16..31) for double/float usage
|
||||
int base_addr = XSAVE_AREA_UPPERBANK;
|
||||
int off = 0;
|
||||
for (int n = 16; n < num_xmm_regs; n++) {
|
||||
|
||||
@ -1163,13 +1163,6 @@ void VM_Version::get_processor_features() {
|
||||
if( cache_line_size > AllocatePrefetchStepSize )
|
||||
AllocatePrefetchStepSize = cache_line_size;
|
||||
|
||||
assert(AllocatePrefetchLines > 0, "invalid value");
|
||||
if( AllocatePrefetchLines < 1 ) // set valid value in product VM
|
||||
AllocatePrefetchLines = 3;
|
||||
assert(AllocateInstancePrefetchLines > 0, "invalid value");
|
||||
if( AllocateInstancePrefetchLines < 1 ) // set valid value in product VM
|
||||
AllocateInstancePrefetchLines = 1;
|
||||
|
||||
AllocatePrefetchDistance = allocate_prefetch_distance();
|
||||
AllocatePrefetchStyle = allocate_prefetch_style();
|
||||
|
||||
@ -1183,7 +1176,9 @@ void VM_Version::get_processor_features() {
|
||||
}
|
||||
if (supports_sse4_2() && supports_ht()) { // Nehalem based cpus
|
||||
AllocatePrefetchDistance = 192;
|
||||
AllocatePrefetchLines = 4;
|
||||
if (FLAG_IS_DEFAULT(AllocatePrefetchLines)) {
|
||||
FLAG_SET_DEFAULT(AllocatePrefetchLines, 4);
|
||||
}
|
||||
}
|
||||
#ifdef COMPILER2
|
||||
if (supports_sse4_2()) {
|
||||
|
||||
@ -72,7 +72,7 @@ ciField::ciField(ciInstanceKlass* klass, int index): _known_to_link_with_put(NUL
|
||||
|
||||
assert(ciObjectFactory::is_initialized(), "not a shared field");
|
||||
|
||||
assert(klass->get_instanceKlass()->is_linked(), "must be linked before using its constan-pool");
|
||||
assert(klass->get_instanceKlass()->is_linked(), "must be linked before using its constant-pool");
|
||||
|
||||
constantPoolHandle cpool(thread, klass->get_instanceKlass()->constants());
|
||||
|
||||
@ -106,10 +106,31 @@ ciField::ciField(ciInstanceKlass* klass, int index): _known_to_link_with_put(NUL
|
||||
// even though we may not need to.
|
||||
int holder_index = cpool->klass_ref_index_at(index);
|
||||
bool holder_is_accessible;
|
||||
ciInstanceKlass* declared_holder =
|
||||
ciEnv::current(thread)->get_klass_by_index(cpool, holder_index,
|
||||
holder_is_accessible,
|
||||
klass)->as_instance_klass();
|
||||
|
||||
ciKlass* generic_declared_holder = ciEnv::current(thread)->get_klass_by_index(cpool, holder_index,
|
||||
holder_is_accessible,
|
||||
klass);
|
||||
|
||||
if (generic_declared_holder->is_array_klass()) {
|
||||
// If the declared holder of the field is an array class, assume that
|
||||
// the canonical holder of that field is java.lang.Object. Arrays
|
||||
// do not have fields; java.lang.Object is the only supertype of an
|
||||
// array type that can declare fields and is therefore the canonical
|
||||
// holder of the array type.
|
||||
//
|
||||
// Furthermore, the compilers assume that java.lang.Object does not
|
||||
// have any fields. Therefore, the field is not looked up. Instead,
|
||||
// the method returns partial information that will trigger special
|
||||
// handling in ciField::will_link and will result in a
|
||||
// java.lang.NoSuchFieldError exception being thrown by the compiled
|
||||
// code (the expected behavior in this case).
|
||||
_holder = ciEnv::current(thread)->Object_klass();
|
||||
_offset = -1;
|
||||
_is_constant = false;
|
||||
return;
|
||||
}
|
||||
|
||||
ciInstanceKlass* declared_holder = generic_declared_holder->as_instance_klass();
|
||||
|
||||
// The declared holder of this field may not have been loaded.
|
||||
// Bail out with partial field information.
|
||||
|
||||
@ -61,7 +61,7 @@ Node* AddNode::Identity(PhaseGVN* phase) {
|
||||
|
||||
//------------------------------commute----------------------------------------
|
||||
// Commute operands to move loads and constants to the right.
|
||||
static bool commute( Node *add, int con_left, int con_right ) {
|
||||
static bool commute(Node *add, bool con_left, bool con_right) {
|
||||
Node *in1 = add->in(1);
|
||||
Node *in2 = add->in(2);
|
||||
|
||||
@ -110,8 +110,8 @@ static bool commute( Node *add, int con_left, int con_right ) {
|
||||
Node *AddNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
const Type *t1 = phase->type( in(1) );
|
||||
const Type *t2 = phase->type( in(2) );
|
||||
int con_left = t1->singleton();
|
||||
int con_right = t2->singleton();
|
||||
bool con_left = t1->singleton();
|
||||
bool con_right = t2->singleton();
|
||||
|
||||
// Check for commutative operation desired
|
||||
if( commute(this,con_left,con_right) ) return this;
|
||||
|
||||
@ -3048,7 +3048,7 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) {
|
||||
// state of the loop. It's safe in this case to replace it with the
|
||||
// result_mem.
|
||||
_igvn.replace_node(store->in(MemNode::Memory), result_mem);
|
||||
_igvn.replace_node(exit, result_ctrl);
|
||||
lazy_replace(exit, result_ctrl);
|
||||
_igvn.replace_node(store, result_mem);
|
||||
// Any uses the increment outside of the loop become the loop limit.
|
||||
_igvn.replace_node(head->incr(), head->limit());
|
||||
|
||||
@ -755,8 +755,8 @@ bool PhaseIdealLoop::is_counted_loop( Node *x, IdealLoopTree *loop ) {
|
||||
set_loop(iff2, get_loop(iffalse));
|
||||
|
||||
// Lazy update of 'get_ctrl' mechanism.
|
||||
lazy_replace_proj( iffalse, iff2 );
|
||||
lazy_replace_proj( iftrue, ift2 );
|
||||
lazy_replace(iffalse, iff2);
|
||||
lazy_replace(iftrue, ift2);
|
||||
|
||||
// Swap names
|
||||
iffalse = iff2;
|
||||
|
||||
@ -693,13 +693,18 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
Node *get_ctrl_no_update( Node *i ) const {
|
||||
Node *get_ctrl_no_update_helper(Node *i) const {
|
||||
assert(has_ctrl(i), "should be control, not loop");
|
||||
return (Node*)(((intptr_t)_nodes[i->_idx]) & ~1);
|
||||
}
|
||||
|
||||
Node *get_ctrl_no_update(Node *i) const {
|
||||
assert( has_ctrl(i), "" );
|
||||
Node *n = (Node*)(((intptr_t)_nodes[i->_idx]) & ~1);
|
||||
Node *n = get_ctrl_no_update_helper(i);
|
||||
if (!n->in(0)) {
|
||||
// Skip dead CFG nodes
|
||||
do {
|
||||
n = (Node*)(((intptr_t)_nodes[n->_idx]) & ~1);
|
||||
n = get_ctrl_no_update_helper(n);
|
||||
} while (!n->in(0));
|
||||
n = find_non_split_ctrl(n);
|
||||
}
|
||||
@ -721,22 +726,15 @@ private:
|
||||
// from old_node to new_node to support the lazy update. Reference
|
||||
// replaces loop reference, since that is not needed for dead node.
|
||||
public:
|
||||
void lazy_update( Node *old_node, Node *new_node ) {
|
||||
assert( old_node != new_node, "no cycles please" );
|
||||
//old_node->set_req( 1, new_node /*NO DU INFO*/ );
|
||||
// Nodes always have DU info now, so re-use the side array slot
|
||||
// for this node to provide the forwarding pointer.
|
||||
_nodes.map( old_node->_idx, (Node*)((intptr_t)new_node + 1) );
|
||||
void lazy_update(Node *old_node, Node *new_node) {
|
||||
assert(old_node != new_node, "no cycles please");
|
||||
// Re-use the side array slot for this node to provide the
|
||||
// forwarding pointer.
|
||||
_nodes.map(old_node->_idx, (Node*)((intptr_t)new_node + 1));
|
||||
}
|
||||
void lazy_replace( Node *old_node, Node *new_node ) {
|
||||
_igvn.replace_node( old_node, new_node );
|
||||
lazy_update( old_node, new_node );
|
||||
}
|
||||
void lazy_replace_proj( Node *old_node, Node *new_node ) {
|
||||
assert( old_node->req() == 1, "use this for Projs" );
|
||||
_igvn.hash_delete(old_node); // Must hash-delete before hacking edges
|
||||
old_node->add_req( NULL );
|
||||
lazy_replace( old_node, new_node );
|
||||
void lazy_replace(Node *old_node, Node *new_node) {
|
||||
_igvn.replace_node(old_node, new_node);
|
||||
lazy_update(old_node, new_node);
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@ -2654,9 +2654,9 @@ bool PhaseMacroExpand::expand_macro_nodes() {
|
||||
eliminate_macro_nodes();
|
||||
|
||||
// Make sure expansion will not cause node limit to be exceeded.
|
||||
// Worst case is a macro node gets expanded into about 50 nodes.
|
||||
// Worst case is a macro node gets expanded into about 200 nodes.
|
||||
// Allow 50% more for optimization.
|
||||
if (C->check_node_count(C->macro_count() * 75, "out of nodes before macro expansion" ) )
|
||||
if (C->check_node_count(C->macro_count() * 300, "out of nodes before macro expansion" ) )
|
||||
return true;
|
||||
|
||||
// Eliminate Opaque and LoopLimit nodes. Do it after all loop optimizations.
|
||||
|
||||
@ -472,7 +472,7 @@ void PhaseIdealLoop::do_split_if( Node *iff ) {
|
||||
|
||||
// Replace in the graph with lazy-update mechanism
|
||||
new_iff->set_req(0, new_iff); // hook self so it does not go dead
|
||||
lazy_replace_proj( ifp, ifpx );
|
||||
lazy_replace(ifp, ifpx);
|
||||
new_iff->set_req(0, region);
|
||||
|
||||
// Record bits for later xforms
|
||||
|
||||
@ -1334,6 +1334,65 @@ Node *BoolNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
return new BoolNode( ncmp, _test.negate() );
|
||||
}
|
||||
|
||||
// Change ((x & m) u<= m) or ((m & x) u<= m) to always true
|
||||
// Same with ((x & m) u< m+1) and ((m & x) u< m+1)
|
||||
if (cop == Op_CmpU &&
|
||||
cmp1->Opcode() == Op_AndI) {
|
||||
Node* bound = NULL;
|
||||
if (_test._test == BoolTest::le) {
|
||||
bound = cmp2;
|
||||
} else if (_test._test == BoolTest::lt &&
|
||||
cmp2->Opcode() == Op_AddI &&
|
||||
cmp2->in(2)->find_int_con(0) == 1) {
|
||||
bound = cmp2->in(1);
|
||||
}
|
||||
if (cmp1->in(2) == bound || cmp1->in(1) == bound) {
|
||||
return ConINode::make(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Change ((x & (m - 1)) u< m) into (m > 0)
|
||||
// This is the off-by-one variant of the above
|
||||
if (cop == Op_CmpU &&
|
||||
_test._test == BoolTest::lt &&
|
||||
cmp1->Opcode() == Op_AndI) {
|
||||
Node* l = cmp1->in(1);
|
||||
Node* r = cmp1->in(2);
|
||||
for (int repeat = 0; repeat < 2; repeat++) {
|
||||
bool match = r->Opcode() == Op_AddI && r->in(2)->find_int_con(0) == -1 &&
|
||||
r->in(1) == cmp2;
|
||||
if (match) {
|
||||
// arraylength known to be non-negative, so a (arraylength != 0) is sufficient,
|
||||
// but to be compatible with the array range check pattern, use (arraylength u> 0)
|
||||
Node* ncmp = cmp2->Opcode() == Op_LoadRange
|
||||
? phase->transform(new CmpUNode(cmp2, phase->intcon(0)))
|
||||
: phase->transform(new CmpINode(cmp2, phase->intcon(0)));
|
||||
return new BoolNode(ncmp, BoolTest::gt);
|
||||
} else {
|
||||
// commute and try again
|
||||
l = cmp1->in(2);
|
||||
r = cmp1->in(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Change (arraylength <= 0) or (arraylength == 0)
|
||||
// into (arraylength u<= 0)
|
||||
// Also change (arraylength != 0) into (arraylength u> 0)
|
||||
// The latter version matches the code pattern generated for
|
||||
// array range checks, which will more likely be optimized later.
|
||||
if (cop == Op_CmpI &&
|
||||
cmp1->Opcode() == Op_LoadRange &&
|
||||
cmp2->find_int_con(-1) == 0) {
|
||||
if (_test._test == BoolTest::le || _test._test == BoolTest::eq) {
|
||||
Node* ncmp = phase->transform(new CmpUNode(cmp1, cmp2));
|
||||
return new BoolNode(ncmp, BoolTest::le);
|
||||
} else if (_test._test == BoolTest::ne) {
|
||||
Node* ncmp = phase->transform(new CmpUNode(cmp1, cmp2));
|
||||
return new BoolNode(ncmp, BoolTest::gt);
|
||||
}
|
||||
}
|
||||
|
||||
// Change "bool eq/ne (cmp (Conv2B X) 0)" into "bool eq/ne (cmp X 0)".
|
||||
// This is a standard idiom for branching on a boolean value.
|
||||
Node *c2b = cmp1;
|
||||
@ -1496,4 +1555,3 @@ const Type* Log10DNode::Value(PhaseGVN* phase) const {
|
||||
double d = t1->getd();
|
||||
return TypeD::make( StubRoutines::intrinsic_log10( d ) );
|
||||
}
|
||||
|
||||
|
||||
@ -118,27 +118,46 @@ Flag::Error AllocatePrefetchInstrConstraintFunc(intx value, bool verbose) {
|
||||
}
|
||||
|
||||
Flag::Error AllocatePrefetchStepSizeConstraintFunc(intx value, bool verbose) {
|
||||
if (value < 1 || value > max_jint) {
|
||||
intx max_value = 512;
|
||||
if (value < 1 || value > max_value) {
|
||||
CommandLineError::print(verbose,
|
||||
"AllocatePrefetchStepSize (" INTX_FORMAT ") "
|
||||
"must be between 1 and %d\n",
|
||||
AllocatePrefetchStepSize,
|
||||
max_jint);
|
||||
max_value);
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
}
|
||||
|
||||
if (AllocatePrefetchDistance % AllocatePrefetchStepSize != 0) {
|
||||
CommandLineError::print(verbose,
|
||||
"AllocatePrefetchDistance (" INTX_FORMAT ") "
|
||||
"%% AllocatePrefetchStepSize (" INTX_FORMAT ") "
|
||||
"= " INTX_FORMAT " "
|
||||
"must be 0\n",
|
||||
AllocatePrefetchDistance, AllocatePrefetchStepSize,
|
||||
AllocatePrefetchDistance % AllocatePrefetchStepSize);
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
}
|
||||
CommandLineError::print(verbose,
|
||||
"AllocatePrefetchDistance (" INTX_FORMAT ") "
|
||||
"%% AllocatePrefetchStepSize (" INTX_FORMAT ") "
|
||||
"= " INTX_FORMAT " "
|
||||
"must be 0\n",
|
||||
AllocatePrefetchDistance, AllocatePrefetchStepSize,
|
||||
AllocatePrefetchDistance % AllocatePrefetchStepSize);
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
}
|
||||
|
||||
return Flag::SUCCESS;
|
||||
/* The limit of 64 for the quotient of AllocatePrefetchDistance and AllocatePrefetchSize
|
||||
* originates from the limit of 64 for AllocatePrefetchLines/AllocateInstancePrefetchLines.
|
||||
* If AllocatePrefetchStyle == 2, the quotient from above is used in PhaseMacroExpand::prefetch_allocation()
|
||||
* to determine the number of lines to prefetch. For other values of AllocatePrefetchStyle,
|
||||
* AllocatePrefetchDistance and AllocatePrefetchSize is used. For consistency, all these
|
||||
* quantities must have the same limit (64 in this case).
|
||||
*/
|
||||
if (AllocatePrefetchDistance / AllocatePrefetchStepSize > 64) {
|
||||
CommandLineError::print(verbose,
|
||||
"AllocatePrefetchDistance (" INTX_FORMAT ") too large or "
|
||||
"AllocatePrefetchStepSize (" INTX_FORMAT ") too small; "
|
||||
"try decreasing/increasing values so that "
|
||||
"AllocatePrefetchDistance / AllocatePrefetchStepSize <= 64\n",
|
||||
AllocatePrefetchDistance, AllocatePrefetchStepSize,
|
||||
AllocatePrefetchDistance % AllocatePrefetchStepSize);
|
||||
return Flag::VIOLATES_CONSTRAINT;
|
||||
}
|
||||
|
||||
return Flag::SUCCESS;
|
||||
}
|
||||
|
||||
Flag::Error CompileThresholdConstraintFunc(intx value, bool verbose) {
|
||||
|
||||
@ -2966,16 +2966,16 @@ public:
|
||||
\
|
||||
product(intx, AllocatePrefetchLines, 3, \
|
||||
"Number of lines to prefetch ahead of array allocation pointer") \
|
||||
range(1, max_jint / 2) \
|
||||
range(1, 64) \
|
||||
\
|
||||
product(intx, AllocateInstancePrefetchLines, 1, \
|
||||
"Number of lines to prefetch ahead of instance allocation " \
|
||||
"pointer") \
|
||||
range(1, max_jint / 2) \
|
||||
range(1, 64) \
|
||||
\
|
||||
product(intx, AllocatePrefetchStepSize, 16, \
|
||||
"Step size in bytes of sequential prefetch instructions") \
|
||||
range(1, max_jint) \
|
||||
range(1, 512) \
|
||||
constraint(AllocatePrefetchStepSizeConstraintFunc,AfterMemoryInit)\
|
||||
\
|
||||
product(intx, AllocatePrefetchInstr, 0, \
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
/*
|
||||
* @test TestCompilerDirectivesCompatibilityBase
|
||||
* @bug 8137167
|
||||
* @library /testlibrary /../../test/lib
|
||||
* @library /testlibrary /test/lib
|
||||
* @modules java.base/sun.misc
|
||||
* java.compiler
|
||||
* java.management
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
/*
|
||||
* @test TestCompilerDirectivesCompatibilityCommandOff
|
||||
* @bug 8137167
|
||||
* @library /testlibrary /../../test/lib
|
||||
* @library /testlibrary /test/lib
|
||||
* @modules java.base/sun.misc
|
||||
* java.compiler
|
||||
* java.management
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
/*
|
||||
* @test TestCompilerDirectivesCompatibilityCommandOn
|
||||
* @bug 8137167
|
||||
* @library /testlibrary /../../test/lib
|
||||
* @library /testlibrary /test/lib
|
||||
* @modules java.base/sun.misc
|
||||
* java.compiler
|
||||
* java.management
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
/*
|
||||
* @test TestCompilerDirectivesCompatibilityFlag
|
||||
* @bug 8137167
|
||||
* @library /testlibrary /../../test/lib
|
||||
* @library /testlibrary /test/lib
|
||||
* @modules java.base/sun.misc
|
||||
* java.compiler
|
||||
* java.management
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests CompileCommand=compileonly
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.commandfile.CompileOnlyTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests CompileCommand=exclude
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.commandfile.ExcludeTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests CompileCommand=log
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.commandfile.LogTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests CompileCommand=print
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.commandfile.PrintTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests CompileCommand=compileonly
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.commands.CompileOnlyTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests CompileCommand=exclude
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.commands.ExcludeTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests CompileCommand=log
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.commands.LogTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests CompileCommand=print
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.commands.PrintTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests directives to be able to compile only specified methods
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.directives.CompileOnlyTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests directives to be able to exclude methods from compilation
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.directives.ExcludeTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests directives to be able to turn on LogCompilation
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.directives.LogTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests directives to be able to turn on print_assembly
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.directives.PrintTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests directives to be able to add and remove directives
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.jcmd.AddAndRemoveTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests jcmd to be able to add a directive to compile only specified methods
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.jcmd.AddCompileOnlyTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests jcmd to be able to add a directive to exclude only specified methods
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.jcmd.AddExcludeTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Tests jcmd to be able to add a directive to log only specified methods
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.jcmd.AddLogTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
* @bug 8137167
|
||||
* @summary Tests jcmd to be able to add a directive to print assembly
|
||||
* only for specified methods
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.jcmd.AddPrintAssemblyTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Randomly generates commands with random types
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.mixed.RandomCommandsTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -25,7 +25,7 @@
|
||||
* @test
|
||||
* @bug 8137167
|
||||
* @summary Randomly generates valid commands with random types
|
||||
* @library /testlibrary /../../test/lib /compiler/testlibrary ../share /
|
||||
* @library /testlibrary /test/lib /compiler/testlibrary ../share /
|
||||
* @build compiler.compilercontrol.mixed.RandomValidCommandsTest
|
||||
* pool.sub.* pool.subpack.* sun.hotspot.WhiteBox
|
||||
* compiler.testlibrary.CompilerUtils compiler.compilercontrol.share.actions.*
|
||||
|
||||
@ -32,8 +32,8 @@ import java.util.Arrays;
|
||||
public enum Command {
|
||||
COMPILEONLY("compileonly", ".*", "-Xbatch"),
|
||||
EXCLUDE("exclude", "", "-Xbatch"),
|
||||
INLINE("inline", ".*"),
|
||||
DONTINLINE("dontinline", ""),
|
||||
INLINE("inline", ".*", "-Xbatch"),
|
||||
DONTINLINE("dontinline", "", "-Xbatch"),
|
||||
LOG("log", "", "-XX:+UnlockDiagnosticVMOptions",
|
||||
"-XX:+LogCompilation", "-XX:LogFile=" + LogProcessor.LOG_FILE),
|
||||
PRINT("print", ""),
|
||||
|
||||
@ -27,7 +27,7 @@ import jdk.test.lib.ProcessTools;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @library /testlibrary /../../test/lib /compiler/whitebox
|
||||
* @library /testlibrary /test/lib /compiler/whitebox
|
||||
* /compiler/testlibrary /compiler/codegen/7184394
|
||||
* @modules java.base/sun.misc
|
||||
* java.management
|
||||
|
||||
@ -28,7 +28,7 @@ import jdk.test.lib.ProcessTools;
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @library /testlibrary /../../test/lib /compiler/whitebox
|
||||
* @library /testlibrary /test/lib /compiler/whitebox
|
||||
* /compiler/testlibrary /compiler/codegen/7184394
|
||||
* @modules java.base/sun.misc
|
||||
* java.management
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
/*
|
||||
* @test
|
||||
* @bug 8138651
|
||||
* @library /testlibrary /../../test/lib
|
||||
* @library /testlibrary /test/lib
|
||||
* @build IntrinsicDisabledTest
|
||||
* @run main ClassFileInstaller sun.hotspot.WhiteBox
|
||||
* sun.hotspot.WhiteBox$WhiteBoxPermission
|
||||
|
||||
@ -42,7 +42,7 @@ import jdk.test.lib.Platform;
|
||||
* @test
|
||||
* @bug 8130150 8131779 8139907
|
||||
* @summary Verify that the Montgomery multiply and square intrinsic works and correctly checks their arguments.
|
||||
* @library /testlibrary /../../test/lib
|
||||
* @library /testlibrary /test/lib
|
||||
* @library /testlibrary
|
||||
* @build MontgomeryMultiplyTest
|
||||
* @run main ClassFileInstaller sun.hotspot.WhiteBox
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
* @test
|
||||
* @bug 8145336
|
||||
* @summary PPC64: fix string intrinsics after CompactStrings change
|
||||
* @library /testlibrary /../../test/lib
|
||||
* @library /testlibrary /test/lib
|
||||
* @build sun.hotspot.WhiteBox
|
||||
* @run main ClassFileInstaller sun.hotspot.WhiteBox
|
||||
* sun.hotspot.WhiteBox$WhiteBoxPermission
|
||||
|
||||
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 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 8147645
|
||||
* @summary Array.fill intrinsification code doesn't mark replaced control as dead
|
||||
* @run main/othervm -XX:-TieredCompilation -XX:CompileCommand=dontinline,TestArraysFillDeadControl::dont_inline TestArraysFillDeadControl
|
||||
*
|
||||
*/
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class TestArraysFillDeadControl {
|
||||
|
||||
static void dont_inline() {
|
||||
}
|
||||
|
||||
static int i = 1;
|
||||
|
||||
public static void main(String[] args) {
|
||||
for (int j = 0; j < 200000; j++) {
|
||||
int[] a = new int[2];
|
||||
int b = i;
|
||||
|
||||
Arrays.fill(a, 1);
|
||||
Arrays.fill(a, 1+b);
|
||||
|
||||
dont_inline();
|
||||
}
|
||||
}
|
||||
}
|
||||
161
hotspot/test/compiler/rangechecks/PowerOf2SizedArraysChecks.java
Normal file
161
hotspot/test/compiler/rangechecks/PowerOf2SizedArraysChecks.java
Normal file
@ -0,0 +1,161 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 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 8003585
|
||||
* @summary strength reduce or eliminate range checks for power-of-two sized arrays
|
||||
* @run main/othervm -XX:CompileCommand=compileonly,PowerOf2SizedArraysChecks::test* -XX:-BackgroundCompilation PowerOf2SizedArraysChecks
|
||||
*
|
||||
*/
|
||||
|
||||
import java.util.function.*;
|
||||
|
||||
public class PowerOf2SizedArraysChecks {
|
||||
|
||||
static void check_result(String name, int x, int m, boolean expected, boolean res) {
|
||||
if (expected != res) {
|
||||
throw new RuntimeException("Bad result in " + name + " for x = " + x + " m = " + m + " expected " + expected + " got " + res);
|
||||
}
|
||||
}
|
||||
|
||||
static void helper(String name, BiFunction<Integer, int[], Boolean> test, int[] x_values, int[] m_values, boolean[][] expected) {
|
||||
for (int i = 0; i < x_values.length; i++) {
|
||||
int x = x_values[i];
|
||||
for (int j = 0; j < m_values.length; j++) {
|
||||
int m = m_values[j];
|
||||
int[] array = new int[m];
|
||||
boolean res = test.apply(x, array);
|
||||
check_result(name, x, m, expected[i][j], res);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void check_result(String name, int m, boolean expected, boolean res) {
|
||||
if (expected != res) {
|
||||
throw new RuntimeException("Bad result in " + name + " for m = " + m + " expected " + expected + " got " + res);
|
||||
}
|
||||
}
|
||||
|
||||
static void helper2(String name, Function<int[], Boolean> test, int[] m_values, boolean[] expected) {
|
||||
for (int j = 0; j < m_values.length; j++) {
|
||||
int m = m_values[j];
|
||||
int[] array = new int[m];
|
||||
boolean res = test.apply(array);
|
||||
check_result(name, m, expected[j], res);
|
||||
}
|
||||
}
|
||||
|
||||
// ((x & m) u<= m) is always true
|
||||
static boolean test1(int x, int[] array) {
|
||||
int m = array.length;
|
||||
if ((x & m) < 0 || (x & m) > m) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// ((x & (m - 1)) u< m) iff (m > 0)
|
||||
static boolean test2(int x, int[] array) {
|
||||
int m = array.length;
|
||||
if ((x & (m-1)) < 0 || (x & (m-1)) >= m) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static boolean test3(int x, int[] array) {
|
||||
try {
|
||||
int v = array[x & (array.length-1)];
|
||||
} catch(ArrayIndexOutOfBoundsException aioobe) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// arraylength <= 0 to arraylength u<= 0
|
||||
static boolean test4(int[] array) {
|
||||
if (array.length <= 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// arraylength == 0 to arraylength u<= 0
|
||||
static boolean test5(int[] array) {
|
||||
if (array.length == 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
// arraylength != 0 to arraylength u> 0
|
||||
static boolean test6(int[] array) {
|
||||
if (array.length != 0) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static public void main(String[] args) {
|
||||
int[] x_values = {-10, -5, 0, 5, 8, 16, 100};
|
||||
int[] m_values = { 16, 10, 0 };
|
||||
|
||||
boolean[][] test1_expected = new boolean[x_values.length][m_values.length];
|
||||
for (int i = 0; i < x_values.length; i++) {
|
||||
for (int j = 0; j < m_values.length; j++) {
|
||||
test1_expected[i][j] = true;
|
||||
}
|
||||
}
|
||||
|
||||
boolean[][] test2_expected = new boolean[x_values.length][m_values.length];
|
||||
for (int i = 0; i < x_values.length; i++) {
|
||||
for (int j = 0; j < m_values.length; j++) {
|
||||
test2_expected[i][j] = (m_values[j] > 0);
|
||||
}
|
||||
}
|
||||
|
||||
boolean[] test4_expected = new boolean[m_values.length];
|
||||
for (int i = 0; i < m_values.length; i++) {
|
||||
test4_expected[i] = (m_values[i] > 0);
|
||||
}
|
||||
boolean[] test5_expected = new boolean[m_values.length];
|
||||
for (int i = 0; i < m_values.length; i++) {
|
||||
test5_expected[i] = (m_values[i] != 0);
|
||||
}
|
||||
boolean[] test6_expected = new boolean[m_values.length];
|
||||
for (int i = 0; i < m_values.length; i++) {
|
||||
test6_expected[i] = (m_values[i] == 0);
|
||||
}
|
||||
|
||||
for (int i = 0; i < 20000; i++) {
|
||||
helper("test1", PowerOf2SizedArraysChecks::test1, x_values, m_values, test1_expected);
|
||||
helper("test2", PowerOf2SizedArraysChecks::test2, x_values, m_values, test2_expected);
|
||||
helper("test3", PowerOf2SizedArraysChecks::test3, x_values, m_values, test2_expected);
|
||||
helper2("test4", PowerOf2SizedArraysChecks::test4, m_values, test4_expected);
|
||||
helper2("test5", PowerOf2SizedArraysChecks::test5, m_values, test5_expected);
|
||||
helper2("test6", PowerOf2SizedArraysChecks::test6, m_values, test6_expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (c) 2016, 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 8148490
|
||||
* @summary Test correct saving and restoring of vector registers at safepoints.
|
||||
* @run main/othervm -Xbatch -XX:-TieredCompilation -XX:CompileCommand=exclude,TestRegisterRestoring::main -XX:+SafepointALot TestRegisterRestoring
|
||||
*/
|
||||
public class TestRegisterRestoring {
|
||||
public static void main(String args[]) throws Exception {
|
||||
// Initialize
|
||||
float[] array = new float[100];
|
||||
for (int i = 0; i < array.length; ++i) {
|
||||
array[i] = 0;
|
||||
}
|
||||
// Test
|
||||
for (int j = 0; j < 20_000; ++j) {
|
||||
increment(array);
|
||||
// Check result
|
||||
for (int i = 0; i < array.length; i++) {
|
||||
if (array[i] != 10_000) {
|
||||
throw new RuntimeException("Test failed: array[" + i + "] = " + array[i] + " but should be 10.000");
|
||||
}
|
||||
array[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void increment(float[] array) {
|
||||
// Loop with safepoint
|
||||
for (long l = 0; l < 10_000; l++) {
|
||||
// Vectorized loop
|
||||
for (int i = 0; i < array.length; ++i) {
|
||||
array[i] += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
* @test TestStableMemoryBarrier
|
||||
* @bug 8139758
|
||||
* @summary tests memory barrier correctly inserted for stable fields
|
||||
* @library /testlibrary /../../test/lib
|
||||
* @library /testlibrary /test/lib
|
||||
*
|
||||
* @run main/bootclasspath -Xcomp -XX:CompileOnly=::testCompile
|
||||
* java.lang.invoke.TestStableMemoryBarrier
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
* @summary C2 can not handle returns with inccompatible interface arrays
|
||||
* @modules java.base/jdk.internal.org.objectweb.asm
|
||||
* java.base/sun.misc
|
||||
* @library /testlibrary /../../test/lib
|
||||
* @library /testlibrary /test/lib
|
||||
* @build sun.hotspot.WhiteBox
|
||||
* @run main ClassFileInstaller sun.hotspot.WhiteBox
|
||||
* sun.hotspot.WhiteBox$WhiteBoxPermission
|
||||
|
||||
@ -92,33 +92,36 @@ public class AllocationCodeBlobTest {
|
||||
|
||||
private void test() {
|
||||
System.out.printf("type %s%n", type);
|
||||
long start = getUsage();
|
||||
long addr = WHITE_BOX.allocateCodeBlob(SIZE, type.id);
|
||||
Asserts.assertNE(0, addr, "allocation failed");
|
||||
|
||||
// Measure the code cache usage after allocate/free.
|
||||
long start = getUsage();
|
||||
long addr1 = WHITE_BOX.allocateCodeBlob(SIZE, type.id);
|
||||
long firstAllocation = getUsage();
|
||||
WHITE_BOX.freeCodeBlob(addr1);
|
||||
long firstFree = getUsage();
|
||||
long addr2 = WHITE_BOX.allocateCodeBlob(SIZE, type.id);
|
||||
long secondAllocation = getUsage();
|
||||
WHITE_BOX.freeCodeBlob(addr2);
|
||||
|
||||
// The following code may trigger resolving of invokedynamic
|
||||
// instructions and therefore method handle intrinsic creation
|
||||
// in the code cache. Make sure this is executed after measuring
|
||||
// the code cache usage.
|
||||
Asserts.assertNE(0, addr1, "first allocation failed");
|
||||
Asserts.assertNE(0, addr2, "second allocation failed");
|
||||
Asserts.assertLTE(start + SIZE, firstAllocation,
|
||||
"allocation should increase memory usage: "
|
||||
+ start + " + " + SIZE + " <= " + firstAllocation);
|
||||
|
||||
WHITE_BOX.freeCodeBlob(addr);
|
||||
long firstFree = getUsage();
|
||||
Asserts.assertLTE(firstFree, firstAllocation,
|
||||
"free shouldn't increase memory usage: "
|
||||
+ firstFree + " <= " + firstAllocation);
|
||||
|
||||
addr = WHITE_BOX.allocateCodeBlob(SIZE, type.id);
|
||||
Asserts.assertNE(0, addr, "allocation failed");
|
||||
|
||||
long secondAllocation = getUsage();
|
||||
Asserts.assertEQ(firstAllocation, secondAllocation);
|
||||
|
||||
WHITE_BOX.freeCodeBlob(addr);
|
||||
System.out.println("allocating till possible...");
|
||||
ArrayList<Long> blobs = new ArrayList<>();
|
||||
int size = (int) (CODE_CACHE_SIZE >> 7);
|
||||
while ((addr = WHITE_BOX.allocateCodeBlob(size, type.id)) != 0) {
|
||||
blobs.add(addr);
|
||||
while ((addr1 = WHITE_BOX.allocateCodeBlob(size, type.id)) != 0) {
|
||||
blobs.add(addr1);
|
||||
}
|
||||
for (Long blob : blobs) {
|
||||
WHITE_BOX.freeCodeBlob(blob);
|
||||
|
||||
@ -27,7 +27,7 @@
|
||||
* @summary Check that G1 does not report empty PLAB statistics in the first evacuation.
|
||||
* @requires vm.gc=="G1" | vm.gc=="null"
|
||||
* @key gc
|
||||
* @library /testlibrary /../../test/lib
|
||||
* @library /testlibrary /test/lib
|
||||
* @build sun.hotspot.WhiteBox
|
||||
* @run main ClassFileInstaller sun.hotspot.WhiteBox
|
||||
* @run driver TestPLABOutput
|
||||
|
||||
@ -24,6 +24,7 @@
|
||||
/*
|
||||
* @test IntxTest
|
||||
* @bug 8028756
|
||||
* @ignore 8148758
|
||||
* @library /testlibrary /test/lib
|
||||
* @modules java.management/sun.management
|
||||
* @build IntxTest
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user