Author: Craig Topper
Date: 2026-08-16T21:41:51-07:00
New Revision: 2b5f97068fa15083295cd5d37a1a0d4d01396026

URL: 
https://github.com/llvm/llvm-project/commit/2b5f97068fa15083295cd5d37a1a0d4d01396026
DIFF: 
https://github.com/llvm/llvm-project/commit/2b5f97068fa15083295cd5d37a1a0d4d01396026.diff

LOG: [RISCV] Move -mtune=native expansion into riscv::getRISCVTuneCPU. NFC 
(#215891)

Previously it was applied at one of the call sites. Applying it inside
makes it more clear how it is supposed to interact with
-mexperimental-mtune-syntax

Added: 
    

Modified: 
    clang/lib/Driver/ToolChains/Arch/RISCV.cpp
    clang/lib/Driver/ToolChains/Clang.cpp
    clang/test/Driver/riscv-mtune-tune-features.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp 
b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
index c97ce34a9fc77..8e650ddf92dfc 100644
--- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
@@ -457,14 +457,20 @@ riscv::getRISCVTuneCPU(const Driver &D, const 
llvm::opt::ArgList &Args,
     TuneCPU = TuneCPU.slice(0, Idx);
   }
 
-  if (!TuneFeatures || TFString.empty())
-    return TuneCPU;
-  if (auto E = llvm::RISCV::parseTuneFeatureString(TuneCPU, TFString,
-                                                   *TuneFeatures)) {
-    D.Diag(diag::err_drv_invalid_riscv_mtune_string)
-        << 1 << TFString << llvm::toString(std::move(E));
-    return std::nullopt;
+  if (TuneFeatures && !TFString.empty()) {
+    if (auto E = llvm::RISCV::parseTuneFeatureString(TuneCPU, TFString,
+                                                     *TuneFeatures)) {
+      D.Diag(diag::err_drv_invalid_riscv_mtune_string)
+          << 1 << TFString << llvm::toString(std::move(E));
+      return std::nullopt;
+    }
   }
 
+  // Apply -mtune=native after applying features. Not all features apply to
+  // all CPUs so an -mtune=native:<feature> may fail depending on what the
+  // native was expanded to.
+  if (TuneCPU == "native")
+    TuneCPU = llvm::sys::getHostCPUName();
+
   return TuneCPU;
 }

diff  --git a/clang/lib/Driver/ToolChains/Clang.cpp 
b/clang/lib/Driver/ToolChains/Clang.cpp
index 63eaa130d0969..54583fe3abbd8 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -2057,12 +2057,9 @@ void Clang::AddRISCVTargetArgs(const ArgList &Args,
     return;
   if (!TuneCPU->empty()) {
     CmdArgs.push_back("-tune-cpu");
-    if (*TuneCPU == "native")
-      CmdArgs.push_back(Args.MakeArgString(llvm::sys::getHostCPUName()));
-    else
-      // TuneCPU might or might not be the original -mtune string, so we
-      // have to create a new copy here.
-      CmdArgs.push_back(Args.MakeArgString(*TuneCPU));
+    // TuneCPU might or might not be the original -mtune string, so we
+    // have to create a new copy here.
+    CmdArgs.push_back(Args.MakeArgString(*TuneCPU));
   }
 
   // Handle -mrvv-vector-bits=<bits>

diff  --git a/clang/test/Driver/riscv-mtune-tune-features.c 
b/clang/test/Driver/riscv-mtune-tune-features.c
index bb55443b51c8e..f674243097a8f 100644
--- a/clang/test/Driver/riscv-mtune-tune-features.c
+++ b/clang/test/Driver/riscv-mtune-tune-features.c
@@ -42,3 +42,9 @@
 // RUN:     FileCheck --check-prefix=UNSUPPORTED-DIRECTIVE %s
 // UNSUPPORTED-DIRECTIVE: invalid tune feature string 'prefer-w-inst':
 // UNSUPPORTED-DIRECTIVE-SAME: Directive 'prefer-w-inst' is not allowed to be 
used with processor 'sifive-x280'
+
+// RUN: not %clang --target=riscv64 -mexperimental-mtune-syntax \
+// RUN:     -mtune=native:full-vec-fp64 -c %s 2>&1 | \
+// RUN:     FileCheck --check-prefix=NO-DIRECTIVE-NATIVE %s
+// NO-DIRECTIVE-NATIVE: invalid tune feature string 'full-vec-fp64':
+// NO-DIRECTIVE-NATIVE-SAME: Processor 'native' has no configurable tuning 
features


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to