From fcca10c69aaab539962d10fcc59a5f074b73b0de Mon Sep 17 00:00:00 2001 From: Keith Smiley Date: Mon, 14 Feb 2022 11:27:43 -0800 Subject: [PATCH] [AArch64] Add support for -march=native for Apple M1 CPU This improves the getHostCPUName check for Apple M1 CPUs, which previously would always be considered cyclone instead. This also enables `-march=native` support when building on M1 CPUs which would previously fail. This isn't as sophisticated as the X86 CPU feature checking which consults the CPU via getHostCPUFeatures, but this is still better than before. This CPU selection could also be invalid if this was run on an iOS device instead, ideally we can improve those cases as they come up. Differential Revision: https://reviews.llvm.org/D119788 --- clang/lib/Driver/ToolChains/Arch/AArch64.cpp | 2 + llvm/lib/Support/Host.cpp | 64 +++++++++++++++++----------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp index 610c672..a0be30f 100644 --- a/clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ b/clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -151,6 +151,8 @@ getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March, std::pair Split = StringRef(MarchLowerCase).split("+"); llvm::AArch64::ArchKind ArchKind = llvm::AArch64::parseArch(Split.first); + if (Split.first == "native") + ArchKind = llvm::AArch64::getCPUArchKind(llvm::sys::getHostCPUName().str()); if (ArchKind == llvm::AArch64::ArchKind::INVALID || !llvm::AArch64::getArchFeatures(ArchKind, Features)) return false; diff --git a/llvm/lib/Support/Host.cpp b/llvm/lib/Support/Host.cpp index a4a375e..31cc4df 100644 --- a/llvm/lib/Support/Host.cpp +++ b/llvm/lib/Support/Host.cpp @@ -41,6 +41,8 @@ #include #include #include +#include +#include #endif #ifdef _AIX #include @@ -1297,32 +1299,45 @@ StringRef sys::getHostCPUName() { bool HaveVectorSupport = CVT[244] & 0x80; return getCPUNameFromS390Model(Id, HaveVectorSupport); } -#elif defined(__APPLE__) && defined(__aarch64__) -StringRef sys::getHostCPUName() { - return "cyclone"; -} -#elif defined(__APPLE__) && defined(__arm__) -StringRef sys::getHostCPUName() { - host_basic_info_data_t hostInfo; - mach_msg_type_number_t infoCount; +#elif defined(__APPLE__) && (defined(__arm__) || defined(__aarch64__)) +#define CPUFAMILY_ARM_SWIFT 0x1e2d6381 +#define CPUFAMILY_ARM_CYCLONE 0x37a09642 +#define CPUFAMILY_ARM_TYPHOON 0x2c91a47e +#define CPUFAMILY_ARM_TWISTER 0x92fb37c8 +#define CPUFAMILY_ARM_HURRICANE 0x67ceee93 +#define CPUFAMILY_ARM_MONSOON_MISTRAL 0xe81e7ef6 +#define CPUFAMILY_ARM_VORTEX_TEMPEST 0x07d34b9f +#define CPUFAMILY_ARM_LIGHTNING_THUNDER 0x462504d2 +#define CPUFAMILY_ARM_FIRESTORM_ICESTORM 0x1b588bb3 - infoCount = HOST_BASIC_INFO_COUNT; - mach_port_t hostPort = mach_host_self(); - host_info(hostPort, HOST_BASIC_INFO, (host_info_t)&hostInfo, - &infoCount); - mach_port_deallocate(mach_task_self(), hostPort); +StringRef sys::getHostCPUName() { + uint32_t Family; + size_t Length = sizeof(Family); + sysctlbyname("hw.cpufamily", &Family, &Length, NULL, 0); - if (hostInfo.cpu_type != CPU_TYPE_ARM) { - assert(false && "CPUType not equal to ARM should not be possible on ARM"); - return "generic"; + switch (Family) { + case CPUFAMILY_ARM_SWIFT: + return "swift"; + case CPUFAMILY_ARM_CYCLONE: + return "apple-a7"; + case CPUFAMILY_ARM_TYPHOON: + return "apple-a8"; + case CPUFAMILY_ARM_TWISTER: + return "apple-a9"; + case CPUFAMILY_ARM_HURRICANE: + return "apple-a10"; + case CPUFAMILY_ARM_MONSOON_MISTRAL: + return "apple-a11"; + case CPUFAMILY_ARM_VORTEX_TEMPEST: + return "apple-a12"; + case CPUFAMILY_ARM_LIGHTNING_THUNDER: + return "apple-a13"; + case CPUFAMILY_ARM_FIRESTORM_ICESTORM: + return "apple-m1"; + default: + // Default to the newest CPU we know about. + return "apple-m1"; } - switch (hostInfo.cpu_subtype) { - case CPU_SUBTYPE_ARM_V7S: - return "swift"; - default:; - } - - return "generic"; } #elif defined(_AIX) StringRef sys::getHostCPUName() { @@ -1453,9 +1468,6 @@ int computeHostNumPhysicalCores() { #elif defined(__linux__) && defined(__s390x__) int computeHostNumPhysicalCores() { return sysconf(_SC_NPROCESSORS_ONLN); } #elif defined(__APPLE__) -#include -#include - // Gets the number of *physical cores* on the machine. int computeHostNumPhysicalCores() { uint32_t count; -- 2.7.4