diff --git a/gcc/config/i386/driver-i386.c b/gcc/config/i386/driver-i386.c
index 8107ece..5f14c76 100644
--- a/gcc/config/i386/driver-i386.c
+++ b/gcc/config/i386/driver-i386.c
@@ -451,6 +451,15 @@ const char *host_detect_local_cpu (int argc, const char **argv)
   has_sse = edx & bit_SSE;
   has_sse2 = edx & bit_SSE2;
 
+  if (max_level >= 7)
+    {
+      __cpuid_count (7, 0, eax, ebx, ecx, edx);
+
+      has_bmi = ebx & bit_BMI;
+      has_avx2 = ebx & bit_AVX2;
+      has_bmi2 = ebx & bit_BMI2;
+    }
+
   /* Check cpuid level of extended features.  */
   __cpuid (0x80000000, ext_level, ebx, ecx, edx);
 
@@ -470,12 +479,6 @@ const char *host_detect_local_cpu (int argc, const char **argv)
       has_longmode = edx & bit_LM;
       has_3dnowp = edx & bit_3DNOWP;
       has_3dnow = edx & bit_3DNOW;
-
-      __cpuid (0x7, eax, ebx, ecx, edx);
-
-      has_bmi = ebx & bit_BMI;
-      has_avx2 = ebx & bit_AVX2;
-      has_bmi2 = ebx & bit_BMI2;
     }
 
   if (!arch)
diff --git a/gcc/testsuite/gcc.target/i386/avx2-check.h b/gcc/testsuite/gcc.target/i386/avx2-check.h
index 22c9b39..424335d 100644
--- a/gcc/testsuite/gcc.target/i386/avx2-check.h
+++ b/gcc/testsuite/gcc.target/i386/avx2-check.h
@@ -21,6 +21,9 @@ main ()
   /* Run AVX2 test only if host has AVX2 support.  */
   if ((ecx & bit_OSXSAVE) == (bit_OSXSAVE))
     {
+      if (__get_cpuid_max (0, NULL) < 7)
+	return 0;
+
       __cpuid_count (7, 0, eax, ebx, ecx, edx);
 
       if ((avx_os_support ()) && ((ebx & bit_AVX2) == bit_AVX2))
diff --git a/gcc/testsuite/gcc.target/i386/bmi2-check.h b/gcc/testsuite/gcc.target/i386/bmi2-check.h
index 5ffce44..c933a49 100644
--- a/gcc/testsuite/gcc.target/i386/bmi2-check.h
+++ b/gcc/testsuite/gcc.target/i386/bmi2-check.h
@@ -17,6 +17,9 @@ main ()
 {
   unsigned int eax, ebx, ecx, edx;
 
+  if (__get_cpuid_max (0, NULL) < 7)
+    return 0;
+
   __cpuid_count (7, 0,  eax, ebx, ecx, edx);
 
   /* Run BMI2 test only if host has BMI2 support.  */
