< prev index next >
src/hotspot/cpu/x86/vm_version_x86.cpp
Print this page
rev 52433 : 8213538: VM crashes when MaxVectorSize is set to 0, 1 or 2
Summary: Require MaxVectorSize minimum 4 on 64 bit
Reviewed-by:
*** 982,1029 ****
// Only supported with SSE2+
FLAG_SET_DEFAULT(UseFPUForSpilling, false);
}
}
#endif
#if COMPILER2_OR_JVMCI
! if (MaxVectorSize > 0) {
! if (!is_power_of_2(MaxVectorSize)) {
! warning("MaxVectorSize must be a power of 2");
! FLAG_SET_DEFAULT(MaxVectorSize, 64);
! }
if (UseSSE < 2) {
// Vectors (in XMM) are only supported with SSE2+
! if (MaxVectorSize > 0) {
! if (!FLAG_IS_DEFAULT(MaxVectorSize))
! warning("MaxVectorSize must be 0");
! FLAG_SET_DEFAULT(MaxVectorSize, 0);
! }
! }
! else if (UseAVX == 0 || !os_supports_avx_vectors()) {
// 32 bytes vectors (in YMM) are only supported with AVX+
! if (MaxVectorSize > 16) {
! if (!FLAG_IS_DEFAULT(MaxVectorSize))
! warning("MaxVectorSize must be <= 16");
! FLAG_SET_DEFAULT(MaxVectorSize, 16);
! }
! }
! else if (UseAVX == 1 || UseAVX == 2) {
// 64 bytes vectors (in ZMM) are only supported with AVX 3
! if (MaxVectorSize > 32) {
! if (!FLAG_IS_DEFAULT(MaxVectorSize))
! warning("MaxVectorSize must be <= 32");
! FLAG_SET_DEFAULT(MaxVectorSize, 32);
}
}
! else if (UseAVX > 2 ) {
! if (MaxVectorSize > 64) {
! if (!FLAG_IS_DEFAULT(MaxVectorSize))
! warning("MaxVectorSize must be <= 64");
! FLAG_SET_DEFAULT(MaxVectorSize, 64);
}
}
#if defined(COMPILER2) && defined(ASSERT)
if (supports_avx() && PrintMiscellaneous && Verbose && TraceNewVectors) {
tty->print_cr("State of YMM registers after signal handle:");
int nreg = 2 LP64_ONLY(+2);
const char* ymm_name[4] = {"0", "7", "8", "15"};
for (int i = 0; i < nreg; i++) {
--- 982,1034 ----
// Only supported with SSE2+
FLAG_SET_DEFAULT(UseFPUForSpilling, false);
}
}
#endif
+
#if COMPILER2_OR_JVMCI
! int mvs_max = 0;
if (UseSSE < 2) {
// Vectors (in XMM) are only supported with SSE2+
! // SSE is always 2 on x64.
! mvs_max = 0;
! } else if (UseAVX == 0 || !os_supports_avx_vectors()) {
! // 16 byte vectors (in XMM) are supported with SSE2+
! mvs_max = 16;
! } else if (UseAVX == 1 || UseAVX == 2) {
// 32 bytes vectors (in YMM) are only supported with AVX+
! mvs_max = 32;
! } else if (UseAVX > 2 ) {
// 64 bytes vectors (in ZMM) are only supported with AVX 3
! mvs_max = 64;
}
+
+ int mvs_min = 0;
+ #ifdef _LP64
+ mvs_min = 4; // We require MaxVectorSize to be at least 4 on 64bit
+ #endif
+
+ if (!FLAG_IS_DEFAULT(MaxVectorSize)) {
+ if (MaxVectorSize < mvs_min) {
+ warning("MaxVectorSize must be at least %i on this platform", mvs_min);
+ FLAG_SET_DEFAULT(MaxVectorSize, mvs_min);
+ }
+ if (MaxVectorSize > mvs_max) {
+ warning("MaxVectorSize must be at most %i on this platform", mvs_max);
+ FLAG_SET_DEFAULT(MaxVectorSize, mvs_max);
}
! if (!is_power_of_2(MaxVectorSize)) {
! warning("MaxVectorSize must be a power of 2, setting to default: %i", mvs_max);
! FLAG_SET_DEFAULT(MaxVectorSize, mvs_max);
}
+ } else {
+ // If default, use highest supported configuration
+ FLAG_SET_DEFAULT(MaxVectorSize, mvs_max);
}
+
#if defined(COMPILER2) && defined(ASSERT)
+ if (MaxVectorSize > 0) {
if (supports_avx() && PrintMiscellaneous && Verbose && TraceNewVectors) {
tty->print_cr("State of YMM registers after signal handle:");
int nreg = 2 LP64_ONLY(+2);
const char* ymm_name[4] = {"0", "7", "8", "15"};
for (int i = 0; i < nreg; i++) {
< prev index next >