================
@@ -10,161 +10,121 @@
 #define LLVM_CLANG_BASIC_OFFLOADARCH_H
 
 #include "llvm/ADT/StringRef.h"
+#include <cstdint>
 #include <tuple>
 
 namespace llvm {
 class Triple;
+template <typename T> class SmallVectorImpl;
+namespace NVPTX {
+enum GPUKind : uint8_t;
+}
+namespace AMDGPU {
+enum GPUKind : uint8_t;
+}
 } // namespace llvm
 
 namespace clang {
 
-enum class OffloadArch {
-  Unused,
-  Unknown,
-  // TODO: Deprecate and remove GPU architectures older than sm_52.
-  SM_20,
-  SM_21,
-  SM_30,
-  // This has a name conflict with sys/mac.h on AIX, rename it as a workaround.
-  SM_32_,
-  SM_35,
-  SM_37,
-  SM_50,
-  SM_52,
-  SM_53,
-  SM_60,
-  SM_61,
-  SM_62,
-  SM_70,
-  SM_72,
-  SM_75,
-  SM_80,
-  SM_86,
-  SM_87,
-  SM_88,
-  SM_89,
-  SM_90,
-  SM_90a,
-  SM_100,
-  SM_100a,
-  SM_100f,
-  SM_101,
-  SM_101a,
-  SM_101f,
-  SM_103,
-  SM_103a,
-  SM_103f,
-  SM_110,
-  SM_110a,
-  SM_110f,
-  SM_120,
-  SM_120a,
-  SM_120f,
-  SM_121,
-  SM_121a,
-  SM_121f,
-  GFX600,
-  GFX601,
-  GFX602,
-  GFX700,
-  GFX701,
-  GFX702,
-  GFX703,
-  GFX704,
-  GFX705,
-  GFX801,
-  GFX802,
-  GFX803,
-  GFX805,
-  GFX810,
-  GFX9_GENERIC,
-  GFX900,
-  GFX902,
-  GFX904,
-  GFX906,
-  GFX908,
-  GFX909,
-  GFX90a,
-  GFX90c,
-  GFX9_4_GENERIC,
-  GFX942,
-  GFX950,
-  GFX10_1_GENERIC,
-  GFX1010,
-  GFX1011,
-  GFX1012,
-  GFX1013,
-  GFX10_3_GENERIC,
-  GFX1030,
-  GFX1031,
-  GFX1032,
-  GFX1033,
-  GFX1034,
-  GFX1035,
-  GFX1036,
-  GFX11_GENERIC,
-  GFX1100,
-  GFX1101,
-  GFX1102,
-  GFX1103,
-  GFX1150,
-  GFX1151,
-  GFX1152,
-  GFX1153,
-  GFX1154,
-  GFX11_7_GENERIC,
-  GFX1170,
-  GFX1171,
-  GFX1172,
-  GFX12_GENERIC,
-  GFX1200,
-  GFX1201,
-  GFX12_5_GENERIC,
-  GFX1250,
-  GFX1251,
-  GFX13_GENERIC,
-  GFX1310,
-  AMDGCNSPIRV,
-  Generic, // A processor model named 'generic' if the target backend defines a
-           // public one.
-  // Intel CPUs
-  GRANITERAPIDS,
-  // Intel GPUs
-  BMG_G21,
-  LAST = BMG_G21,
-
-  CudaDefault = OffloadArch::SM_52,
-  HIPDefault = OffloadArch::GFX906,
-};
-
-static inline bool IsNVIDIAOffloadArch(OffloadArch A) {
-  return A >= OffloadArch::SM_20 && A < OffloadArch::GFX600;
-}
-
-static inline bool IsAMDOffloadArch(OffloadArch A) {
-  // Generic processor model is for testing only.
-  return A >= OffloadArch::GFX600 && A < OffloadArch::Generic;
-}
+/// A processor an offloading action can target. This is a tagged handle 
pairing
+/// a TargetArch with the matching TargetParser GPU kind; it does not enumerate
+/// individual GPUs, so new targets are added in the TargetParser data alone.
+class OffloadArch {
+public:
+  enum class TargetArch : uint8_t {
+    Unused,   // Default-constructed; no architecture bound.
+    Unknown,  // A name that matched no known architecture.
+    NVPTX,    // Kind is an llvm::NVPTX::GPUKind.
+    AMDGPU,   // Kind is an llvm::AMDGPU::GPUKind.
+    SPIRV,    // The 'amdgcnspirv' pseudo target.
+    IntelCPU, // Kind is an IntelArch.
+    IntelGPU, // Kind is an IntelArch.
+    Generic,  // The 'generic' processor model.
+  };
+
+  // Intel architectures, which have no TargetParser list yet.
+  enum class IntelArch : uint32_t {
+    GRANITERAPIDS,
+    BMG_G21,
+  };
+
+private:
+  // Interpreted according to V; unused for the tagless TargetArch values.
+  uint32_t Kind = 0;
+  TargetArch V = TargetArch::Unused;
+
+  constexpr OffloadArch(TargetArch V, uint32_t Kind) : Kind(Kind), V(V) {}
+
+public:
+  constexpr OffloadArch() = default;
+
+  static OffloadArch getNVPTX(llvm::NVPTX::GPUKind K) {
+    return {TargetArch::NVPTX, static_cast<uint32_t>(K)};
+  }
+  static OffloadArch getAMDGPU(llvm::AMDGPU::GPUKind K) {
+    return {TargetArch::AMDGPU, static_cast<uint32_t>(K)};
+  }
+  static constexpr OffloadArch getIntel(TargetArch V, IntelArch A) {
+    return {V, static_cast<uint32_t>(A)};
+  }
+  static constexpr OffloadArch getUnused() { return {TargetArch::Unused, 0}; }
+  static constexpr OffloadArch getUnknown() { return {TargetArch::Unknown, 0}; 
}
+  static constexpr OffloadArch getSPIRV() { return {TargetArch::SPIRV, 0}; }
+  static constexpr OffloadArch getGeneric() { return {TargetArch::Generic, 0}; 
}
+
+  /// Default architectures used when the user does not specify one.
+  static OffloadArch CudaDefault();
+  static OffloadArch HIPDefault();
+
+  TargetArch targetArch() const { return V; }
+
+  bool isNVPTX() const { return V == TargetArch::NVPTX; }
+  bool isAMDGPU() const { return V == TargetArch::AMDGPU; }
+  bool isSPIRV() const { return V == TargetArch::SPIRV; }
+  bool isIntelCPU() const { return V == TargetArch::IntelCPU; }
+  bool isIntelGPU() const { return V == TargetArch::IntelGPU; }
+  bool isIntel() const { return isIntelCPU() || isIntelGPU(); }
+  bool isGeneric() const { return V == TargetArch::Generic; }
+  bool isUnused() const { return V == TargetArch::Unused; }
+  bool isUnknown() const { return V == TargetArch::Unknown; }
+
+  // Only valid when isNVPTX() / isAMDGPU() respectively.
+  llvm::NVPTX::GPUKind nvptxKind() const {
+    return static_cast<llvm::NVPTX::GPUKind>(Kind);
+  }
+  llvm::AMDGPU::GPUKind amdgpuKind() const {
+    return static_cast<llvm::AMDGPU::GPUKind>(Kind);
+  }
 
-static inline bool IsIntelCPUOffloadArch(OffloadArch Arch) {
-  return Arch >= OffloadArch::GRANITERAPIDS && Arch < OffloadArch::BMG_G21;
-}
+  bool operator==(const OffloadArch &Other) const {
+    return V == Other.V && Kind == Other.Kind;
+  }
+  bool operator!=(const OffloadArch &Other) const { return !(*this == Other); }
 
-static inline bool IsIntelGPUOffloadArch(OffloadArch Arch) {
-  return Arch >= OffloadArch::BMG_G21 && Arch <= OffloadArch::LAST;
-}
+  bool operator<(const OffloadArch &Other) const {
+    return std::tie(V, Kind) < std::tie(Other.V, Other.Kind);
----------------
arsenm wrote:

Replacing with elementwise compares won't be the same thing, this mishandles 
the equal case 

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

Reply via email to