Skip to content

Commit ba7dcef

Browse files
author
Jakub Chlanda
committed
[AMDGPU] Enable overriding of OpenCL's default address space
`opencl-def-is-generic-addrspace` sets the default address space from private to generic. This feature allows for building bitcode libraries written in OpenCL that can then be linked against modules compiled from sources written in languages that expect generic as the default address space.
1 parent 3de2147 commit ba7dcef

File tree

7 files changed

+43
-2
lines changed

7 files changed

+43
-2
lines changed

clang/include/clang/Basic/TargetInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,9 @@ class TargetInfo : public TransferrableTargetInfo,
271271
LLVM_PREFERRED_TYPE(bool)
272272
unsigned AllowAMDGPUUnsafeFPAtomics : 1;
273273

274+
LLVM_PREFERRED_TYPE(bool)
275+
unsigned OpenCLDefIsGenericAddrSpace : 1;
276+
274277
LLVM_PREFERRED_TYPE(bool)
275278
unsigned HasUnalignedAccess : 1;
276279

clang/include/clang/Basic/TargetOptions.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,10 @@ class TargetOptions {
7878
/// \brief If enabled, allow AMDGPU unsafe floating point atomics.
7979
bool AllowAMDGPUUnsafeFPAtomics = false;
8080

81+
/// \brief If enabled, allow overriding of the default address space (from
82+
/// private to generic).
83+
bool OpenCLDefIsGenericAddrSpace = false;
84+
8185
/// \brief Code object version for AMDGPU.
8286
llvm::CodeObjectVersionKind CodeObjectVersion =
8387
llvm::CodeObjectVersionKind::COV_None;

clang/include/clang/Driver/Options.td

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5164,6 +5164,13 @@ defm unsafe_fp_atomics : BoolMOption<"unsafe-fp-atomics",
51645164
"for certain memory destinations. (AMDGPU only)">,
51655165
NegFlag<SetFalse>>;
51665166

5167+
defm opencl_def_is_generic_addrspace: BoolMOption<"opencl-def-is-generic-addrspace",
5168+
TargetOpts<"OpenCLDefIsGenericAddrSpace">, DefaultFalse,
5169+
PosFlag<SetTrue, [], [ClangOption, CC1Option],
5170+
"Enable overriding of OpenCL's default address space: from private "
5171+
"to generic (AMDGPU only).">,
5172+
NegFlag<SetFalse>>;
5173+
51675174
def faltivec : Flag<["-"], "faltivec">, Group<f_Group>;
51685175
def fno_altivec : Flag<["-"], "fno-altivec">, Group<f_Group>;
51695176
let Flags = [TargetSpecific] in {

clang/lib/Basic/TargetInfo.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ TargetInfo::TargetInfo(const llvm::Triple &T) : Triple(T) {
157157
HasAArch64SVETypes = false;
158158
HasRISCVVTypes = false;
159159
AllowAMDGPUUnsafeFPAtomics = false;
160+
OpenCLDefIsGenericAddrSpace = false;
160161
HasUnalignedAccess = false;
161162
ARMCDECoprocMask = 0;
162163

clang/lib/Basic/Targets/AMDGPU.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ AMDGPUTargetInfo::AMDGPUTargetInfo(const llvm::Triple &Triple,
240240
HasFloat16 = true;
241241
WavefrontSize = (GPUFeatures & llvm::AMDGPU::FEATURE_WAVE32) ? 32 : 64;
242242
AllowAMDGPUUnsafeFPAtomics = Opts.AllowAMDGPUUnsafeFPAtomics;
243+
OpenCLDefIsGenericAddrSpace = Opts.OpenCLDefIsGenericAddrSpace;
243244

244245
// Set pointer width and alignment for the generic address space.
245246
PointerWidth = PointerAlign = getPointerWidthV(LangAS::Default);
@@ -262,8 +263,13 @@ void AMDGPUTargetInfo::adjust(DiagnosticsEngine &Diags, LangOptions &Opts) {
262263
// ToDo: There are still a few places using default address space as private
263264
// address space in OpenCL, which needs to be cleaned up, then the references
264265
// to OpenCL can be removed from the following line.
265-
setAddressSpaceMap((Opts.OpenCL && !Opts.OpenCLGenericAddressSpace) ||
266-
!isAMDGCN(getTriple()));
266+
bool DefaultIsPrivate = (Opts.OpenCL && !Opts.OpenCLGenericAddressSpace) ||
267+
!isAMDGCN(getTriple());
268+
// Allow for overriding of the default address space in OpenCL (from private
269+
// to generic).
270+
if (Opts.OpenCL && OpenCLDefIsGenericAddrSpace)
271+
DefaultIsPrivate = false;
272+
setAddressSpaceMap(DefaultIsPrivate);
267273
}
268274

269275
ArrayRef<Builtin::Info> AMDGPUTargetInfo::getTargetBuiltins() const {

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7888,6 +7888,8 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
78887888

78897889
Args.addOptInFlag(CmdArgs, options::OPT_munsafe_fp_atomics,
78907890
options::OPT_mno_unsafe_fp_atomics);
7891+
Args.addOptInFlag(CmdArgs, options::OPT_mopencl_def_is_generic_addrspace,
7892+
options::OPT_mno_opencl_def_is_generic_addrspace);
78917893
Args.addOptOutFlag(CmdArgs, options::OPT_mamdgpu_ieee,
78927894
options::OPT_mno_amdgpu_ieee);
78937895
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 5
2+
// RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -emit-llvm -target-cpu gfx900 -mopencl-def-is-generic-addrspace -cl-std=CL3.0 -cl-ext=+__opencl_c_generic_address_space -o - %s | FileCheck -check-prefix=CHECK-OPENCL-DEF-IS-GENERIC %s
3+
// RUN: %clang_cc1 -triple amdgcn-unknown-amdhsa -emit-llvm -target-cpu gfx900 -cl-std=CL3.0 -cl-ext=+__opencl_c_generic_address_space -o - %s | FileCheck -check-prefix=CHECK-NO-OPENCL-DEF-IS-GENERIC %s
4+
5+
// CHECK-OPENCL-DEF-IS-GENERIC-LABEL: define dso_local void @_Z14funcGenericPtrfPf(
6+
// CHECK-OPENCL-DEF-IS-GENERIC-SAME: float noundef [[ARGS_0:%.*]], ptr nocapture noundef readnone [[ARGS_1:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
7+
// CHECK-OPENCL-DEF-IS-GENERIC-NEXT: [[ENTRY:.*:]]
8+
// CHECK-OPENCL-DEF-IS-GENERIC-NEXT: ret void
9+
//
10+
// CHECK-NO-OPENCL-DEF-IS-GENERIC-LABEL: define dso_local void @_Z14funcGenericPtrfPU3AS0f(
11+
// CHECK-NO-OPENCL-DEF-IS-GENERIC-SAME: float noundef [[ARGS_0:%.*]], ptr nocapture noundef readnone [[ARGS_1:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] {
12+
// CHECK-NO-OPENCL-DEF-IS-GENERIC-NEXT: [[ENTRY:.*:]]
13+
// CHECK-NO-OPENCL-DEF-IS-GENERIC-NEXT: ret void
14+
//
15+
__attribute__((overloadable)) void funcGenericPtr(float args_0,
16+
float __generic *args_1) {
17+
return;
18+
}

0 commit comments

Comments
 (0)