[clang] clang: Replace Is*OffloadArch free functions with OffloadArch methods (PR #213363)

Matt Arsenault via cfe-commits cfe-commits at lists.llvm.org
Sat Aug 1 12:42:31 PDT 2026


https://github.com/arsenm updated https://github.com/llvm/llvm-project/pull/213363

>From 6ca4be641c230d4f642139f759cd7266b2e77f9a Mon Sep 17 00:00:00 2001
From: Matt Arsenault <Matthew.Arsenault at amd.com>
Date: Fri, 31 Jul 2026 22:16:49 +0200
Subject: [PATCH] clang: Replace Is*OffloadArch free functions with OffloadArch
 methods

Drop the IsNVIDIAOffloadArch/IsAMDOffloadArch/IsIntel*OffloadArch free
functions in favor of the OffloadArch member predicate functions.

Co-authored-by: Claude (Claude-Opus-4.8) <noreply at anthropic.com>
---
 clang/include/clang/Basic/OffloadArch.h       |  9 ----
 clang/lib/Basic/Cuda.cpp                      |  4 +-
 clang/lib/Basic/Targets/NVPTX.cpp             |  2 +-
 clang/lib/Driver/Driver.cpp                   | 12 ++---
 clang/lib/Driver/ToolChains/Clang.cpp         |  2 +-
 .../clang-sycl-linker/ClangSYCLLinker.cpp     |  8 +--
 clang/unittests/Basic/OffloadArchTest.cpp     | 54 +++++++++++--------
 7 files changed, 46 insertions(+), 45 deletions(-)

diff --git a/clang/include/clang/Basic/OffloadArch.h b/clang/include/clang/Basic/OffloadArch.h
index 069352ea37f89..1d8f6434547d5 100644
--- a/clang/include/clang/Basic/OffloadArch.h
+++ b/clang/include/clang/Basic/OffloadArch.h
@@ -106,15 +106,6 @@ class OffloadArch {
   }
 };
 
-inline bool IsNVIDIAOffloadArch(OffloadArch A) { return A.isNVPTX(); }
-inline bool IsAMDOffloadArch(OffloadArch A) {
-  // amdgcnspirv is compiled through the AMDGPU toolchain.
-  return A.isAMDGPU() || A.isSPIRV();
-}
-inline bool IsIntelCPUOffloadArch(OffloadArch A) { return A.isIntelCPU(); }
-inline bool IsIntelGPUOffloadArch(OffloadArch A) { return A.isIntelGPU(); }
-inline bool IsIntelOffloadArch(OffloadArch A) { return A.isIntel(); }
-
 const char *OffloadArchToString(OffloadArch A);
 const char *OffloadArchToVirtualArchString(OffloadArch A);
 
diff --git a/clang/lib/Basic/Cuda.cpp b/clang/lib/Basic/Cuda.cpp
index 06c02bd541df3..47cfcdc47500f 100644
--- a/clang/lib/Basic/Cuda.cpp
+++ b/clang/lib/Basic/Cuda.cpp
@@ -83,7 +83,7 @@ CudaVersion MinVersionForOffloadArch(OffloadArch A) {
     return CudaVersion::UNKNOWN;
 
   // AMD GPUs do not depend on CUDA versions.
-  if (IsAMDOffloadArch(A))
+  if (A.isAMDGPU() || A.isSPIRV())
     return CudaVersion::CUDA_70;
 
   switch (A.nvptxKind()) {
@@ -98,7 +98,7 @@ CudaVersion MinVersionForOffloadArch(OffloadArch A) {
 
 CudaVersion MaxVersionForOffloadArch(OffloadArch A) {
   // AMD GPUs do not depend on CUDA versions.
-  if (IsAMDOffloadArch(A))
+  if (A.isAMDGPU() || A.isSPIRV())
     return CudaVersion::NEW;
 
   if (!A.isNVPTX())
diff --git a/clang/lib/Basic/Targets/NVPTX.cpp b/clang/lib/Basic/Targets/NVPTX.cpp
index d2fed6a2f9787..11577b75236a6 100644
--- a/clang/lib/Basic/Targets/NVPTX.cpp
+++ b/clang/lib/Basic/Targets/NVPTX.cpp
@@ -176,7 +176,7 @@ void NVPTXTargetInfo::getTargetDefines(const LangOptions &Opts,
   Builder.defineMacro("__NVPTX__");
 
   // Skip setting architecture dependent macros if undefined.
-  if (!IsNVIDIAOffloadArch(GPU))
+  if (!GPU.isNVPTX())
     return;
 
   if (Opts.CUDAIsDevice || Opts.OpenMPIsTargetDevice || !HostTarget) {
diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp
index 5bd46db170d96..0bdc4d7e13082 100644
--- a/clang/lib/Driver/Driver.cpp
+++ b/clang/lib/Driver/Driver.cpp
@@ -965,12 +965,12 @@ static TripleSet inferOffloadToolchains(Compilation &C,
       ID = StringToOffloadArch(
           getProcessorFromTargetID(llvm::Triple("amdgcn-amd-amdhsa"), Arch));
 
-    if (Kind == Action::OFK_HIP && !IsAMDOffloadArch(ID)) {
+    if (Kind == Action::OFK_HIP && !ID.isAMDGPU() && !ID.isSPIRV()) {
       C.getDriver().Diag(clang::diag::err_drv_offload_bad_gpu_arch)
           << "HIP" << Arch;
       return {};
     }
-    if (Kind == Action::OFK_Cuda && !IsNVIDIAOffloadArch(ID)) {
+    if (Kind == Action::OFK_Cuda && !ID.isNVPTX()) {
       C.getDriver().Diag(clang::diag::err_drv_offload_bad_gpu_arch)
           << "CUDA" << Arch;
       return {};
@@ -4881,21 +4881,21 @@ static StringRef getCanonicalArchString(Compilation &C,
   // expecting the triple to be only NVPTX / AMDGPU.
   OffloadArch Arch =
       StringToOffloadArch(getProcessorFromTargetID(Triple, ArchStr));
-  if (Triple.isNVPTX() && (Arch.isUnknown() || !IsNVIDIAOffloadArch(Arch))) {
+  if (Triple.isNVPTX() && (Arch.isUnknown() || !Arch.isNVPTX())) {
     C.getDriver().Diag(clang::diag::err_drv_offload_bad_gpu_arch)
         << "CUDA" << ArchStr;
     return StringRef();
   } else if (Triple.isAMDGPU() &&
-             (Arch.isUnknown() || !IsAMDOffloadArch(Arch))) {
+             (Arch.isUnknown() || (!Arch.isAMDGPU() && !Arch.isSPIRV()))) {
     C.getDriver().Diag(clang::diag::err_drv_offload_bad_gpu_arch)
         << "HIP" << ArchStr;
     return StringRef();
   }
 
-  if (IsNVIDIAOffloadArch(Arch))
+  if (Arch.isNVPTX())
     return Args.MakeArgStringRef(OffloadArchToString(Arch));
 
-  if (IsAMDOffloadArch(Arch)) {
+  if (Arch.isAMDGPU() || Arch.isSPIRV()) {
     llvm::StringMap<bool> Features;
     std::optional<StringRef> Arch = parseTargetID(Triple, ArchStr, &Features);
     if (!Arch) {
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 7f3b503153ab1..c51d200c91a06 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -1060,7 +1060,7 @@ void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
       const ToolChain *TC = I.second;
       for (BoundArch Arch :
            D.getOffloadArchs(C, C.getArgs(), Action::OFK_Cuda, *TC)) {
-        if (IsNVIDIAOffloadArch(Arch.Arch))
+        if (Arch.Arch.isNVPTX())
           ArchIDs.insert(CudaArchToID(Arch.Arch));
       }
     }
diff --git a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
index acb529faa0b51..70afc6d6c4cea 100644
--- a/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
+++ b/clang/tools/clang-sycl-linker/ClangSYCLLinker.cpp
@@ -750,9 +750,9 @@ static Error runAOTCompile(StringRef InputFile, StringRef OutputFile,
                            const ArgList &Args) {
   StringRef Arch = Args.getLastArgValue(OPT_arch_EQ);
   OffloadArch OA = StringToOffloadArch(Arch);
-  if (IsIntelGPUOffloadArch(OA))
+  if (OA.isIntelGPU())
     return runAOTCompileIntelGPU(InputFile, OutputFile, Args);
-  if (IsIntelCPUOffloadArch(OA))
+  if (OA.isIntelCPU())
     return runAOTCompileIntelCPU(InputFile, OutputFile, Args);
 
   llvm_unreachable("runAOTCompile dispatched on unsupported arch");
@@ -978,8 +978,8 @@ static Error runSYCLLink(ArrayRef<std::unique_ptr<MemoryBuffer>> Inputs,
     SplitModules = std::move(*SplitModulesOrErr);
   }
 
-  bool IsAOTCompileNeeded = IsIntelOffloadArch(
-      StringToOffloadArch(Args.getLastArgValue(OPT_arch_EQ)));
+  bool IsAOTCompileNeeded =
+      StringToOffloadArch(Args.getLastArgValue(OPT_arch_EQ)).isIntel();
 
   StringRef OutputFileNameExt = ".spv";
 
diff --git a/clang/unittests/Basic/OffloadArchTest.cpp b/clang/unittests/Basic/OffloadArchTest.cpp
index 36dd958f0d896..aff308941be0a 100644
--- a/clang/unittests/Basic/OffloadArchTest.cpp
+++ b/clang/unittests/Basic/OffloadArchTest.cpp
@@ -13,28 +13,38 @@ using namespace clang;
 
 static OffloadArch parse(llvm::StringRef S) { return StringToOffloadArch(S); }
 
-TEST(OffloadArchTest, VendorClassification) {
-  EXPECT_TRUE(IsNVIDIAOffloadArch(parse("sm_20")));
-  EXPECT_TRUE(IsNVIDIAOffloadArch(parse("sm_120a")));
-  EXPECT_FALSE(IsNVIDIAOffloadArch(parse("gfx600")));
-
-  EXPECT_FALSE(IsAMDOffloadArch(parse("sm_120a")));
-  EXPECT_TRUE(IsAMDOffloadArch(parse("gfx600")));
-  EXPECT_TRUE(IsAMDOffloadArch(parse("gfx1201")));
-  EXPECT_TRUE(IsAMDOffloadArch(parse("gfx12-generic")));
-  EXPECT_TRUE(IsAMDOffloadArch(parse("amdgcnspirv")));
-  EXPECT_FALSE(IsAMDOffloadArch(parse("graniterapids")));
-
-  EXPECT_TRUE(IsIntelOffloadArch(parse("graniterapids")));
-  EXPECT_TRUE(IsIntelCPUOffloadArch(parse("graniterapids")));
-  EXPECT_FALSE(IsIntelGPUOffloadArch(parse("graniterapids")));
-  EXPECT_TRUE(IsIntelOffloadArch(parse("bmg_g21")));
-  EXPECT_FALSE(IsIntelCPUOffloadArch(parse("bmg_g21")));
-  EXPECT_TRUE(IsIntelGPUOffloadArch(parse("bmg_g21")));
-
-  EXPECT_FALSE(IsNVIDIAOffloadArch(parse("generic")));
-  EXPECT_FALSE(IsAMDOffloadArch(parse("generic")));
-  EXPECT_FALSE(IsIntelOffloadArch(parse("generic")));
+TEST(OffloadArchTest, TargetArchClassification) {
+  OffloadArch NV = parse("sm_120a");
+  EXPECT_TRUE(parse("sm_20").isNVPTX());
+  EXPECT_TRUE(NV.isNVPTX());
+  EXPECT_FALSE(NV.isAMDGPU());
+
+  EXPECT_TRUE(parse("gfx600").isAMDGPU());
+  EXPECT_TRUE(parse("gfx1201").isAMDGPU());
+  EXPECT_TRUE(parse("gfx12-generic").isAMDGPU());
+  EXPECT_FALSE(parse("gfx600").isNVPTX());
+
+  OffloadArch SPIRV = parse("amdgcnspirv");
+  EXPECT_FALSE(SPIRV.isAMDGPU());
+  EXPECT_TRUE(SPIRV.isSPIRV());
+
+  OffloadArch IntelCPU = parse("graniterapids");
+  EXPECT_FALSE(IntelCPU.isAMDGPU());
+  EXPECT_FALSE(IntelCPU.isSPIRV());
+  EXPECT_TRUE(IntelCPU.isIntel());
+  EXPECT_TRUE(IntelCPU.isIntelCPU());
+  EXPECT_FALSE(IntelCPU.isIntelGPU());
+
+  OffloadArch IntelGPU = parse("bmg_g21");
+  EXPECT_TRUE(IntelGPU.isIntel());
+  EXPECT_FALSE(IntelGPU.isIntelCPU());
+  EXPECT_TRUE(IntelGPU.isIntelGPU());
+
+  OffloadArch Generic = parse("generic");
+  EXPECT_FALSE(Generic.isNVPTX());
+  EXPECT_FALSE(Generic.isAMDGPU());
+  EXPECT_FALSE(Generic.isSPIRV());
+  EXPECT_FALSE(Generic.isIntel());
 }
 
 TEST(OffloadArchTest, Unknown) {



More information about the cfe-commits mailing list