< 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 >