Skip to content

Commit 24d6d01

Browse files
committed
Make target and language ASs distinct for the checks.
1 parent aa3cc42 commit 24d6d01

File tree

5 files changed

+64
-31
lines changed

5 files changed

+64
-31
lines changed

clang/include/clang/AST/Type.h

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -726,10 +726,9 @@ class Qualifiers {
726726
(A == LangAS::Default &&
727727
(B == LangAS::cuda_constant || B == LangAS::cuda_device ||
728728
B == LangAS::cuda_shared)) ||
729-
// The AMDPGU and NVPTX targets allow all supported address spaces to
730-
// be casted to the default address space.
731-
(TI.getTriple().isNVPTX() && A == LangAS::Default) ||
732-
(TI.getTriple().isAMDGPU() && A == LangAS::Default);
729+
// Conversions from target specific address spaces may be legal
730+
// depending on the target information.
731+
TI.isAddressSpaceSupersetOf(A, B);
733732
}
734733

735734
/// Returns true if the address space in these qualifiers is equal to or

clang/include/clang/Basic/TargetInfo.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,13 @@ class TargetInfo : public TransferrableTargetInfo,
486486
/// \param AddrSpace address space of pointee in source language.
487487
virtual uint64_t getNullPointerValue(LangAS AddrSpace) const { return 0; }
488488

489+
/// Returns true if an address space can be safely converted to another.
490+
/// \param A address space of target in source language.
491+
/// \param B address space of source in source language.
492+
virtual bool isAddressSpaceSupersetOf(LangAS A, LangAS B) const {
493+
return A == B;
494+
}
495+
489496
/// Return the size of '_Bool' and C++ 'bool' for this target, in bits.
490497
unsigned getBoolWidth() const { return BoolWidth; }
491498

clang/lib/Basic/Targets/AMDGPU.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,19 @@ class LLVM_LIBRARY_VISIBILITY AMDGPUTargetInfo final : public TargetInfo {
111111
return getPointerWidthV(AddrSpace);
112112
}
113113

114+
virtual bool isAddressSpaceSupersetOf(LangAS A, LangAS B) const override {
115+
// The flat address space AS(0) is a superset of all the other address
116+
// spaces used by the backend target.
117+
return A == B ||
118+
(A == LangAS::Default ||
119+
(isTargetAddressSpace(A) &&
120+
toTargetAddressSpace(A) == llvm::AMDGPUAS::FLAT_ADDRESS)) &&
121+
isTargetAddressSpace(B) &&
122+
toTargetAddressSpace(B) >= llvm::AMDGPUAS::FLAT_ADDRESS &&
123+
isTargetAddressSpace(B) &&
124+
toTargetAddressSpace(B) <= llvm::AMDGPUAS::PRIVATE_ADDRESS;
125+
}
126+
114127
uint64_t getMaxPointerWidth() const override {
115128
return getTriple().getArch() == llvm::Triple::amdgcn ? 64 : 32;
116129
}

clang/lib/Basic/Targets/NVPTX.h

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,34 +17,34 @@
1717
#include "clang/Basic/TargetInfo.h"
1818
#include "clang/Basic/TargetOptions.h"
1919
#include "llvm/Support/Compiler.h"
20+
#include "llvm/Support/NVPTXAddrSpace.h"
2021
#include "llvm/TargetParser/Triple.h"
2122
#include <optional>
2223

2324
namespace clang {
2425
namespace targets {
2526

2627
static const unsigned NVPTXAddrSpaceMap[] = {
27-
0, // Default
28-
1, // opencl_global
29-
3, // opencl_local
30-
4, // opencl_constant
31-
0, // opencl_private
32-
// FIXME: generic has to be added to the target
33-
0, // opencl_generic
34-
1, // opencl_global_device
35-
1, // opencl_global_host
36-
1, // cuda_device
37-
4, // cuda_constant
38-
3, // cuda_shared
39-
1, // sycl_global
40-
1, // sycl_global_device
41-
1, // sycl_global_host
42-
3, // sycl_local
43-
0, // sycl_private
44-
0, // ptr32_sptr
45-
0, // ptr32_uptr
46-
0, // ptr64
47-
0, // hlsl_groupshared
28+
llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // Default
29+
llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // opencl_global
30+
llvm::NVPTXAS::ADDRESS_SPACE_SHARED, // opencl_local
31+
llvm::NVPTXAS::ADDRESS_SPACE_CONST, // opencl_constant
32+
llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // opencl_private
33+
llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // opencl_generic
34+
llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // opencl_global_device
35+
llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // opencl_global_host
36+
llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // cuda_device
37+
llvm::NVPTXAS::ADDRESS_SPACE_CONST, // cuda_constant
38+
llvm::NVPTXAS::ADDRESS_SPACE_SHARED, // cuda_shared
39+
llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // sycl_global
40+
llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // sycl_global_device
41+
llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // sycl_global_host
42+
llvm::NVPTXAS::ADDRESS_SPACE_SHARED, // sycl_local
43+
llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // sycl_private
44+
llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // ptr32_sptr
45+
llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // ptr32_uptr
46+
llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // ptr64
47+
llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // hlsl_groupshared
4848
// Wasm address space values for this target are dummy values,
4949
// as it is only enabled for Wasm targets.
5050
20, // wasm_funcref
@@ -89,6 +89,21 @@ class LLVM_LIBRARY_VISIBILITY NVPTXTargetInfo : public TargetInfo {
8989

9090
bool hasFeature(StringRef Feature) const override;
9191

92+
virtual bool isAddressSpaceSupersetOf(LangAS A, LangAS B) const override {
93+
// The generic address space AS(0) is a superset of all the other address
94+
// spaces used by the backend target.
95+
return A == B ||
96+
(A == LangAS::Default ||
97+
(isTargetAddressSpace(A) &&
98+
toTargetAddressSpace(A) ==
99+
llvm::NVPTXAS::ADDRESS_SPACE_GENERIC)) &&
100+
isTargetAddressSpace(B) &&
101+
toTargetAddressSpace(B) >=
102+
llvm::NVPTXAS::ADDRESS_SPACE_GENERIC &&
103+
isTargetAddressSpace(B) &&
104+
toTargetAddressSpace(B) <= llvm::NVPTXAS::ADDRESS_SPACE_LOCAL;
105+
}
106+
92107
ArrayRef<const char *> getGCCRegNames() const override;
93108

94109
ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override {

clang/test/CodeGen/target-addrspace.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void f(void *p) {}
4040
// AMDGPU-NEXT: call void @_Z1fPv(ptr noundef [[TMP0]]) #[[ATTR1:[0-9]+]]
4141
// AMDGPU-NEXT: ret void
4242
//
43-
void p1(void [[clang::opencl_generic]] * p) { f(p); }
43+
void p1(void [[clang::address_space(0)]] * p) { f(p); }
4444
// NVPTX-LABEL: define hidden noundef ptr @_Z2p2PU3AS3v(
4545
// NVPTX-SAME: ptr addrspace(3) noundef [[P:%.*]]) #[[ATTR0]] {
4646
// NVPTX-NEXT: [[ENTRY:.*:]]
@@ -62,7 +62,7 @@ void p1(void [[clang::opencl_generic]] * p) { f(p); }
6262
// AMDGPU-NEXT: [[TMP1:%.*]] = addrspacecast ptr addrspace(3) [[TMP0]] to ptr
6363
// AMDGPU-NEXT: ret ptr [[TMP1]]
6464
//
65-
void *p2(void [[clang::opencl_local]] * p) { return p; }
65+
void *p2(void [[clang::address_space(3)]] * p) { return p; }
6666
// NVPTX-LABEL: define hidden noundef ptr @_Z2p3PU3AS3v(
6767
// NVPTX-SAME: ptr addrspace(3) noundef [[P:%.*]]) #[[ATTR0]] {
6868
// NVPTX-NEXT: [[ENTRY:.*:]]
@@ -93,8 +93,8 @@ struct S {
9393
};
9494

9595
S s1;
96-
S [[clang::opencl_global]] s2;
97-
S [[clang::opencl_local]] s3;
96+
S [[clang::address_space(1)]] s2;
97+
S [[clang::address_space(3)]] s3;
9898

9999
template <typename Ty> void foo(Ty *) {}
100100

@@ -137,7 +137,7 @@ void t1(void *p) { foo(p); }
137137
// AMDGPU-NEXT: call void @_Z3fooIU3AS3vEvPT_(ptr addrspace(3) noundef [[TMP0]]) #[[ATTR1]]
138138
// AMDGPU-NEXT: ret void
139139
//
140-
void t3(void [[clang::opencl_local]] *p) { foo(p); }
140+
void t3(void [[clang::address_space(3)]] *p) { foo(p); }
141141
// NVPTX-LABEL: define hidden void @_Z2t4PU5AS999v(
142142
// NVPTX-SAME: ptr addrspace(999) noundef [[P:%.*]]) #[[ATTR0]] {
143143
// NVPTX-NEXT: [[ENTRY:.*:]]
@@ -158,4 +158,3 @@ void t3(void [[clang::opencl_local]] *p) { foo(p); }
158158
// AMDGPU-NEXT: ret void
159159
//
160160
void t4(void [[clang::address_space(999)]] *p) { foo(p); }
161-

0 commit comments

Comments
 (0)