[llvm] 7409c1f - [MCA] Ignore host -mcpu when target lacks said CPU (#174004)

via llvm-commits llvm-commits at lists.llvm.org
Tue Dec 30 10:23:12 PST 2025


Author: Amina Chabane
Date: 2025-12-30T18:23:08Z
New Revision: 7409c1f8685fb32450087857477c49ac0f82a7a2

URL: https://github.com/llvm/llvm-project/commit/7409c1f8685fb32450087857477c49ac0f82a7a2
DIFF: https://github.com/llvm/llvm-project/commit/7409c1f8685fb32450087857477c49ac0f82a7a2.diff

LOG: [MCA] Ignore host -mcpu when target lacks said CPU (#174004)

#173399 failed on buildbot llvm-clang-ubuntu-x-aarch64-pauth. This patch
aims to rectify this.

--------------

llvm-mca rewrites `-mcpu=native` to `sys::getHostCPUName()` and then
immediately instantiates an
`MCSubtargetInfo`. If the build host is x86 but the selected triple is
AArch64, then the CPU string (e.g. “znver4”) isn’t valid, so
`InitMCProcessorInfo` emits a warning. This broke lit tests on cross
compilation.

This patch aims to fix this by creating a default subtarget first,
querying `STI->isCPUStringValid(hostCPU)`
and only recreating the subtarget with the detected host CPU when it’s
supported.

`mcpu-help.test` has been moved into the AArch64 directory, as it is not
target-independent

Added: 
    llvm/test/tools/llvm-mca/AArch64/mcpu-help.test

Modified: 
    llvm/tools/llvm-mca/llvm-mca.cpp

Removed: 
    llvm/test/tools/llvm-mca/mcpu-help.test


################################################################################
diff  --git a/llvm/test/tools/llvm-mca/mcpu-help.test b/llvm/test/tools/llvm-mca/AArch64/mcpu-help.test
similarity index 100%
rename from llvm/test/tools/llvm-mca/mcpu-help.test
rename to llvm/test/tools/llvm-mca/AArch64/mcpu-help.test

diff  --git a/llvm/tools/llvm-mca/llvm-mca.cpp b/llvm/tools/llvm-mca/llvm-mca.cpp
index c4aa081a095f8..45fa4973d4399 100644
--- a/llvm/tools/llvm-mca/llvm-mca.cpp
+++ b/llvm/tools/llvm-mca/llvm-mca.cpp
@@ -392,9 +392,6 @@ int main(int argc, char **argv) {
   if (!TheTarget)
     return 1;
 
-  if (MCPU == "native")
-    MCPU = std::string(llvm::sys::getHostCPUName());
-
   // Package up features to be passed to target/subtarget
   std::string FeaturesStr;
   if (MATTRS.size()) {
@@ -404,13 +401,44 @@ int main(int argc, char **argv) {
     FeaturesStr = Features.getString();
   }
 
-  std::unique_ptr<MCSubtargetInfo> STI(
-      TheTarget->createMCSubtargetInfo(TheTriple, MCPU, FeaturesStr));
-  if (!STI) {
-    WithColor::error() << "unable to create subtarget info\n";
-    return 1;
+  auto CreateSubtargetInfo = [&](StringRef CPU) {
+    return std::unique_ptr<MCSubtargetInfo>(
+        TheTarget->createMCSubtargetInfo(TheTriple, CPU, FeaturesStr));
+  };
+
+  std::unique_ptr<MCSubtargetInfo> STI;
+  if (MCPU == "native") {
+    std::string HostCPU = std::string(llvm::sys::getHostCPUName());
+    STI = CreateSubtargetInfo("");
+    if (!STI) {
+      WithColor::error() << "unable to create subtarget info\n";
+      return 1;
+    }
+    if (!HostCPU.empty() && STI->isCPUStringValid(HostCPU)) {
+      // Only utilise the detected host CPU when it exists in the processor
+      // table for the requested triple.
+      STI = CreateSubtargetInfo(HostCPU);
+      if (!STI) {
+        WithColor::error() << "unable to create subtarget info\n";
+        return 1;
+      }
+      MCPU = HostCPU;
+    } else {
+      MCPU.clear();
+    }
+  } else {
+    STI = CreateSubtargetInfo(MCPU);
+    if (!STI) {
+      WithColor::error() << "unable to create subtarget info\n";
+      return 1;
+    }
   }
 
+  if (MCPU.empty())
+    // MCPU being empty here means the target default was selected above,
+    // which avoids forwarding incompatible host CPUs when cross-compiling.
+    MCPU = std::string(STI->getCPU());
+
   if (MCPU == "help")
     return 0;
 


        


More information about the llvm-commits mailing list