clang 24.0.0git
OffloadArch.h
Go to the documentation of this file.
1//===--- OffloadArch.h - Definition of offloading architectures --- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_BASIC_OFFLOADARCH_H
10#define LLVM_CLANG_BASIC_OFFLOADARCH_H
11
12#include "llvm/ADT/StringRef.h"
13#include "llvm/TargetParser/Triple.h"
14#include <cstdint>
15#include <tuple>
16
17namespace llvm {
18template <typename T> class SmallVectorImpl;
19namespace NVPTX {
20enum GPUKind : uint8_t;
21}
22namespace AMDGPU {
23enum GPUKind : uint8_t;
24}
25namespace IntelGPU {
26enum GPUKind : uint8_t;
27class IGCATarget;
28}
29} // namespace llvm
30
31namespace clang {
32
33/// A processor an offloading action can target. This is a tagged handle pairing
34/// a TargetArch with the matching TargetParser GPU kind; it does not enumerate
35/// individual GPUs, so new targets are added in the TargetParser data alone.
36class OffloadArch {
37public:
38 enum class TargetArch : uint8_t {
39 Unused, // Default-constructed; no architecture bound.
40 Unknown, // A name that matched no known architecture.
41 NVPTX, // Kind is an llvm::NVPTX::GPUKind.
42 AMDGPU, // Kind is an llvm::AMDGPU::GPUKind.
43 AMDGCNSPIRV, // The 'amdgcnspirv' pseudo target.
44 IntelCPU, // The 'graniterapids' processor; Kind is unused.
45 IntelGPU, // Kind is an llvm::IntelGPU::GPUKind.
46 IntelIGCA, // Kind is an llvm::IntelGPU::IGCATarget.
47 Generic, // The 'generic' processor model.
48 };
49
50private:
51 // Interpreted according to V; unused for the tagless TargetArch values.
52 uint32_t Kind = 0;
53 TargetArch V = TargetArch::Unused;
54
55 constexpr OffloadArch(TargetArch V, uint32_t Kind) : Kind(Kind), V(V) {}
56
57public:
58 constexpr OffloadArch() = default;
59
60 static OffloadArch getNVPTX(llvm::NVPTX::GPUKind K) {
61 return {TargetArch::NVPTX, static_cast<uint32_t>(K)};
62 }
63 static OffloadArch getAMDGPU(llvm::AMDGPU::GPUKind K) {
64 return {TargetArch::AMDGPU, static_cast<uint32_t>(K)};
65 }
66 /// An Intel GPU, named by its entry in the TargetParser device list.
67 static OffloadArch getIntelGPU(llvm::IntelGPU::GPUKind K) {
68 return {TargetArch::IntelGPU, static_cast<uint32_t>(K)};
69 }
70 /// An Intel IGCA target, e.g. igca_20ca; \p T must be valid.
71 static OffloadArch getIntelIGCA(llvm::IntelGPU::IGCATarget T);
72 /// Intel CPU offload, which has a single target, so no kind is needed.
73 static constexpr OffloadArch getIntelCPU() {
74 return {TargetArch::IntelCPU, 0};
75 }
76 static constexpr OffloadArch getUnused() { return {TargetArch::Unused, 0}; }
77 static constexpr OffloadArch getUnknown() { return {TargetArch::Unknown, 0}; }
78 static constexpr OffloadArch getAMDGCNSPIRV() {
79 return {TargetArch::AMDGCNSPIRV, 0};
80 }
81 static constexpr OffloadArch getGeneric() { return {TargetArch::Generic, 0}; }
82
83 /// Default architectures used when the user does not specify one.
84 static OffloadArch CudaDefault();
85 static OffloadArch HIPDefault();
86
87 TargetArch targetArch() const { return V; }
88
89 bool isNVPTX() const { return V == TargetArch::NVPTX; }
90 bool isAMDGPU() const { return V == TargetArch::AMDGPU; }
91 bool isAMDGCNSPIRV() const { return V == TargetArch::AMDGCNSPIRV; }
92 bool isIntelCPU() const { return V == TargetArch::IntelCPU; }
93 bool isIntelGPU() const { return V == TargetArch::IntelGPU; }
94 bool isIntelIGCA() const { return V == TargetArch::IntelIGCA; }
95 bool isIntel() const { return isIntelCPU() || isIntelGPU() || isIntelIGCA(); }
96 bool isGeneric() const { return V == TargetArch::Generic; }
97 bool isUnused() const { return V == TargetArch::Unused; }
98 bool isUnknown() const { return V == TargetArch::Unknown; }
99
100 // Only valid when isNVPTX() / isAMDGPU() respectively.
101 llvm::NVPTX::GPUKind nvptxKind() const {
102 return static_cast<llvm::NVPTX::GPUKind>(Kind);
103 }
104 llvm::AMDGPU::GPUKind amdgpuKind() const {
105 return static_cast<llvm::AMDGPU::GPUKind>(Kind);
106 }
107 /// Which Intel GPU this is; only meaningful when isIntelGPU().
108 llvm::IntelGPU::GPUKind intelGPUKind() const {
109 return static_cast<llvm::IntelGPU::GPUKind>(Kind);
110 }
111 /// Which IGCA target this is; only valid when isIntelIGCA().
112 llvm::IntelGPU::IGCATarget igcaTarget() const;
113
114 bool operator==(const OffloadArch &Other) const {
115 return V == Other.V && Kind == Other.Kind;
116 }
117 bool operator!=(const OffloadArch &Other) const { return !(*this == Other); }
118
119 bool operator<(const OffloadArch &Other) const {
120 return std::tie(V, Kind) < std::tie(Other.V, Other.Kind);
121 }
122};
123
124const char *OffloadArchToString(OffloadArch A);
125const char *OffloadArchToVirtualArchString(OffloadArch A);
126
127// Convert a string to an OffloadArch. Returns an Unknown OffloadArch if the
128// string is not recognized.
129OffloadArch StringToOffloadArch(llvm::StringRef S);
130
131OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch);
132llvm::Triple::SubArchType getOffloadArchSubArch(OffloadArch ID);
133
134llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple,
135 OffloadArch ID);
136
137/// Represents a bound architecture for offload / multiple architecture
138/// compilation.
139struct BoundArch {
140 llvm::StringRef ArchName;
141
142 /// The parsed offload architecture.
143 /// Will be an Unknown OffloadArch if ArchName is not recognized.
145
146 BoundArch() = default;
147 explicit BoundArch(llvm::StringRef Name)
148 : ArchName(Name), Arch(Name.empty() ? OffloadArch::getUnknown()
149 : StringToOffloadArch(Name)) {}
150
151 BoundArch(llvm::StringRef Name, OffloadArch A) : ArchName(Name), Arch(A) {}
152
153 bool empty() const { return ArchName.empty(); }
154 explicit operator bool() const { return !Arch.isUnused(); }
155
156 bool operator==(const BoundArch &Other) const {
157 return Arch == Other.Arch && ArchName == Other.ArchName;
158 }
159
160 bool operator<(const BoundArch &Other) const {
161 return std::tie(Arch, ArchName) < std::tie(Other.Arch, Other.ArchName);
162 }
163};
164
165} // namespace clang
166
167#endif // LLVM_CLANG_BASIC_OFFLOADARCH_H
#define V(N, I)
A processor an offloading action can target.
Definition OffloadArch.h:36
static constexpr OffloadArch getUnused()
Definition OffloadArch.h:76
static constexpr OffloadArch getAMDGCNSPIRV()
Definition OffloadArch.h:78
constexpr OffloadArch()=default
static constexpr OffloadArch getGeneric()
Definition OffloadArch.h:81
static OffloadArch CudaDefault()
Default architectures used when the user does not specify one.
bool operator<(const OffloadArch &Other) const
static OffloadArch getNVPTX(llvm::NVPTX::GPUKind K)
Definition OffloadArch.h:60
llvm::IntelGPU::IGCATarget igcaTarget() const
Which IGCA target this is; only valid when isIntelIGCA().
static OffloadArch getIntelIGCA(llvm::IntelGPU::IGCATarget T)
An Intel IGCA target, e.g. igca_20ca; T must be valid.
bool isNVPTX() const
Definition OffloadArch.h:89
llvm::IntelGPU::GPUKind intelGPUKind() const
Which Intel GPU this is; only meaningful when isIntelGPU().
static OffloadArch HIPDefault()
bool operator==(const OffloadArch &Other) const
static constexpr OffloadArch getUnknown()
Definition OffloadArch.h:77
bool isIntelIGCA() const
Definition OffloadArch.h:94
bool isIntel() const
Definition OffloadArch.h:95
bool isAMDGPU() const
Definition OffloadArch.h:90
bool isUnknown() const
Definition OffloadArch.h:98
llvm::NVPTX::GPUKind nvptxKind() const
static OffloadArch getIntelGPU(llvm::IntelGPU::GPUKind K)
An Intel GPU, named by its entry in the TargetParser device list.
Definition OffloadArch.h:67
llvm::AMDGPU::GPUKind amdgpuKind() const
bool isIntelCPU() const
Definition OffloadArch.h:92
bool operator!=(const OffloadArch &Other) const
bool isAMDGCNSPIRV() const
Definition OffloadArch.h:91
bool isUnused() const
Definition OffloadArch.h:97
TargetArch targetArch() const
Definition OffloadArch.h:87
static OffloadArch getAMDGPU(llvm::AMDGPU::GPUKind K)
Definition OffloadArch.h:63
bool isIntelGPU() const
Definition OffloadArch.h:93
bool isGeneric() const
Definition OffloadArch.h:96
static constexpr OffloadArch getIntelCPU()
Intel CPU offload, which has a single target, so no kind is needed.
Definition OffloadArch.h:73
Top level wrappers for InstallAPI frontend operations.
llvm::Triple::SubArchType getOffloadArchSubArch(OffloadArch ID)
OffloadArch getSubArchOffloadArch(llvm::Triple::SubArchType SubArch)
const FunctionProtoType * T
const char * OffloadArchToVirtualArchString(OffloadArch A)
OffloadArch StringToOffloadArch(llvm::StringRef S)
const char * OffloadArchToString(OffloadArch A)
llvm::Triple OffloadArchToTriple(const llvm::Triple &DefaultToolchainTriple, OffloadArch ID)
@ Other
Other implicit parameter.
Definition Decl.h:1787
Diagnostic wrappers for TextAPI types for error reporting.
Definition Dominators.h:30
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t uint32_t uint32_t __builtin_riscv_mhacc_i32 __builtin_riscv_mhaccu_u32 __builtin_riscv_mhaccsu_i32 __builtin_riscv_mulq_i32 __builtin_riscv_mqwacc_i64 uint8_t
llvm::StringRef ArchName
bool empty() const
bool operator<(const BoundArch &Other) const
BoundArch(llvm::StringRef Name, OffloadArch A)
OffloadArch Arch
The parsed offload architecture.
BoundArch(llvm::StringRef Name)
BoundArch()=default
bool operator==(const BoundArch &Other) const