--- a/hotspot/src/share/vm/code/codeCache.cpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/code/codeCache.cpp Mon Nov 09 20:01:29 2015 +0000
@@ -133,13 +133,9 @@
address CodeCache::_low_bound = 0;
address CodeCache::_high_bound = 0;
-int CodeCache::_number_of_blobs = 0;
-int CodeCache::_number_of_adapters = 0;
-int CodeCache::_number_of_nmethods = 0;
int CodeCache::_number_of_nmethods_with_dependencies = 0;
bool CodeCache::_needs_cache_clean = false;
nmethod* CodeCache::_scavenge_root_nmethods = NULL;
-int CodeCache::_codemem_full_count = 0;
// Initialize array of CodeHeaps
GrowableArray<CodeHeap*>* CodeCache::_heaps = new(ResourceObj::C_HEAP, mtCode) GrowableArray<CodeHeap*> (CodeBlobType::All, true);
@@ -420,42 +416,41 @@
}
}
print_trace("allocation", cb, size);
- _number_of_blobs++;
return cb;
}
void CodeCache::free(CodeBlob* cb) {
assert_locked_or_safepoint(CodeCache_lock);
-
+ CodeHeap* heap = get_code_heap(cb);
print_trace("free", cb);
if (cb->is_nmethod()) {
- _number_of_nmethods--;
+ heap->set_nmethod_count(heap->nmethod_count() - 1);
if (((nmethod *)cb)->has_dependencies()) {
_number_of_nmethods_with_dependencies--;
}
}
if (cb->is_adapter_blob()) {
- _number_of_adapters--;
+ heap->set_adapter_count(heap->adapter_count() - 1);
}
- _number_of_blobs--;
// Get heap for given CodeBlob and deallocate
get_code_heap(cb)->deallocate(cb);
- assert(_number_of_blobs >= 0, "sanity check");
+ assert(heap->blob_count() >= 0, "sanity check");
}
void CodeCache::commit(CodeBlob* cb) {
// this is called by nmethod::nmethod, which must already own CodeCache_lock
assert_locked_or_safepoint(CodeCache_lock);
+ CodeHeap* heap = get_code_heap(cb);
if (cb->is_nmethod()) {
- _number_of_nmethods++;
+ heap->set_nmethod_count(heap->nmethod_count() + 1);
if (((nmethod *)cb)->has_dependencies()) {
_number_of_nmethods_with_dependencies++;
}
}
if (cb->is_adapter_blob()) {
- _number_of_adapters++;
+ heap->set_adapter_count(heap->adapter_count() + 1);
}
// flush the hardware I-cache
@@ -774,6 +769,55 @@
}
}
+int CodeCache::blob_count(int code_blob_type) {
+ CodeHeap* heap = get_code_heap(code_blob_type);
+ return (heap != NULL) ? heap->blob_count() : 0;
+}
+
+int CodeCache::blob_count() {
+ int count = 0;
+ FOR_ALL_HEAPS(heap) {
+ count += (*heap)->blob_count();
+ }
+ return count;
+}
+
+int CodeCache::nmethod_count(int code_blob_type) {
+ CodeHeap* heap = get_code_heap(code_blob_type);
+ return (heap != NULL) ? heap->nmethod_count() : 0;
+}
+
+int CodeCache::nmethod_count() {
+ int count = 0;
+ FOR_ALL_HEAPS(heap) {
+ count += (*heap)->nmethod_count();
+ }
+ return count;
+}
+
+int CodeCache::adapter_count(int code_blob_type) {
+ CodeHeap* heap = get_code_heap(code_blob_type);
+ return (heap != NULL) ? heap->adapter_count() : 0;
+}
+
+int CodeCache::adapter_count() {
+ int count = 0;
+ FOR_ALL_HEAPS(heap) {
+ count += (*heap)->adapter_count();
+ }
+ return count;
+}
+
+address CodeCache::low_bound(int code_blob_type) {
+ CodeHeap* heap = get_code_heap(code_blob_type);
+ return (heap != NULL) ? (address)heap->low_boundary() : NULL;
+}
+
+address CodeCache::high_bound(int code_blob_type) {
+ CodeHeap* heap = get_code_heap(code_blob_type);
+ return (heap != NULL) ? (address)heap->high_boundary() : NULL;
+}
+
size_t CodeCache::capacity() {
size_t cap = 0;
FOR_ALL_HEAPS(heap) {
@@ -863,6 +907,9 @@
initialize_heaps();
} else {
// Use a single code heap
+ FLAG_SET_ERGO(uintx, NonNMethodCodeHeapSize, 0);
+ FLAG_SET_ERGO(uintx, ProfiledCodeHeapSize, 0);
+ FLAG_SET_ERGO(uintx, NonProfiledCodeHeapSize, 0);
ReservedCodeSpace rs = reserve_heap_memory(ReservedCodeCacheSize);
add_heap(rs, "CodeCache", CodeBlobType::All);
}
@@ -1104,9 +1151,8 @@
CodeHeap* heap = get_code_heap(code_blob_type);
assert(heap != NULL, "heap is null");
- if (!heap->was_full() || print) {
+ if ((heap->full_count() == 0) || print) {
// Not yet reported for this heap, report
- heap->report_full();
if (SegmentedCodeCache) {
warning("%s is full. Compiler has been disabled.", get_code_heap_name(code_blob_type));
warning("Try increasing the code heap size using -XX:%s=", get_code_heap_flag_name(code_blob_type));
@@ -1125,18 +1171,19 @@
tty->print("%s", s.as_string());
}
- _codemem_full_count++;
+ heap->report_full();
+
EventCodeCacheFull event;
if (event.should_commit()) {
event.set_codeBlobType((u1)code_blob_type);
event.set_startAddress((u8)heap->low_boundary());
event.set_commitedTopAddress((u8)heap->high());
event.set_reservedTopAddress((u8)heap->high_boundary());
- event.set_entryCount(nof_blobs());
- event.set_methodCount(nof_nmethods());
- event.set_adaptorCount(nof_adapters());
+ event.set_entryCount(heap->blob_count());
+ event.set_methodCount(heap->nmethod_count());
+ event.set_adaptorCount(heap->adapter_count());
event.set_unallocatedCapacity(heap->unallocated_capacity()/K);
- event.set_fullCount(_codemem_full_count);
+ event.set_fullCount(heap->full_count());
event.commit();
}
}
@@ -1360,7 +1407,7 @@
if (detailed) {
st->print_cr(" total_blobs=" UINT32_FORMAT " nmethods=" UINT32_FORMAT
" adapters=" UINT32_FORMAT,
- nof_blobs(), nof_nmethods(), nof_adapters());
+ blob_count(), nmethod_count(), adapter_count());
st->print_cr(" compilation: %s", CompileBroker::should_compile_new_jobs() ?
"enabled" : Arguments::mode() == Arguments::_int ?
"disabled (interpreter mode)" :
@@ -1392,6 +1439,6 @@
void CodeCache::log_state(outputStream* st) {
st->print(" total_blobs='" UINT32_FORMAT "' nmethods='" UINT32_FORMAT "'"
" adapters='" UINT32_FORMAT "' free_code_cache='" SIZE_FORMAT "'",
- nof_blobs(), nof_nmethods(), nof_adapters(),
+ blob_count(), nmethod_count(), adapter_count(),
unallocated_capacity());
}
--- a/hotspot/src/share/vm/code/codeCache.hpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/code/codeCache.hpp Mon Nov 09 20:01:29 2015 +0000
@@ -85,13 +85,9 @@
static address _low_bound; // Lower bound of CodeHeap addresses
static address _high_bound; // Upper bound of CodeHeap addresses
- static int _number_of_blobs; // Total number of CodeBlobs in the cache
- static int _number_of_adapters; // Total number of Adapters in the cache
- static int _number_of_nmethods; // Total number of nmethods in the cache
static int _number_of_nmethods_with_dependencies; // Total number of nmethods with dependencies
static bool _needs_cache_clean; // True if inline caches of the nmethods needs to be flushed
static nmethod* _scavenge_root_nmethods; // linked via nm->scavenge_root_link()
- static int _codemem_full_count; // Number of times a CodeHeap in the cache was full
static void mark_scavenge_root_nmethods() PRODUCT_RETURN;
static void verify_perm_nmethods(CodeBlobClosure* f_or_null) PRODUCT_RETURN;
@@ -104,7 +100,6 @@
static CodeHeap* get_code_heap(int code_blob_type); // Returns the CodeHeap for the given CodeBlobType
// Returns the name of the VM option to set the size of the corresponding CodeHeap
static const char* get_code_heap_flag_name(int code_blob_type);
- static bool heap_available(int code_blob_type); // Returns true if an own CodeHeap for the given CodeBlobType is available
static size_t heap_alignment(); // Returns the alignment of the CodeHeaps in bytes
static ReservedCodeSpace reserve_heap_memory(size_t size); // Reserves one continuous chunk of memory for the CodeHeaps
@@ -139,9 +134,12 @@
static CodeBlob* find_blob_unsafe(void* start); // Same as find_blob but does not fail if looking up a zombie method
static nmethod* find_nmethod(void* start); // Returns the nmethod containing the given address
- static int nof_blobs() { return _number_of_blobs; } // Returns the total number of CodeBlobs in the cache
- static int nof_adapters() { return _number_of_adapters; } // Returns the total number of Adapters in the cache
- static int nof_nmethods() { return _number_of_nmethods; } // Returns the total number of nmethods in the cache
+ static int blob_count(); // Returns the total number of CodeBlobs in the cache
+ static int blob_count(int code_blob_type);
+ static int adapter_count(); // Returns the total number of Adapters in the cache
+ static int adapter_count(int code_blob_type);
+ static int nmethod_count(); // Returns the total number of nmethods in the cache
+ static int nmethod_count(int code_blob_type);
// GC support
static void gc_epilogue();
@@ -177,7 +175,9 @@
// The full limits of the codeCache
static address low_bound() { return _low_bound; }
+ static address low_bound(int code_blob_type);
static address high_bound() { return _high_bound; }
+ static address high_bound(int code_blob_type);
// Profiling
static size_t capacity();
@@ -191,6 +191,9 @@
static void set_needs_cache_clean(bool v) { _needs_cache_clean = v; }
static void clear_inline_caches(); // clear all inline caches
+ // Returns true if an own CodeHeap for the given CodeBlobType is available
+ static bool heap_available(int code_blob_type);
+
// Returns the CodeBlobType for the given nmethod
static int get_code_blob_type(nmethod* nm) {
return get_code_heap(nm)->code_blob_type();
@@ -239,7 +242,10 @@
// tells how many nmethods have dependencies
static int number_of_nmethods_with_dependencies();
- static int get_codemem_full_count() { return _codemem_full_count; }
+ static int get_codemem_full_count(int code_blob_type) {
+ CodeHeap* heap = get_code_heap(code_blob_type);
+ return (heap != NULL) ? heap->full_count() : 0;
+ }
};
--- a/hotspot/src/share/vm/code/nmethod.cpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/code/nmethod.cpp Mon Nov 09 20:01:29 2015 +0000
@@ -1547,7 +1547,7 @@
if (PrintMethodFlushing) {
tty->print_cr("*flushing nmethod %3d/" INTPTR_FORMAT ". Live blobs:" UINT32_FORMAT
"/Free CodeCache:" SIZE_FORMAT "Kb",
- _compile_id, p2i(this), CodeCache::nof_blobs(),
+ _compile_id, p2i(this), CodeCache::blob_count(),
CodeCache::unallocated_capacity(CodeCache::get_code_blob_type(this))/1024);
}
--- a/hotspot/src/share/vm/memory/heap.cpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/memory/heap.cpp Mon Nov 09 20:01:29 2015 +0000
@@ -47,7 +47,10 @@
_freelist_segments = 0;
_freelist_length = 0;
_max_allocated_capacity = 0;
- _was_full = false;
+ _blob_count = 0;
+ _nmethod_count = 0;
+ _adapter_count = 0;
+ _full_count = 0;
}
@@ -185,6 +188,7 @@
assert(!block->free(), "must be marked free");
DEBUG_ONLY(memset((void*)block->allocated_space(), badCodeHeapNewVal, instance_size));
_max_allocated_capacity = MAX2(_max_allocated_capacity, allocated_capacity());
+ _blob_count++;
return block->allocated_space();
}
@@ -198,6 +202,7 @@
_next_segment += number_of_segments;
DEBUG_ONLY(memset((void *)b->allocated_space(), badCodeHeapNewVal, instance_size));
_max_allocated_capacity = MAX2(_max_allocated_capacity, allocated_capacity());
+ _blob_count++;
return b->allocated_space();
} else {
return NULL;
--- a/hotspot/src/share/vm/memory/heap.hpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/memory/heap.hpp Mon Nov 09 20:01:29 2015 +0000
@@ -100,7 +100,11 @@
const char* _name; // Name of the CodeHeap
const int _code_blob_type; // CodeBlobType it contains
- bool _was_full; // True if the code heap was full
+ int _blob_count; // Number of CodeBlobs
+ int _nmethod_count; // Number of nmethods
+ int _adapter_count; // Number of adapters
+ int _full_count; // Number of times the code heap was full
+
enum { free_sentinel = 0xFF };
@@ -179,8 +183,13 @@
// Debugging / Profiling
const char* name() const { return _name; }
- bool was_full() { return _was_full; }
- void report_full() { _was_full = true; }
+ int blob_count() { return _blob_count; }
+ int nmethod_count() { return _nmethod_count; }
+ void set_nmethod_count(int count) { _nmethod_count = count; }
+ int adapter_count() { return _adapter_count; }
+ void set_adapter_count(int count) { _adapter_count = count; }
+ int full_count() { return _full_count; }
+ void report_full() { _full_count++; }
private:
size_t heap_unallocated_capacity() const;
--- a/hotspot/src/share/vm/opto/graphKit.cpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/opto/graphKit.cpp Mon Nov 09 20:01:29 2015 +0000
@@ -1457,7 +1457,11 @@
// factory methods in "int adr_idx"
Node* GraphKit::make_load(Node* ctl, Node* adr, const Type* t, BasicType bt,
int adr_idx,
- MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency, bool require_atomic_access) {
+ MemNode::MemOrd mo,
+ LoadNode::ControlDependency control_dependency,
+ bool require_atomic_access,
+ bool unaligned,
+ bool mismatched) {
assert(adr_idx != Compile::AliasIdxTop, "use other make_load factory" );
const TypePtr* adr_type = NULL; // debug-mode-only argument
debug_only(adr_type = C->get_adr_type(adr_idx));
@@ -1470,6 +1474,12 @@
} else {
ld = LoadNode::make(_gvn, ctl, mem, adr, adr_type, t, bt, mo, control_dependency);
}
+ if (unaligned) {
+ ld->as_Load()->set_unaligned_access();
+ }
+ if (mismatched) {
+ ld->as_Load()->set_mismatched_access();
+ }
ld = _gvn.transform(ld);
if ((bt == T_OBJECT) && C->do_escape_analysis() || C->eliminate_boxing()) {
// Improve graph before escape analysis and boxing elimination.
@@ -1481,7 +1491,9 @@
Node* GraphKit::store_to_memory(Node* ctl, Node* adr, Node *val, BasicType bt,
int adr_idx,
MemNode::MemOrd mo,
- bool require_atomic_access) {
+ bool require_atomic_access,
+ bool unaligned,
+ bool mismatched) {
assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" );
const TypePtr* adr_type = NULL;
debug_only(adr_type = C->get_adr_type(adr_idx));
@@ -1494,6 +1506,12 @@
} else {
st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt, mo);
}
+ if (unaligned) {
+ st->as_Store()->set_unaligned_access();
+ }
+ if (mismatched) {
+ st->as_Store()->set_mismatched_access();
+ }
st = _gvn.transform(st);
set_memory(st, adr_idx);
// Back-to-back stores can only remove intermediate store with DU info
@@ -1587,7 +1605,8 @@
const TypeOopPtr* val_type,
BasicType bt,
bool use_precise,
- MemNode::MemOrd mo) {
+ MemNode::MemOrd mo,
+ bool mismatched) {
// Transformation of a value which could be NULL pointer (CastPP #NULL)
// could be delayed during Parse (for example, in adjust_map_after_if()).
// Execute transformation here to avoid barrier generation in such case.
@@ -1607,7 +1626,7 @@
NULL /* pre_val */,
bt);
- Node* store = store_to_memory(control(), adr, val, bt, adr_idx, mo);
+ Node* store = store_to_memory(control(), adr, val, bt, adr_idx, mo, mismatched);
post_barrier(control(), store, obj, adr, adr_idx, val, bt, use_precise);
return store;
}
@@ -1619,7 +1638,8 @@
const TypePtr* adr_type,
Node* val,
BasicType bt,
- MemNode::MemOrd mo) {
+ MemNode::MemOrd mo,
+ bool mismatched) {
Compile::AliasType* at = C->alias_type(adr_type);
const TypeOopPtr* val_type = NULL;
if (adr_type->isa_instptr()) {
@@ -1638,7 +1658,7 @@
if (val_type == NULL) {
val_type = TypeInstPtr::BOTTOM;
}
- return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, true, mo);
+ return store_oop(ctl, obj, adr, adr_type, val, val_type, bt, true, mo, mismatched);
}
--- a/hotspot/src/share/vm/opto/graphKit.hpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/opto/graphKit.hpp Mon Nov 09 20:01:29 2015 +0000
@@ -513,23 +513,28 @@
// of volatile fields.
Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt,
MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest,
- bool require_atomic_access = false) {
+ bool require_atomic_access = false, bool unaligned = false,
+ bool mismatched = false) {
// This version computes alias_index from bottom_type
return make_load(ctl, adr, t, bt, adr->bottom_type()->is_ptr(),
- mo, control_dependency, require_atomic_access);
+ mo, control_dependency, require_atomic_access,
+ unaligned, mismatched);
}
Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, const TypePtr* adr_type,
MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest,
- bool require_atomic_access = false) {
+ bool require_atomic_access = false, bool unaligned = false,
+ bool mismatched = false) {
// This version computes alias_index from an address type
assert(adr_type != NULL, "use other make_load factory");
return make_load(ctl, adr, t, bt, C->get_alias_index(adr_type),
- mo, control_dependency, require_atomic_access);
+ mo, control_dependency, require_atomic_access,
+ unaligned, mismatched);
}
// This is the base version which is given an alias index.
Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, int adr_idx,
MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest,
- bool require_atomic_access = false);
+ bool require_atomic_access = false, bool unaligned = false,
+ bool mismatched = false);
// Create & transform a StoreNode and store the effect into the
// parser's memory state.
@@ -542,19 +547,24 @@
Node* store_to_memory(Node* ctl, Node* adr, Node* val, BasicType bt,
const TypePtr* adr_type,
MemNode::MemOrd mo,
- bool require_atomic_access = false) {
+ bool require_atomic_access = false,
+ bool unaligned = false,
+ bool mismatched = false) {
// This version computes alias_index from an address type
assert(adr_type != NULL, "use other store_to_memory factory");
return store_to_memory(ctl, adr, val, bt,
C->get_alias_index(adr_type),
- mo, require_atomic_access);
+ mo, require_atomic_access,
+ unaligned, mismatched);
}
// This is the base version which is given alias index
// Return the new StoreXNode
Node* store_to_memory(Node* ctl, Node* adr, Node* val, BasicType bt,
int adr_idx,
MemNode::MemOrd,
- bool require_atomic_access = false);
+ bool require_atomic_access = false,
+ bool unaligned = false,
+ bool mismatched = false);
// All in one pre-barrier, store, post_barrier
@@ -577,7 +587,8 @@
const TypeOopPtr* val_type,
BasicType bt,
bool use_precise,
- MemNode::MemOrd mo);
+ MemNode::MemOrd mo,
+ bool mismatched = false);
Node* store_oop_to_object(Node* ctl,
Node* obj, // containing obj
@@ -608,7 +619,8 @@
const TypePtr* adr_type,
Node* val,
BasicType bt,
- MemNode::MemOrd mo);
+ MemNode::MemOrd mo,
+ bool mismatched = false);
// For the few case where the barriers need special help
void pre_barrier(bool do_load, Node* ctl,
--- a/hotspot/src/share/vm/opto/idealKit.cpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/opto/idealKit.cpp Mon Nov 09 20:01:29 2015 +0000
@@ -368,7 +368,8 @@
Node* IdealKit::store(Node* ctl, Node* adr, Node *val, BasicType bt,
int adr_idx,
- MemNode::MemOrd mo, bool require_atomic_access) {
+ MemNode::MemOrd mo, bool require_atomic_access,
+ bool mismatched) {
assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory");
const TypePtr* adr_type = NULL;
debug_only(adr_type = C->get_adr_type(adr_idx));
@@ -379,6 +380,9 @@
} else {
st = StoreNode::make(_gvn, ctl, mem, adr, adr_type, val, bt, mo);
}
+ if (mismatched) {
+ st->as_Store()->set_mismatched_access();
+ }
st = transform(st);
set_memory(st, adr_idx);
--- a/hotspot/src/share/vm/opto/idealKit.hpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/opto/idealKit.hpp Mon Nov 09 20:01:29 2015 +0000
@@ -229,7 +229,9 @@
BasicType bt,
int adr_idx,
MemNode::MemOrd mo,
- bool require_atomic_access = false);
+ bool require_atomic_access = false,
+ bool mismatched = false
+ );
// Store a card mark ordered after store_oop
Node* storeCM(Node* ctl,
--- a/hotspot/src/share/vm/opto/library_call.cpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/opto/library_call.cpp Mon Nov 09 20:01:29 2015 +0000
@@ -238,7 +238,7 @@
// Generates the guards that check whether the result of
// Unsafe.getObject should be recorded in an SATB log buffer.
void insert_pre_barrier(Node* base_oop, Node* offset, Node* pre_val, bool need_mem_bar);
- bool inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile);
+ bool inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile, bool is_unaligned);
static bool klass_needs_init_guard(Node* kls);
bool inline_unsafe_allocate();
bool inline_unsafe_copyMemory();
@@ -544,72 +544,72 @@
case vmIntrinsics::_inflateStringC:
case vmIntrinsics::_inflateStringB: return inline_string_copy(!is_compress);
- case vmIntrinsics::_getObject: return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, !is_volatile);
- case vmIntrinsics::_getBoolean: return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, !is_volatile);
- case vmIntrinsics::_getByte: return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, !is_volatile);
- case vmIntrinsics::_getShort: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, !is_volatile);
- case vmIntrinsics::_getChar: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, !is_volatile);
- case vmIntrinsics::_getInt: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, !is_volatile);
- case vmIntrinsics::_getLong: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, !is_volatile);
- case vmIntrinsics::_getFloat: return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, !is_volatile);
- case vmIntrinsics::_getDouble: return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, !is_volatile);
- case vmIntrinsics::_putObject: return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, !is_volatile);
- case vmIntrinsics::_putBoolean: return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, !is_volatile);
- case vmIntrinsics::_putByte: return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, !is_volatile);
- case vmIntrinsics::_putShort: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, !is_volatile);
- case vmIntrinsics::_putChar: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, !is_volatile);
- case vmIntrinsics::_putInt: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, !is_volatile);
- case vmIntrinsics::_putLong: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, !is_volatile);
- case vmIntrinsics::_putFloat: return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, !is_volatile);
- case vmIntrinsics::_putDouble: return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, !is_volatile);
-
- case vmIntrinsics::_getByte_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_BYTE, !is_volatile);
- case vmIntrinsics::_getShort_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_SHORT, !is_volatile);
- case vmIntrinsics::_getChar_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_CHAR, !is_volatile);
- case vmIntrinsics::_getInt_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_INT, !is_volatile);
- case vmIntrinsics::_getLong_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_LONG, !is_volatile);
- case vmIntrinsics::_getFloat_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_FLOAT, !is_volatile);
- case vmIntrinsics::_getDouble_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_DOUBLE, !is_volatile);
- case vmIntrinsics::_getAddress_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_ADDRESS, !is_volatile);
-
- case vmIntrinsics::_putByte_raw: return inline_unsafe_access( is_native_ptr, is_store, T_BYTE, !is_volatile);
- case vmIntrinsics::_putShort_raw: return inline_unsafe_access( is_native_ptr, is_store, T_SHORT, !is_volatile);
- case vmIntrinsics::_putChar_raw: return inline_unsafe_access( is_native_ptr, is_store, T_CHAR, !is_volatile);
- case vmIntrinsics::_putInt_raw: return inline_unsafe_access( is_native_ptr, is_store, T_INT, !is_volatile);
- case vmIntrinsics::_putLong_raw: return inline_unsafe_access( is_native_ptr, is_store, T_LONG, !is_volatile);
- case vmIntrinsics::_putFloat_raw: return inline_unsafe_access( is_native_ptr, is_store, T_FLOAT, !is_volatile);
- case vmIntrinsics::_putDouble_raw: return inline_unsafe_access( is_native_ptr, is_store, T_DOUBLE, !is_volatile);
- case vmIntrinsics::_putAddress_raw: return inline_unsafe_access( is_native_ptr, is_store, T_ADDRESS, !is_volatile);
-
- case vmIntrinsics::_getObjectVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, is_volatile);
- case vmIntrinsics::_getBooleanVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, is_volatile);
- case vmIntrinsics::_getByteVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, is_volatile);
- case vmIntrinsics::_getShortVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, is_volatile);
- case vmIntrinsics::_getCharVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, is_volatile);
- case vmIntrinsics::_getIntVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, is_volatile);
- case vmIntrinsics::_getLongVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, is_volatile);
- case vmIntrinsics::_getFloatVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, is_volatile);
- case vmIntrinsics::_getDoubleVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, is_volatile);
-
- case vmIntrinsics::_putObjectVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, is_volatile);
- case vmIntrinsics::_putBooleanVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, is_volatile);
- case vmIntrinsics::_putByteVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, is_volatile);
- case vmIntrinsics::_putShortVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, is_volatile);
- case vmIntrinsics::_putCharVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, is_volatile);
- case vmIntrinsics::_putIntVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, is_volatile);
- case vmIntrinsics::_putLongVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, is_volatile);
- case vmIntrinsics::_putFloatVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, is_volatile);
- case vmIntrinsics::_putDoubleVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, is_volatile);
-
- case vmIntrinsics::_getShortUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, !is_volatile);
- case vmIntrinsics::_getCharUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, !is_volatile);
- case vmIntrinsics::_getIntUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, !is_volatile);
- case vmIntrinsics::_getLongUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, !is_volatile);
-
- case vmIntrinsics::_putShortUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, !is_volatile);
- case vmIntrinsics::_putCharUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, !is_volatile);
- case vmIntrinsics::_putIntUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, !is_volatile);
- case vmIntrinsics::_putLongUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, !is_volatile);
+ case vmIntrinsics::_getObject: return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, !is_volatile, false);
+ case vmIntrinsics::_getBoolean: return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, !is_volatile, false);
+ case vmIntrinsics::_getByte: return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, !is_volatile, false);
+ case vmIntrinsics::_getShort: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, !is_volatile, false);
+ case vmIntrinsics::_getChar: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, !is_volatile, false);
+ case vmIntrinsics::_getInt: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, !is_volatile, false);
+ case vmIntrinsics::_getLong: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, !is_volatile, false);
+ case vmIntrinsics::_getFloat: return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, !is_volatile, false);
+ case vmIntrinsics::_getDouble: return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, !is_volatile, false);
+ case vmIntrinsics::_putObject: return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, !is_volatile, false);
+ case vmIntrinsics::_putBoolean: return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, !is_volatile, false);
+ case vmIntrinsics::_putByte: return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, !is_volatile, false);
+ case vmIntrinsics::_putShort: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, !is_volatile, false);
+ case vmIntrinsics::_putChar: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, !is_volatile, false);
+ case vmIntrinsics::_putInt: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, !is_volatile, false);
+ case vmIntrinsics::_putLong: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, !is_volatile, false);
+ case vmIntrinsics::_putFloat: return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, !is_volatile, false);
+ case vmIntrinsics::_putDouble: return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, !is_volatile, false);
+
+ case vmIntrinsics::_getByte_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_BYTE, !is_volatile, false);
+ case vmIntrinsics::_getShort_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_SHORT, !is_volatile, false);
+ case vmIntrinsics::_getChar_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_CHAR, !is_volatile, false);
+ case vmIntrinsics::_getInt_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_INT, !is_volatile, false);
+ case vmIntrinsics::_getLong_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_LONG, !is_volatile, false);
+ case vmIntrinsics::_getFloat_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_FLOAT, !is_volatile, false);
+ case vmIntrinsics::_getDouble_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_DOUBLE, !is_volatile, false);
+ case vmIntrinsics::_getAddress_raw: return inline_unsafe_access( is_native_ptr, !is_store, T_ADDRESS, !is_volatile, false);
+
+ case vmIntrinsics::_putByte_raw: return inline_unsafe_access( is_native_ptr, is_store, T_BYTE, !is_volatile, false);
+ case vmIntrinsics::_putShort_raw: return inline_unsafe_access( is_native_ptr, is_store, T_SHORT, !is_volatile, false);
+ case vmIntrinsics::_putChar_raw: return inline_unsafe_access( is_native_ptr, is_store, T_CHAR, !is_volatile, false);
+ case vmIntrinsics::_putInt_raw: return inline_unsafe_access( is_native_ptr, is_store, T_INT, !is_volatile, false);
+ case vmIntrinsics::_putLong_raw: return inline_unsafe_access( is_native_ptr, is_store, T_LONG, !is_volatile, false);
+ case vmIntrinsics::_putFloat_raw: return inline_unsafe_access( is_native_ptr, is_store, T_FLOAT, !is_volatile, false);
+ case vmIntrinsics::_putDouble_raw: return inline_unsafe_access( is_native_ptr, is_store, T_DOUBLE, !is_volatile, false);
+ case vmIntrinsics::_putAddress_raw: return inline_unsafe_access( is_native_ptr, is_store, T_ADDRESS, !is_volatile, false);
+
+ case vmIntrinsics::_getObjectVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_OBJECT, is_volatile, false);
+ case vmIntrinsics::_getBooleanVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_BOOLEAN, is_volatile, false);
+ case vmIntrinsics::_getByteVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_BYTE, is_volatile, false);
+ case vmIntrinsics::_getShortVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, is_volatile, false);
+ case vmIntrinsics::_getCharVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, is_volatile, false);
+ case vmIntrinsics::_getIntVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, is_volatile, false);
+ case vmIntrinsics::_getLongVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, is_volatile, false);
+ case vmIntrinsics::_getFloatVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_FLOAT, is_volatile, false);
+ case vmIntrinsics::_getDoubleVolatile: return inline_unsafe_access(!is_native_ptr, !is_store, T_DOUBLE, is_volatile, false);
+
+ case vmIntrinsics::_putObjectVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_OBJECT, is_volatile, false);
+ case vmIntrinsics::_putBooleanVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_BOOLEAN, is_volatile, false);
+ case vmIntrinsics::_putByteVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_BYTE, is_volatile, false);
+ case vmIntrinsics::_putShortVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, is_volatile, false);
+ case vmIntrinsics::_putCharVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, is_volatile, false);
+ case vmIntrinsics::_putIntVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, is_volatile, false);
+ case vmIntrinsics::_putLongVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, is_volatile, false);
+ case vmIntrinsics::_putFloatVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_FLOAT, is_volatile, false);
+ case vmIntrinsics::_putDoubleVolatile: return inline_unsafe_access(!is_native_ptr, is_store, T_DOUBLE, is_volatile, false);
+
+ case vmIntrinsics::_getShortUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_SHORT, !is_volatile, true);
+ case vmIntrinsics::_getCharUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_CHAR, !is_volatile, true);
+ case vmIntrinsics::_getIntUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_INT, !is_volatile, true);
+ case vmIntrinsics::_getLongUnaligned: return inline_unsafe_access(!is_native_ptr, !is_store, T_LONG, !is_volatile, true);
+
+ case vmIntrinsics::_putShortUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_SHORT, !is_volatile, true);
+ case vmIntrinsics::_putCharUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_CHAR, !is_volatile, true);
+ case vmIntrinsics::_putIntUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_INT, !is_volatile, true);
+ case vmIntrinsics::_putLongUnaligned: return inline_unsafe_access(!is_native_ptr, is_store, T_LONG, !is_volatile, true);
case vmIntrinsics::_compareAndSwapObject: return inline_unsafe_load_store(T_OBJECT, LS_cmpxchg);
case vmIntrinsics::_compareAndSwapInt: return inline_unsafe_load_store(T_INT, LS_cmpxchg);
@@ -2385,7 +2385,7 @@
return NULL;
}
-bool LibraryCallKit::inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile) {
+bool LibraryCallKit::inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile, bool unaligned) {
if (callee()->is_static()) return false; // caller must have the capability!
#ifndef PRODUCT
@@ -2527,7 +2527,24 @@
// of safe & unsafe memory.
if (need_mem_bar) insert_mem_bar(Op_MemBarCPUOrder);
- if (!is_store) {
+ assert(alias_type->adr_type() == TypeRawPtr::BOTTOM || alias_type->adr_type() == TypeOopPtr::BOTTOM ||
+ alias_type->field() != NULL || alias_type->element() != NULL, "field, array element or unknown");
+ bool mismatched = false;
+ if (alias_type->element() != NULL || alias_type->field() != NULL) {
+ BasicType bt;
+ if (alias_type->element() != NULL) {
+ const Type* element = alias_type->element();
+ bt = element->isa_narrowoop() ? T_OBJECT : element->array_element_basic_type();
+ } else {
+ bt = alias_type->field()->type()->basic_type();
+ }
+ if (bt != type) {
+ mismatched = true;
+ }
+ }
+ assert(type != T_OBJECT || !unaligned, "unaligned access not supported with object type");
+
+ if (!is_store) {
Node* p = NULL;
// Try to constant fold a load from a constant field
ciField* field = alias_type->field();
@@ -2543,7 +2560,7 @@
MemNode::MemOrd mo = is_volatile ? MemNode::acquire : MemNode::unordered;
// To be valid, unsafe loads may depend on other conditions than
// the one that guards them: pin the Load node
- p = make_load(control(), adr, value_type, type, adr_type, mo, LoadNode::Pinned, is_volatile);
+ p = make_load(control(), adr, value_type, type, adr_type, mo, LoadNode::Pinned, is_volatile, unaligned, mismatched);
// load value
switch (type) {
case T_BOOLEAN:
@@ -2590,12 +2607,12 @@
MemNode::MemOrd mo = is_volatile ? MemNode::release : MemNode::unordered;
if (type != T_OBJECT ) {
- (void) store_to_memory(control(), adr, val, type, adr_type, mo, is_volatile);
+ (void) store_to_memory(control(), adr, val, type, adr_type, mo, is_volatile, unaligned, mismatched);
} else {
// Possibly an oop being stored to Java heap or native memory
if (!TypePtr::NULL_PTR->higher_equal(_gvn.type(heap_base_oop))) {
// oop to Java heap.
- (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type, mo);
+ (void) store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type, mo, mismatched);
} else {
// We can't tell at compile time if we are storing in the Java heap or outside
// of it. So we need to emit code to conditionally do the proper type of
@@ -2607,11 +2624,11 @@
__ if_then(heap_base_oop, BoolTest::ne, null(), PROB_UNLIKELY(0.999)); {
// Sync IdealKit and graphKit.
sync_kit(ideal);
- Node* st = store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type, mo);
+ Node* st = store_oop_to_unknown(control(), heap_base_oop, adr, adr_type, val, type, mo, mismatched);
// Update IdealKit memory.
__ sync_kit(this);
} __ else_(); {
- __ store(__ ctrl(), adr, val, type, alias_type->index(), mo, is_volatile);
+ __ store(__ ctrl(), adr, val, type, alias_type->index(), mo, is_volatile, mismatched);
} __ end_if();
// Final sync IdealKit and GraphKit.
final_sync(ideal);
--- a/hotspot/src/share/vm/opto/memnode.cpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/opto/memnode.cpp Mon Nov 09 20:01:29 2015 +0000
@@ -72,8 +72,15 @@
dump_adr_type(this, _adr_type, st);
Compile* C = Compile::current();
- if( C->alias_type(_adr_type)->is_volatile() )
+ if (C->alias_type(_adr_type)->is_volatile()) {
st->print(" Volatile!");
+ }
+ if (_unaligned_access) {
+ st->print(" unaligned");
+ }
+ if (_mismatched_access) {
+ st->print(" mismatched");
+ }
}
void MemNode::dump_adr_type(const Node* mem, const TypePtr* adr_type, outputStream *st) {
@@ -2393,7 +2400,8 @@
st->Opcode() == Op_StoreVector ||
Opcode() == Op_StoreVector ||
phase->C->get_alias_index(adr_type()) == Compile::AliasIdxRaw ||
- (Opcode() == Op_StoreL && st->Opcode() == Op_StoreI), // expanded ClearArrayNode
+ (Opcode() == Op_StoreL && st->Opcode() == Op_StoreI) || // expanded ClearArrayNode
+ (is_mismatched_access() || st->as_Store()->is_mismatched_access()),
"no mismatched stores, except on raw memory: %s %s", NodeClassNames[Opcode()], NodeClassNames[st->Opcode()]);
if (st->in(MemNode::Address)->eqv_uncast(address) &&
@@ -3213,6 +3221,9 @@
// within the initialized memory.
intptr_t InitializeNode::can_capture_store(StoreNode* st, PhaseTransform* phase, bool can_reshape) {
const int FAIL = 0;
+ if (st->is_unaligned_access()) {
+ return FAIL;
+ }
if (st->req() != MemNode::ValueIn + 1)
return FAIL; // an inscrutable StoreNode (card mark?)
Node* ctl = st->in(MemNode::Control);
--- a/hotspot/src/share/vm/opto/memnode.hpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/opto/memnode.hpp Mon Nov 09 20:01:29 2015 +0000
@@ -39,11 +39,14 @@
//------------------------------MemNode----------------------------------------
// Load or Store, possibly throwing a NULL pointer exception
class MemNode : public Node {
+private:
+ bool _unaligned_access; // Unaligned access from unsafe
+ bool _mismatched_access; // Mismatched access from unsafe: byte read in integer array for instance
protected:
#ifdef ASSERT
const TypePtr* _adr_type; // What kind of memory is being addressed?
#endif
- virtual uint size_of() const; // Size is bigger (ASSERT only)
+ virtual uint size_of() const;
public:
enum { Control, // When is it safe to do this load?
Memory, // Chunk of memory is being loaded from
@@ -57,17 +60,17 @@
} MemOrd;
protected:
MemNode( Node *c0, Node *c1, Node *c2, const TypePtr* at )
- : Node(c0,c1,c2 ) {
+ : Node(c0,c1,c2 ), _unaligned_access(false), _mismatched_access(false) {
init_class_id(Class_Mem);
debug_only(_adr_type=at; adr_type();)
}
MemNode( Node *c0, Node *c1, Node *c2, const TypePtr* at, Node *c3 )
- : Node(c0,c1,c2,c3) {
+ : Node(c0,c1,c2,c3), _unaligned_access(false), _mismatched_access(false) {
init_class_id(Class_Mem);
debug_only(_adr_type=at; adr_type();)
}
MemNode( Node *c0, Node *c1, Node *c2, const TypePtr* at, Node *c3, Node *c4)
- : Node(c0,c1,c2,c3,c4) {
+ : Node(c0,c1,c2,c3,c4), _unaligned_access(false), _mismatched_access(false) {
init_class_id(Class_Mem);
debug_only(_adr_type=at; adr_type();)
}
@@ -127,6 +130,11 @@
// the given memory state? (The state may or may not be in(Memory).)
Node* can_see_stored_value(Node* st, PhaseTransform* phase) const;
+ void set_unaligned_access() { _unaligned_access = true; }
+ bool is_unaligned_access() const { return _unaligned_access; }
+ void set_mismatched_access() { _mismatched_access = true; }
+ bool is_mismatched_access() const { return _mismatched_access; }
+
#ifndef PRODUCT
static void dump_adr_type(const Node* mem, const TypePtr* adr_type, outputStream *st);
virtual void dump_spec(outputStream *st) const;
--- a/hotspot/src/share/vm/runtime/sweeper.cpp Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/src/share/vm/runtime/sweeper.cpp Mon Nov 09 20:01:29 2015 +0000
@@ -297,7 +297,7 @@
void NMethodSweeper::handle_safepoint_request() {
if (SafepointSynchronize::is_synchronizing()) {
if (PrintMethodFlushing && Verbose) {
- tty->print_cr("### Sweep at %d out of %d, yielding to safepoint", _seen, CodeCache::nof_nmethods());
+ tty->print_cr("### Sweep at %d out of %d, yielding to safepoint", _seen, CodeCache::nmethod_count());
}
MutexUnlockerEx mu(CodeCache_lock, Mutex::_no_safepoint_check_flag);
@@ -401,7 +401,7 @@
int flushed_c2_count = 0;
if (PrintMethodFlushing && Verbose) {
- tty->print_cr("### Sweep at %d out of %d", _seen, CodeCache::nof_nmethods());
+ tty->print_cr("### Sweep at %d out of %d", _seen, CodeCache::nmethod_count());
}
int swept_count = 0;
--- a/hotspot/test/compiler/arraycopy/TestArrayCopyNoInitDeopt.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/arraycopy/TestArrayCopyNoInitDeopt.java Mon Nov 09 20:01:29 2015 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8072016
* @summary Infinite deoptimization/recompilation cycles in case of arraycopy with tightly coupled allocation
- * @library /testlibrary /../../test/lib /compiler/whitebox
+ * @library /testlibrary /../../test/lib /
* @modules java.base/sun.misc
* java.management
* @build TestArrayCopyNoInitDeopt
@@ -42,6 +42,7 @@
import sun.hotspot.code.NMethod;
import jdk.test.lib.Platform;
import java.lang.reflect.*;
+import compiler.whitebox.CompilerWhiteBoxTest;
public class TestArrayCopyNoInitDeopt {
--- a/hotspot/test/compiler/floatingpoint/TestPow2.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/floatingpoint/TestPow2.java Mon Nov 09 20:01:29 2015 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8063086
* @summary X^2 special case for C2 yields different result than interpreter
- * @library /testlibrary /../../test/lib /compiler/whitebox
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build TestPow2
* @run main ClassFileInstaller sun.hotspot.WhiteBox
@@ -36,6 +36,7 @@
import java.lang.reflect.*;
import sun.hotspot.WhiteBox;
+import compiler.whitebox.CompilerWhiteBoxTest;
public class TestPow2 {
--- a/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/IntrinsicAvailableTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,10 +23,11 @@
import java.lang.reflect.Executable;
import java.util.concurrent.Callable;
import java.util.Objects;
+import compiler.whitebox.CompilerWhiteBoxTest;
/*
* @test
* @bug 8130832
- * @library /testlibrary /../../test/lib /compiler/whitebox /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @build IntrinsicAvailableTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/AddnTestI.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/AddnTestI.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build AddnTestI
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/AddnTestL.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/AddnTestL.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build AddnTestL
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsiTestI.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsiTestI.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build BlsiTestI
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsiTestL.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsiTestL.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build BlsiTestL
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsmskTestI.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsmskTestI.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build BlsmskTestI
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsmskTestL.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsmskTestL.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build BlsmskTestL
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsrTestI.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsrTestI.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build BlsrTestI
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsrTestL.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/BlsrTestL.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build BlsrTestL
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/BmiIntrinsicBase.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/BmiIntrinsicBase.java Mon Nov 09 20:01:29 2015 +0000
@@ -32,6 +32,7 @@
import java.lang.reflect.Method;
import java.util.concurrent.Callable;
import java.util.function.Function;
+import compiler.whitebox.CompilerWhiteBoxTest;
public class BmiIntrinsicBase extends CompilerWhiteBoxTest {
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/LZcntTestI.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/LZcntTestI.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build LZcntTestI
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/LZcntTestL.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/LZcntTestL.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build LZcntTestL
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/TZcntTestI.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/TZcntTestI.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build TZcntTestI
--- a/hotspot/test/compiler/intrinsics/bmi/verifycode/TZcntTestL.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/bmi/verifycode/TZcntTestL.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test
* @bug 8031321
- * @library /testlibrary /../../test/lib /compiler/whitebox ..
+ * @library /testlibrary /../../test/lib / ..
* @modules java.base/sun.misc
* java.management
* @build TZcntTestL
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/AddExactIntTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/AddExactIntTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build AddExactIntTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/AddExactLongTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/AddExactLongTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build AddExactLongTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/DecrementExactIntTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/DecrementExactIntTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build DecrementExactIntTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/DecrementExactLongTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/DecrementExactLongTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build DecrementExactLongTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/IncrementExactIntTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/IncrementExactIntTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build IncrementExactIntTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/IncrementExactLongTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/IncrementExactLongTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build IncrementExactLongTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/IntrinsicBase.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/IntrinsicBase.java Mon Nov 09 20:01:29 2015 +0000
@@ -27,6 +27,7 @@
import java.io.FileOutputStream;
import java.lang.reflect.Executable;
import java.util.Properties;
+import compiler.whitebox.CompilerWhiteBoxTest;
public abstract class IntrinsicBase extends CompilerWhiteBoxTest {
protected String javaVmName;
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/MathIntrinsic.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/MathIntrinsic.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,6 +23,7 @@
import java.lang.reflect.Executable;
import java.util.concurrent.Callable;
+import compiler.whitebox.CompilerWhiteBoxTest;
public class MathIntrinsic {
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/MultiplyExactIntTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/MultiplyExactIntTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build MultiplyExactIntTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/MultiplyExactLongTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/MultiplyExactLongTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build MultiplyExactLongTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/NegateExactIntTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/NegateExactIntTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build NegateExactIntTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/NegateExactLongTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/NegateExactLongTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build NegateExactLongTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/SubtractExactIntTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/SubtractExactIntTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build SubtractExactIntTest
--- a/hotspot/test/compiler/intrinsics/mathexact/sanity/SubtractExactLongTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/intrinsics/mathexact/sanity/SubtractExactLongTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,8 +23,7 @@
/*
* @test
- * @library /testlibrary /../../test/lib /compiler/whitebox
- * /compiler/testlibrary
+ * @library /testlibrary /../../test/lib / /compiler/testlibrary
* @modules java.base/sun.misc
* java.management
* @build SubtractExactLongTest
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/intrinsics/unsafe/TestUnsafeUnalignedMismatchedAccesses.java Mon Nov 09 20:01:29 2015 +0000
@@ -0,0 +1,122 @@
+/*
+ * 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 8136473
+ * @summary Mismatched stores on same slice possible with Unsafe.Put*Unaligned methods
+ * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation TestUnsafeUnalignedMismatchedAccesses
+ * @run main/othervm -XX:-UseOnStackReplacement -XX:-BackgroundCompilation -XX:+UnlockDiagnosticVMOptions -XX:-UseUnalignedAccesses TestUnsafeUnalignedMismatchedAccesses
+ *
+ */
+
+import java.lang.reflect.*;
+import sun.misc.Unsafe;
+
+public class TestUnsafeUnalignedMismatchedAccesses {
+
+ private static final Unsafe UNSAFE;
+
+ static {
+ try {
+ Field unsafeField = Unsafe.class.getDeclaredField("theUnsafe");
+ unsafeField.setAccessible(true);
+ UNSAFE = (Unsafe) unsafeField.get(null);
+ }
+ catch (Exception e) {
+ throw new AssertionError(e);
+ }
+ }
+
+ static void test1(byte[] array) {
+ array[0] = 0;
+ UNSAFE.putIntUnaligned(array, UNSAFE.ARRAY_BYTE_BASE_OFFSET, 0);
+ array[0] = 0;
+ }
+
+ static void test2(byte[] array) {
+ array[0] = 0;
+ UNSAFE.putIntUnaligned(array, UNSAFE.ARRAY_BYTE_BASE_OFFSET+1, 0);
+ array[0] = 0;
+ }
+
+ static void test3(byte[] array) {
+ array[0] = 0;
+ UNSAFE.putIntUnaligned(array, UNSAFE.ARRAY_BYTE_BASE_OFFSET+2, 0);
+ array[0] = 0;
+ }
+
+ static void test4(byte[] array) {
+ array[0] = 0;
+ UNSAFE.putIntUnaligned(array, UNSAFE.ARRAY_BYTE_BASE_OFFSET+3, 0);
+ array[0] = 0;
+ }
+
+ static void test5(byte[] array) {
+ array[0] = 0;
+ UNSAFE.putInt(array, UNSAFE.ARRAY_BYTE_BASE_OFFSET, 0);
+ array[0] = 0;
+ }
+
+ // unaligned access and non escaping allocation
+ static void test6() {
+ byte[] array = new byte[10];
+ UNSAFE.putIntUnaligned(array, UNSAFE.ARRAY_BYTE_BASE_OFFSET+1, -1);
+ array[0] = 0;
+ }
+
+ // unaligned access and non escaping allocation
+ static int test7() {
+ byte[] array = new byte[10];
+ UNSAFE.putIntUnaligned(array, UNSAFE.ARRAY_BYTE_BASE_OFFSET+1, -1);
+ array[0] = 0;
+ array[2] = 0;
+ return array[0] + array[1] + array[2] + array[3] + array[4];
+ }
+
+ // unaligned access with vectorization
+ static void test8(int[] src1, int[] src2, int[] dst) {
+ for (int i = 0; i < dst.length-1; i++) {
+ int res = src1[i] + src2[i];
+ UNSAFE.putIntUnaligned(dst, UNSAFE.ARRAY_INT_BASE_OFFSET + i*4+1, res);
+ }
+ }
+
+ static public void main(String[] args) throws Exception {
+ byte[] byte_array = new byte[100];
+ int[] int_array = new int[100];
+ Object[] obj_array = new Object[100];
+ TestUnsafeUnalignedMismatchedAccesses test = new TestUnsafeUnalignedMismatchedAccesses();
+ for (int i = 0; i < 20000; i++) {
+ test1(byte_array);
+ test2(byte_array);
+ test3(byte_array);
+ test4(byte_array);
+ test5(byte_array);
+ test6();
+ test7();
+ test8(int_array, int_array, int_array);
+ }
+ }
+}
--- a/hotspot/test/compiler/jvmci/events/JvmciNotifyInstallEventTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/jvmci/events/JvmciNotifyInstallEventTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -111,6 +111,8 @@
Asserts.assertEQ(gotInstallNotification, 1,
"Got unexpected event count after 1st install attempt");
// since "empty" compilation result is ok, a second attempt should be ok
+ compResult = new CompilationResult(METHOD_NAME); // create another instance with fresh state
+ compResult.setTotalFrameSize(0);
codeCache.installCode(compRequest, compResult, /* installedCode = */ null, /* speculationLog = */ null,
/* isDefault = */ false);
Asserts.assertEQ(gotInstallNotification, 2,
--- a/hotspot/test/compiler/rangechecks/TestExplicitRangeChecks.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/rangechecks/TestExplicitRangeChecks.java Mon Nov 09 20:01:29 2015 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8073480
* @summary explicit range checks should be recognized by C2
- * @library /testlibrary /../../test/lib /compiler/whitebox
+ * @library /testlibrary /../../test/lib /
* @build TestExplicitRangeChecks
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* @run main ClassFileInstaller jdk.test.lib.Platform
@@ -41,6 +41,7 @@
import sun.hotspot.code.NMethod;
import jdk.test.lib.Platform;
import sun.misc.Unsafe;
+import compiler.whitebox.CompilerWhiteBoxTest;
public class TestExplicitRangeChecks {
--- a/hotspot/test/compiler/rangechecks/TestRangeCheckSmearing.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/rangechecks/TestRangeCheckSmearing.java Mon Nov 09 20:01:29 2015 +0000
@@ -25,7 +25,7 @@
* @test
* @bug 8066103
* @summary C2's range check smearing allows out of bound array accesses
- * @library /testlibrary /../../test/lib /compiler/whitebox
+ * @library /testlibrary /../../test/lib /
* @modules java.base/sun.misc
* java.management
* @build TestRangeCheckSmearing
@@ -42,6 +42,7 @@
import sun.hotspot.WhiteBox;
import sun.hotspot.code.NMethod;
import jdk.test.lib.Platform;
+import compiler.whitebox.CompilerWhiteBoxTest;
public class TestRangeCheckSmearing {
private static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
--- a/hotspot/test/compiler/tiered/CompLevelsTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/tiered/CompLevelsTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -26,6 +26,9 @@
*
* @author igor.ignatyev@oracle.com
*/
+
+import compiler.whitebox.CompilerWhiteBoxTest;
+
public abstract class CompLevelsTest extends CompilerWhiteBoxTest {
protected CompLevelsTest(TestCase testCase) {
super(testCase);
--- a/hotspot/test/compiler/tiered/ConstantGettersTransitionsTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/tiered/ConstantGettersTransitionsTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -23,10 +23,11 @@
import java.lang.reflect.Executable;
import java.util.concurrent.Callable;
+import compiler.whitebox.CompilerWhiteBoxTest;
/**
* @test ConstantGettersTransitionsTest
- * @library /testlibrary /../../test/lib /compiler/whitebox
+ * @library /testlibrary /../../test/lib /
* @modules java.base/sun.misc
* java.management
* @build TransitionsTestExecutor ConstantGettersTransitionsTest
--- a/hotspot/test/compiler/tiered/LevelTransitionTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/tiered/LevelTransitionTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -25,10 +25,12 @@
import java.lang.reflect.Method;
import java.util.Objects;
import java.util.concurrent.Callable;
+import compiler.whitebox.CompilerWhiteBoxTest;
+import compiler.whitebox.SimpleTestCase;
/**
* @test LevelTransitionTest
- * @library /testlibrary /../../test/lib /compiler/whitebox
+ * @library /testlibrary /../../test/lib /
* @modules java.base/sun.misc
* java.management
* @ignore 8067651
@@ -36,7 +38,7 @@
* @run main ClassFileInstaller sun.hotspot.WhiteBox sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm/timeout=240 -Xmixed -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
* -XX:+WhiteBoxAPI -XX:+TieredCompilation
- * -XX:CompileCommand=compileonly,SimpleTestCase$Helper::*
+ * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::*
* -XX:CompileCommand=compileonly,ExtendedTestCase$CompileMethodHolder::*
* TransitionsTestExecutor LevelTransitionTest
* @summary Test the correctness of compilation level transitions for different methods
--- a/hotspot/test/compiler/tiered/NonTieredLevelsTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/tiered/NonTieredLevelsTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -22,17 +22,18 @@
*/
import java.util.function.IntPredicate;
+import compiler.whitebox.CompilerWhiteBoxTest;
/**
* @test NonTieredLevelsTest
- * @library /testlibrary /../../test/lib /compiler/whitebox
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build NonTieredLevelsTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:. -XX:-TieredCompilation
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
- * -XX:CompileCommand=compileonly,SimpleTestCase$Helper::*
+ * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::*
* NonTieredLevelsTest
* @summary Verify that only one level can be used
* @author igor.ignatyev@oracle.com
--- a/hotspot/test/compiler/tiered/TieredLevelsTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/tiered/TieredLevelsTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -21,16 +21,18 @@
* questions.
*/
+import compiler.whitebox.CompilerWhiteBoxTest;
+
/**
* @test TieredLevelsTest
- * @library /testlibrary /../../test/lib /compiler/whitebox
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build TieredLevelsTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:. -XX:+TieredCompilation
* -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI
- * -XX:CompileCommand=compileonly,SimpleTestCase$Helper::*
+ * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::*
* TieredLevelsTest
* @summary Verify that all levels < 'TieredStopAtLevel' can be used
* @author igor.ignatyev@oracle.com
--- a/hotspot/test/compiler/tiered/TransitionsTestExecutor.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/tiered/TransitionsTestExecutor.java Mon Nov 09 20:01:29 2015 +0000
@@ -29,6 +29,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import compiler.whitebox.CompilerWhiteBoxTest;
/**
* Executes given test in a separate VM with enabled Tiered Compilation for
--- a/hotspot/test/compiler/whitebox/ClearMethodStateTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/ClearMethodStateTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -22,16 +22,17 @@
*/
import java.util.function.Function;
+import compiler.whitebox.CompilerWhiteBoxTest;
/*
* @test ClearMethodStateTest
* @bug 8006683 8007288 8022832
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build ClearMethodStateTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* ClearMethodStateTest
+ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* ClearMethodStateTest
* @summary testing of WB::clearMethodState()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/CompilerWhiteBoxTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -20,10 +20,10 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
+package compiler.whitebox;
import sun.hotspot.WhiteBox;
import sun.hotspot.code.NMethod;
-
import java.lang.reflect.Constructor;
import java.lang.reflect.Executable;
import java.lang.reflect.Method;
@@ -38,19 +38,19 @@
*/
public abstract class CompilerWhiteBoxTest {
/** {@code CompLevel::CompLevel_none} -- Interpreter */
- protected static final int COMP_LEVEL_NONE = 0;
+ public static final int COMP_LEVEL_NONE = 0;
/** {@code CompLevel::CompLevel_any}, {@code CompLevel::CompLevel_all} */
- protected static final int COMP_LEVEL_ANY = -1;
+ public static final int COMP_LEVEL_ANY = -1;
/** {@code CompLevel::CompLevel_simple} -- C1 */
- protected static final int COMP_LEVEL_SIMPLE = 1;
+ public static final int COMP_LEVEL_SIMPLE = 1;
/** {@code CompLevel::CompLevel_limited_profile} -- C1, invocation & backedge counters */
- protected static final int COMP_LEVEL_LIMITED_PROFILE = 2;
+ public static final int COMP_LEVEL_LIMITED_PROFILE = 2;
/** {@code CompLevel::CompLevel_full_profile} -- C1, invocation & backedge counters + mdo */
- protected static final int COMP_LEVEL_FULL_PROFILE = 3;
+ public static final int COMP_LEVEL_FULL_PROFILE = 3;
/** {@code CompLevel::CompLevel_full_optimization} -- C2 or Shark */
- protected static final int COMP_LEVEL_FULL_OPTIMIZATION = 4;
+ public static final int COMP_LEVEL_FULL_OPTIMIZATION = 4;
/** Maximal value for CompLevel */
- protected static final int COMP_LEVEL_MAX = COMP_LEVEL_FULL_OPTIMIZATION;
+ public static final int COMP_LEVEL_MAX = COMP_LEVEL_FULL_OPTIMIZATION;
/** Instance of WhiteBox */
protected static final WhiteBox WHITE_BOX = WhiteBox.getWhiteBox();
@@ -312,7 +312,7 @@
*
* @param executable Executable
*/
- protected static final void waitBackgroundCompilation(Executable executable) {
+ public static final void waitBackgroundCompilation(Executable executable) {
if (!BACKGROUND_COMPILATION) {
return;
}
@@ -441,7 +441,7 @@
* @return {@code true} if the test should be skipped,
* {@code false} otherwise
*/
- protected static boolean skipOnTieredCompilation(boolean value) {
+ public static boolean skipOnTieredCompilation(boolean value) {
if (value == CompilerWhiteBoxTest.TIERED_COMPILATION) {
System.err.println("Test isn't applicable w/ "
+ (value ? "enabled" : "disabled")
@@ -452,256 +452,3 @@
}
}
-enum SimpleTestCase implements CompilerWhiteBoxTest.TestCase {
- /** constructor test case */
- CONSTRUCTOR_TEST(Helper.CONSTRUCTOR, Helper.CONSTRUCTOR_CALLABLE, false),
- /** method test case */
- METHOD_TEST(Helper.METHOD, Helper.METHOD_CALLABLE, false),
- /** static method test case */
- STATIC_TEST(Helper.STATIC, Helper.STATIC_CALLABLE, false),
- /** OSR constructor test case */
- OSR_CONSTRUCTOR_TEST(Helper.OSR_CONSTRUCTOR,
- Helper.OSR_CONSTRUCTOR_CALLABLE, true),
- /** OSR method test case */
- OSR_METHOD_TEST(Helper.OSR_METHOD, Helper.OSR_METHOD_CALLABLE, true),
- /** OSR static method test case */
- OSR_STATIC_TEST(Helper.OSR_STATIC, Helper.OSR_STATIC_CALLABLE, true);
-
- private final Executable executable;
- private final Callable<Integer> callable;
- private final boolean isOsr;
-
- private SimpleTestCase(Executable executable, Callable<Integer> callable,
- boolean isOsr) {
- this.executable = executable;
- this.callable = callable;
- this.isOsr = isOsr;
- }
-
- @Override
- public Executable getExecutable() {
- return executable;
- }
-
- @Override
- public Callable<Integer> getCallable() {
- return callable;
- }
-
- @Override
- public boolean isOsr() {
- return isOsr;
- }
-
- private static class Helper {
-
- private static final Callable<Integer> CONSTRUCTOR_CALLABLE
- = new Callable<Integer>() {
- @Override
- public Integer call() throws Exception {
- return new Helper(1337).hashCode();
- }
- };
-
- private static final Callable<Integer> METHOD_CALLABLE
- = new Callable<Integer>() {
- private final Helper helper = new Helper();
-
- @Override
- public Integer call() throws Exception {
- return helper.method();
- }
- };
-
- private static final Callable<Integer> STATIC_CALLABLE
- = new Callable<Integer>() {
- @Override
- public Integer call() throws Exception {
- return staticMethod();
- }
- };
-
- private static final Callable<Integer> OSR_CONSTRUCTOR_CALLABLE
- = new Callable<Integer>() {
- @Override
- public Integer call() throws Exception {
- return new Helper(null, CompilerWhiteBoxTest.BACKEDGE_THRESHOLD).hashCode();
- }
- };
-
- private static final Callable<Integer> OSR_METHOD_CALLABLE
- = new Callable<Integer>() {
- private final Helper helper = new Helper();
-
- @Override
- public Integer call() throws Exception {
- return helper.osrMethod(CompilerWhiteBoxTest.BACKEDGE_THRESHOLD);
- }
- };
-
- private static final Callable<Integer> OSR_STATIC_CALLABLE
- = new Callable<Integer>() {
- @Override
- public Integer call() throws Exception {
- return osrStaticMethod(CompilerWhiteBoxTest.BACKEDGE_THRESHOLD);
- }
- };
-
- private static final Constructor CONSTRUCTOR;
- private static final Constructor OSR_CONSTRUCTOR;
- private static final Method METHOD;
- private static final Method STATIC;
- private static final Method OSR_METHOD;
- private static final Method OSR_STATIC;
-
- static {
- try {
- CONSTRUCTOR = Helper.class.getDeclaredConstructor(int.class);
- } catch (NoSuchMethodException | SecurityException e) {
- throw new RuntimeException(
- "exception on getting method Helper.<init>(int)", e);
- }
- try {
- OSR_CONSTRUCTOR = Helper.class.getDeclaredConstructor(
- Object.class, long.class);
- } catch (NoSuchMethodException | SecurityException e) {
- throw new RuntimeException(
- "exception on getting method Helper.<init>(Object, long)", e);
- }
- METHOD = getMethod("method");
- STATIC = getMethod("staticMethod");
- OSR_METHOD = getMethod("osrMethod", long.class);
- OSR_STATIC = getMethod("osrStaticMethod", long.class);
- }
-
- private static Method getMethod(String name, Class<?>... parameterTypes) {
- try {
- return Helper.class.getDeclaredMethod(name, parameterTypes);
- } catch (NoSuchMethodException | SecurityException e) {
- throw new RuntimeException(
- "exception on getting method Helper." + name, e);
- }
- }
-
- private static int staticMethod() {
- return 1138;
- }
-
- private int method() {
- return 42;
- }
-
- /**
- * Deoptimizes all non-osr versions of the given executable after
- * compilation finished.
- *
- * @param e Executable
- * @throws Exception
- */
- private static void waitAndDeoptimize(Executable e) {
- CompilerWhiteBoxTest.waitBackgroundCompilation(e);
- if (WhiteBox.getWhiteBox().isMethodQueuedForCompilation(e)) {
- throw new RuntimeException(e + " must not be in queue");
- }
- // Deoptimize non-osr versions of executable
- WhiteBox.getWhiteBox().deoptimizeMethod(e, false);
- }
-
- /**
- * Executes the method multiple times to make sure we have
- * enough profiling information before triggering an OSR
- * compilation. Otherwise the C2 compiler may add uncommon traps.
- *
- * @param m Method to be executed
- * @return Number of times the method was executed
- * @throws Exception
- */
- private static int warmup(Method m) throws Exception {
- waitAndDeoptimize(m);
- Helper helper = new Helper();
- int result = 0;
- for (long i = 0; i < CompilerWhiteBoxTest.THRESHOLD; ++i) {
- result += (int)m.invoke(helper, 1);
- }
- // Wait to make sure OSR compilation is not blocked by
- // non-OSR compilation in the compile queue
- CompilerWhiteBoxTest.waitBackgroundCompilation(m);
- return result;
- }
-
- /**
- * Executes the constructor multiple times to make sure we
- * have enough profiling information before triggering an OSR
- * compilation. Otherwise the C2 compiler may add uncommon traps.
- *
- * @param c Constructor to be executed
- * @return Number of times the constructor was executed
- * @throws Exception
- */
- private static int warmup(Constructor c) throws Exception {
- waitAndDeoptimize(c);
- int result = 0;
- for (long i = 0; i < CompilerWhiteBoxTest.THRESHOLD; ++i) {
- result += c.newInstance(null, 1).hashCode();
- }
- // Wait to make sure OSR compilation is not blocked by
- // non-OSR compilation in the compile queue
- CompilerWhiteBoxTest.waitBackgroundCompilation(c);
- return result;
- }
-
- private static int osrStaticMethod(long limit) throws Exception {
- int result = 0;
- if (limit != 1) {
- result = warmup(OSR_STATIC);
- }
- // Trigger osr compilation
- for (long i = 0; i < limit; ++i) {
- result += staticMethod();
- }
- return result;
- }
-
- private int osrMethod(long limit) throws Exception {
- int result = 0;
- if (limit != 1) {
- result = warmup(OSR_METHOD);
- }
- // Trigger osr compilation
- for (long i = 0; i < limit; ++i) {
- result += method();
- }
- return result;
- }
-
- private final int x;
-
- // for method and OSR method test case
- public Helper() {
- x = 0;
- }
-
- // for OSR constructor test case
- private Helper(Object o, long limit) throws Exception {
- int result = 0;
- if (limit != 1) {
- result = warmup(OSR_CONSTRUCTOR);
- }
- // Trigger osr compilation
- for (long i = 0; i < limit; ++i) {
- result += method();
- }
- x = result;
- }
-
- // for constructor test case
- private Helper(int x) {
- this.x = x;
- }
-
- @Override
- public int hashCode() {
- return x;
- }
- }
-}
--- a/hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/DeoptimizeAllTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -21,15 +21,17 @@
* questions.
*/
+import compiler.whitebox.CompilerWhiteBoxTest;
+
/*
* @test DeoptimizeAllTest
* @bug 8006683 8007288 8022832
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build DeoptimizeAllTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* DeoptimizeAllTest
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* DeoptimizeAllTest
* @summary testing of WB::deoptimizeAll()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/DeoptimizeFramesTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -21,10 +21,12 @@
* questions.
*/
+import compiler.whitebox.CompilerWhiteBoxTest;
+
/*
* @test DeoptimizeFramesTest
* @bug 8028595
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build DeoptimizeFramesTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
--- a/hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/DeoptimizeMethodTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -21,15 +21,17 @@
* questions.
*/
+import compiler.whitebox.CompilerWhiteBoxTest;
+
/*
* @test DeoptimizeMethodTest
* @bug 8006683 8007288 8022832
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build DeoptimizeMethodTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* DeoptimizeMethodTest
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* DeoptimizeMethodTest
* @summary testing of WB::deoptimizeMethod()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/DeoptimizeMultipleOSRTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/DeoptimizeMultipleOSRTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,11 +24,12 @@
import sun.hotspot.WhiteBox;
import java.lang.reflect.Executable;
import java.lang.reflect.Method;
+import compiler.whitebox.CompilerWhiteBoxTest;
/*
* @test DeoptimizeMultipleOSRTest
* @bug 8061817
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build DeoptimizeMultipleOSRTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
--- a/hotspot/test/compiler/whitebox/EnqueueMethodForCompilationTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/EnqueueMethodForCompilationTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -21,15 +21,17 @@
* questions.
*/
+import compiler.whitebox.CompilerWhiteBoxTest;
+
/*
* @test EnqueueMethodForCompilationTest
* @bug 8006683 8007288 8022832
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build EnqueueMethodForCompilationTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm/timeout=600 -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* EnqueueMethodForCompilationTest
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* EnqueueMethodForCompilationTest
* @summary testing of WB::enqueueMethodForCompilation()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/ForceNMethodSweepTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/ForceNMethodSweepTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -30,18 +30,19 @@
import jdk.test.lib.Asserts;
import jdk.test.lib.InfiniteLoop;
+import compiler.whitebox.CompilerWhiteBoxTest;
/*
* @test
* @bug 8059624 8064669
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build ForceNMethodSweepTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions
* -XX:-TieredCompilation -XX:+WhiteBoxAPI
- * -XX:CompileCommand=compileonly,SimpleTestCase$Helper::*
+ * -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::*
* -XX:-BackgroundCompilation ForceNMethodSweepTest
* @summary testing of WB::forceNMethodSweep
*/
--- a/hotspot/test/compiler/whitebox/GetNMethodTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/GetNMethodTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -25,16 +25,17 @@
import sun.hotspot.code.BlobType;
import sun.hotspot.code.NMethod;
import jdk.test.lib.Asserts;
+import compiler.whitebox.CompilerWhiteBoxTest;
/*
* @test GetNMethodTest
* @bug 8038240
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build GetNMethodTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* GetNMethodTest
+ * @run main/othervm -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* GetNMethodTest
* @summary testing of WB::getNMethod()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/IsMethodCompilableTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,7 +24,7 @@
/*
* @test IsMethodCompilableTest
* @bug 8007270 8006683 8007288 8022832
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.base/sun.misc
* java.management
* @build jdk.test.lib.* sun.hotspot.WhiteBox
@@ -32,12 +32,13 @@
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
* @run main ClassFileInstaller jdk.test.lib.Platform
- * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -Xmixed -XX:-TieredCompilation -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:PerMethodRecompilationCutoff=3 -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* IsMethodCompilableTest
+ * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -Xmixed -XX:-TieredCompilation -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:PerMethodRecompilationCutoff=3 -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* IsMethodCompilableTest
* @summary testing of WB::isMethodCompilable()
* @author igor.ignatyev@oracle.com
*/
import jdk.test.lib.Platform;
+import compiler.whitebox.CompilerWhiteBoxTest;
public class IsMethodCompilableTest extends CompilerWhiteBoxTest {
/**
--- a/hotspot/test/compiler/whitebox/LockCompilationTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/LockCompilationTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -24,12 +24,12 @@
/*
* @test LockCompilationTest
* @bug 8059624
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build LockCompilationTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm/timeout=600 -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* LockCompilationTest
+ * @run main/othervm/timeout=600 -Xbootclasspath/a:. -Xmixed -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* LockCompilationTest
* @summary testing of WB::lock/unlockCompilation()
*/
@@ -37,7 +37,7 @@
import java.io.PrintWriter;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
-
+import compiler.whitebox.CompilerWhiteBoxTest;
import jdk.test.lib.Asserts;
public class LockCompilationTest extends CompilerWhiteBoxTest {
--- a/hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/MakeMethodNotCompilableTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -21,15 +21,17 @@
* questions.
*/
+import compiler.whitebox.CompilerWhiteBoxTest;
+
/*
* @test MakeMethodNotCompilableTest
* @bug 8012322 8006683 8007288 8022832
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build MakeMethodNotCompilableTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* MakeMethodNotCompilableTest
+ * @run main/othervm/timeout=2400 -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* MakeMethodNotCompilableTest
* @summary testing of WB::makeMethodNotCompilable()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/SetDontInlineMethodTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/SetDontInlineMethodTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -21,15 +21,17 @@
* questions.
*/
+import compiler.whitebox.CompilerWhiteBoxTest;
+
/*
* @test SetDontInlineMethodTest
* @bug 8006683 8007288 8022832
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build SetDontInlineMethodTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* SetDontInlineMethodTest
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* SetDontInlineMethodTest
* @summary testing of WB::testSetDontInlineMethod()
* @author igor.ignatyev@oracle.com
*/
--- a/hotspot/test/compiler/whitebox/SetForceInlineMethodTest.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/compiler/whitebox/SetForceInlineMethodTest.java Mon Nov 09 20:01:29 2015 +0000
@@ -21,15 +21,17 @@
* questions.
*/
+import compiler.whitebox.CompilerWhiteBoxTest;
+
/*
* @test SetForceInlineMethodTest
* @bug 8006683 8007288 8022832
- * @library /testlibrary /../../test/lib
+ * @library /testlibrary /../../test/lib /
* @modules java.management
* @build SetForceInlineMethodTest
* @run main ClassFileInstaller sun.hotspot.WhiteBox
* sun.hotspot.WhiteBox$WhiteBoxPermission
- * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,SimpleTestCase$Helper::* SetForceInlineMethodTest
+ * @run main/othervm -Xbootclasspath/a:. -XX:+UnlockDiagnosticVMOptions -XX:+WhiteBoxAPI -XX:CompileCommand=compileonly,compiler.whitebox.SimpleTestCase$Helper::* SetForceInlineMethodTest
* @summary testing of WB::testSetForceInlineMethod()
* @author igor.ignatyev@oracle.com
*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hotspot/test/compiler/whitebox/SimpleTestCase.java Mon Nov 09 20:01:29 2015 +0000
@@ -0,0 +1,284 @@
+/*
+ * 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.
+ */
+
+package compiler.whitebox;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Executable;
+import java.lang.reflect.Method;
+import java.util.concurrent.Callable;
+import sun.hotspot.WhiteBox;
+
+public enum SimpleTestCase implements CompilerWhiteBoxTest.TestCase {
+ /** constructor test case */
+ CONSTRUCTOR_TEST(Helper.CONSTRUCTOR, Helper.CONSTRUCTOR_CALLABLE, false),
+ /** method test case */
+ METHOD_TEST(Helper.METHOD, Helper.METHOD_CALLABLE, false),
+ /** static method test case */
+ STATIC_TEST(Helper.STATIC, Helper.STATIC_CALLABLE, false),
+ /** OSR constructor test case */
+ OSR_CONSTRUCTOR_TEST(Helper.OSR_CONSTRUCTOR,
+ Helper.OSR_CONSTRUCTOR_CALLABLE, true),
+ /** OSR method test case */
+ OSR_METHOD_TEST(Helper.OSR_METHOD, Helper.OSR_METHOD_CALLABLE, true),
+ /** OSR static method test case */
+ OSR_STATIC_TEST(Helper.OSR_STATIC, Helper.OSR_STATIC_CALLABLE, true);
+
+ private final Executable executable;
+ private final Callable<Integer> callable;
+ private final boolean isOsr;
+
+ private SimpleTestCase(Executable executable, Callable<Integer> callable,
+ boolean isOsr) {
+ this.executable = executable;
+ this.callable = callable;
+ this.isOsr = isOsr;
+ }
+
+ @Override
+ public Executable getExecutable() {
+ return executable;
+ }
+
+ @Override
+ public Callable<Integer> getCallable() {
+ return callable;
+ }
+
+ @Override
+ public boolean isOsr() {
+ return isOsr;
+ }
+
+ private static class Helper {
+
+ private static final Callable<Integer> CONSTRUCTOR_CALLABLE
+ = new Callable<Integer>() {
+ @Override
+ public Integer call() throws Exception {
+ return new Helper(1337).hashCode();
+ }
+ };
+
+ private static final Callable<Integer> METHOD_CALLABLE
+ = new Callable<Integer>() {
+ private final Helper helper = new Helper();
+
+ @Override
+ public Integer call() throws Exception {
+ return helper.method();
+ }
+ };
+
+ private static final Callable<Integer> STATIC_CALLABLE
+ = new Callable<Integer>() {
+ @Override
+ public Integer call() throws Exception {
+ return staticMethod();
+ }
+ };
+
+ private static final Callable<Integer> OSR_CONSTRUCTOR_CALLABLE
+ = new Callable<Integer>() {
+ @Override
+ public Integer call() throws Exception {
+ return new Helper(null, CompilerWhiteBoxTest.BACKEDGE_THRESHOLD).hashCode();
+ }
+ };
+
+ private static final Callable<Integer> OSR_METHOD_CALLABLE
+ = new Callable<Integer>() {
+ private final Helper helper = new Helper();
+
+ @Override
+ public Integer call() throws Exception {
+ return helper.osrMethod(CompilerWhiteBoxTest.BACKEDGE_THRESHOLD);
+ }
+ };
+
+ private static final Callable<Integer> OSR_STATIC_CALLABLE
+ = new Callable<Integer>() {
+ @Override
+ public Integer call() throws Exception {
+ return osrStaticMethod(CompilerWhiteBoxTest.BACKEDGE_THRESHOLD);
+ }
+ };
+
+ private static final Constructor CONSTRUCTOR;
+ private static final Constructor OSR_CONSTRUCTOR;
+ private static final Method METHOD;
+ private static final Method STATIC;
+ private static final Method OSR_METHOD;
+ private static final Method OSR_STATIC;
+
+ static {
+ try {
+ CONSTRUCTOR = Helper.class.getDeclaredConstructor(int.class);
+ } catch (NoSuchMethodException | SecurityException e) {
+ throw new RuntimeException(
+ "exception on getting method Helper.<init>(int)", e);
+ }
+ try {
+ OSR_CONSTRUCTOR = Helper.class.getDeclaredConstructor(
+ Object.class, long.class);
+ } catch (NoSuchMethodException | SecurityException e) {
+ throw new RuntimeException(
+ "exception on getting method Helper.<init>(Object, long)", e);
+ }
+ METHOD = getMethod("method");
+ STATIC = getMethod("staticMethod");
+ OSR_METHOD = getMethod("osrMethod", long.class);
+ OSR_STATIC = getMethod("osrStaticMethod", long.class);
+ }
+
+ private static Method getMethod(String name, Class<?>... parameterTypes) {
+ try {
+ return Helper.class.getDeclaredMethod(name, parameterTypes);
+ } catch (NoSuchMethodException | SecurityException e) {
+ throw new RuntimeException(
+ "exception on getting method Helper." + name, e);
+ }
+ }
+
+ private static int staticMethod() {
+ return 1138;
+ }
+
+ private int method() {
+ return 42;
+ }
+
+ /**
+ * Deoptimizes all non-osr versions of the given executable after
+ * compilation finished.
+ *
+ * @param e Executable
+ * @throws Exception
+ */
+ private static void waitAndDeoptimize(Executable e) {
+ CompilerWhiteBoxTest.waitBackgroundCompilation(e);
+ if (WhiteBox.getWhiteBox().isMethodQueuedForCompilation(e)) {
+ throw new RuntimeException(e + " must not be in queue");
+ }
+ // Deoptimize non-osr versions of executable
+ WhiteBox.getWhiteBox().deoptimizeMethod(e, false);
+ }
+
+ /**
+ * Executes the method multiple times to make sure we have
+ * enough profiling information before triggering an OSR
+ * compilation. Otherwise the C2 compiler may add uncommon traps.
+ *
+ * @param m Method to be executed
+ * @return Number of times the method was executed
+ * @throws Exception
+ */
+ private static int warmup(Method m) throws Exception {
+ waitAndDeoptimize(m);
+ Helper helper = new Helper();
+ int result = 0;
+ for (long i = 0; i < CompilerWhiteBoxTest.THRESHOLD; ++i) {
+ result += (int)m.invoke(helper, 1);
+ }
+ // Wait to make sure OSR compilation is not blocked by
+ // non-OSR compilation in the compile queue
+ CompilerWhiteBoxTest.waitBackgroundCompilation(m);
+ return result;
+ }
+
+ /**
+ * Executes the constructor multiple times to make sure we
+ * have enough profiling information before triggering an OSR
+ * compilation. Otherwise the C2 compiler may add uncommon traps.
+ *
+ * @param c Constructor to be executed
+ * @return Number of times the constructor was executed
+ * @throws Exception
+ */
+ private static int warmup(Constructor c) throws Exception {
+ waitAndDeoptimize(c);
+ int result = 0;
+ for (long i = 0; i < CompilerWhiteBoxTest.THRESHOLD; ++i) {
+ result += c.newInstance(null, 1).hashCode();
+ }
+ // Wait to make sure OSR compilation is not blocked by
+ // non-OSR compilation in the compile queue
+ CompilerWhiteBoxTest.waitBackgroundCompilation(c);
+ return result;
+ }
+
+ private static int osrStaticMethod(long limit) throws Exception {
+ int result = 0;
+ if (limit != 1) {
+ result = warmup(OSR_STATIC);
+ }
+ // Trigger osr compilation
+ for (long i = 0; i < limit; ++i) {
+ result += staticMethod();
+ }
+ return result;
+ }
+
+ private int osrMethod(long limit) throws Exception {
+ int result = 0;
+ if (limit != 1) {
+ result = warmup(OSR_METHOD);
+ }
+ // Trigger osr compilation
+ for (long i = 0; i < limit; ++i) {
+ result += method();
+ }
+ return result;
+ }
+
+ private final int x;
+
+ // for method and OSR method test case
+ public Helper() {
+ x = 0;
+ }
+
+ // for OSR constructor test case
+ private Helper(Object o, long limit) throws Exception {
+ int result = 0;
+ if (limit != 1) {
+ result = warmup(OSR_CONSTRUCTOR);
+ }
+ // Trigger osr compilation
+ for (long i = 0; i < limit; ++i) {
+ result += method();
+ }
+ x = result;
+ }
+
+ // for constructor test case
+ private Helper(int x) {
+ this.x = x;
+ }
+
+ @Override
+ public int hashCode() {
+ return x;
+ }
+ }
+}
--- a/hotspot/test/testlibrary/jdk/test/lib/Utils.java Wed Oct 21 10:37:50 2015 +0200
+++ b/hotspot/test/testlibrary/jdk/test/lib/Utils.java Mon Nov 09 20:01:29 2015 +0000
@@ -44,6 +44,7 @@
import java.util.Map;
import java.util.HashMap;
import java.util.List;
+import java.util.Objects;
import java.util.Random;
import java.util.function.BooleanSupplier;
import java.util.concurrent.TimeUnit;
@@ -82,6 +83,16 @@
*/
public static final String TEST_SRC = System.getProperty("test.src", ".").trim();
+ /*
+ * Returns the value of 'test.jdk' system property
+ */
+ public static final String TEST_JDK = System.getProperty("test.jdk");
+
+ /**
+ * Returns the value of 'test.classes' system property
+ */
+ public static final String TEST_CLASSES = System.getProperty("test.classes", ".");
+
private static Unsafe unsafe = null;
/**
@@ -616,5 +627,18 @@
NULL_VALUES.put(float.class, 0.0f);
NULL_VALUES.put(double.class, 0.0d);
}
+
+ /**
+ * Returns mandatory property value
+ * @param propName is a name of property to request
+ * @return a String with requested property value
+ */
+ public static String getMandatoryProperty(String propName) {
+ Objects.requireNonNull(propName, "Requested null property");
+ String prop = System.getProperty(propName);
+ Objects.requireNonNull(prop,
+ String.format("A mandatory property '%s' isn't set", propName));
+ return prop;
+ }
}