Recommit "[X86] Calculate the needed size of the feature arrays in _cpu_indicator_init and getHostCPUName using the size of the feature enum."

Hopefully this version will fix the previously buildbot failure
This commit is contained in:
Craig Topper 2020-06-22 13:29:43 -07:00
parent ccf5a44917
commit 23654d9e7a
3 changed files with 10 additions and 12 deletions

View File

@ -125,7 +125,8 @@ enum ProcessorFeatures {
FEATURE_AVX512VNNI, FEATURE_AVX512VNNI,
FEATURE_AVX512BITALG, FEATURE_AVX512BITALG,
FEATURE_AVX512BF16, FEATURE_AVX512BF16,
FEATURE_AVX512VP2INTERSECT FEATURE_AVX512VP2INTERSECT,
CPU_FEATURE_MAX
}; };
// The check below for i386 was copied from clang's cpuid.h (__get_cpuid_max). // The check below for i386 was copied from clang's cpuid.h (__get_cpuid_max).
@ -493,8 +494,6 @@ static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model,
static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf, static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
unsigned *Features) { unsigned *Features) {
Features[0] = 0;
Features[1] = 0;
unsigned EAX, EBX; unsigned EAX, EBX;
#define setFeature(F) \ #define setFeature(F) \
@ -653,7 +652,7 @@ int CONSTRUCTOR_ATTRIBUTE __cpu_indicator_init(void) {
unsigned MaxLeaf = 5; unsigned MaxLeaf = 5;
unsigned Vendor; unsigned Vendor;
unsigned Model, Family; unsigned Model, Family;
unsigned Features[2]; unsigned Features[(CPU_FEATURE_MAX + 31) / 32] = {0};
// This function needs to run just once. // This function needs to run just once.
if (__cpu_model.__cpu_vendor) if (__cpu_model.__cpu_vendor)
@ -670,6 +669,8 @@ int CONSTRUCTOR_ATTRIBUTE __cpu_indicator_init(void) {
// Find available features. // Find available features.
getAvailableFeatures(ECX, EDX, MaxLeaf, &Features[0]); getAvailableFeatures(ECX, EDX, MaxLeaf, &Features[0]);
assert((sizeof(Features)/sizeof(Features[0])) == 2);
__cpu_model.__cpu_features[0] = Features[0]; __cpu_model.__cpu_features[0] = Features[0];
__cpu_features2 = Features[1]; __cpu_features2 = Features[1];

View File

@ -56,7 +56,7 @@ enum ProcessorFeatures {
#define X86_FEATURE(ENUM) \ #define X86_FEATURE(ENUM) \
ENUM, ENUM,
#include "llvm/Support/X86TargetParser.def" #include "llvm/Support/X86TargetParser.def"
CPU_FEATURE_MAX
}; };
enum CPUKind { enum CPUKind {

View File

@ -582,7 +582,7 @@ static void detectX86FamilyModel(unsigned EAX, unsigned *Family,
static void static void
getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model, getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,
const unsigned (&Features)[3], const unsigned *Features,
unsigned *Type, unsigned *Subtype) { unsigned *Type, unsigned *Subtype) {
auto testFeature = [&](unsigned F) { auto testFeature = [&](unsigned F) {
return (Features[F / 32] & (1U << (F % 32))) != 0; return (Features[F / 32] & (1U << (F % 32))) != 0;
@ -910,7 +910,7 @@ getIntelProcessorTypeAndSubtype(unsigned Family, unsigned Model,
} }
static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model, static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model,
const unsigned (&Features)[3], const unsigned *Features,
unsigned *Type, unsigned *Subtype) { unsigned *Type, unsigned *Subtype) {
auto testFeature = [&](unsigned F) { auto testFeature = [&](unsigned F) {
return (Features[F / 32] & (1U << (F % 32))) != 0; return (Features[F / 32] & (1U << (F % 32))) != 0;
@ -1012,10 +1012,7 @@ static void getAMDProcessorTypeAndSubtype(unsigned Family, unsigned Model,
} }
static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf, static void getAvailableFeatures(unsigned ECX, unsigned EDX, unsigned MaxLeaf,
unsigned (&Features)[3]) { unsigned *Features) {
Features[0] = 0;
Features[1] = 0;
Features[2] = 0;
unsigned EAX, EBX; unsigned EAX, EBX;
auto setFeature = [&](unsigned F) { auto setFeature = [&](unsigned F) {
@ -1157,7 +1154,7 @@ StringRef sys::getHostCPUName() {
getX86CpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX); getX86CpuIDAndInfo(0x1, &EAX, &EBX, &ECX, &EDX);
unsigned Family = 0, Model = 0; unsigned Family = 0, Model = 0;
unsigned Features[3] = {0, 0, 0}; unsigned Features[(X86::CPU_FEATURE_MAX + 31) / 32] = {0};
detectX86FamilyModel(EAX, &Family, &Model); detectX86FamilyModel(EAX, &Family, &Model);
getAvailableFeatures(ECX, EDX, MaxLeaf, Features); getAvailableFeatures(ECX, EDX, MaxLeaf, Features);