Skip to content

Commit e03c4ed

Browse files
[SYCL] Add new metadata kernel_arg_exclusive_ptr (#6190)
kernel_arg_exclusive_ptr metadata guarantees that the kernel pointer argument, or pointers that derive from it, will not be dereferenced outside current invocation of the kernel. At the moment, this guarantee is met by the base pointer of an accessor. Signed-off-by: Elizabeth Andrews elizabeth.andrews@intel.com
1 parent f29b498 commit e03c4ed

File tree

2 files changed

+40
-30
lines changed

2 files changed

+40
-30
lines changed

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1807,11 +1807,7 @@ void CodeGenModule::GenOpenCLArgMetadata(llvm::Function *Fn,
18071807

18081808
// MDNode for listing SYCL kernel pointer arguments originating from
18091809
// accessors.
1810-
SmallVector<llvm::Metadata *, 8> argSYCLKernelRuntimeAligned;
1811-
1812-
// MDNode for listing ESIMD kernel pointer arguments originating from
1813-
// accessors.
1814-
SmallVector<llvm::Metadata *, 8> argESIMDAccPtrs;
1810+
SmallVector<llvm::Metadata *, 8> argSYCLAccessorPtrs;
18151811

18161812
bool isKernelArgAnAccessor = false;
18171813

@@ -1919,23 +1915,26 @@ void CodeGenModule::GenOpenCLArgMetadata(llvm::Function *Fn,
19191915
: llvm::ConstantAsMetadata::get(CGF->Builder.getInt32(-1)));
19201916

19211917
// If a kernel pointer argument comes from an accessor, we generate
1922-
// a new metadata(kernel_arg_runtime_aligned) to the kernel to indicate
1923-
// that this pointer has runtime allocated alignment. The value of any
1924-
// "kernel_arg_runtime_aligned" metadata element is 'true' for any kernel
1925-
// arguments that corresponds to the base pointer of an accessor and
1926-
// 'false' otherwise.
1918+
// the following metadata :
1919+
// 1. kernel_arg_runtime_aligned - To indicate that this pointer has
1920+
// runtime allocated alignment.
1921+
// 2. kernel_arg_exclusive_ptr - To indicate that it is illegal to
1922+
// dereference the pointer from outside current invocation of the
1923+
// kernel.
1924+
// In both cases, the value of metadata element is 'true' for any
1925+
// kernel arguments that corresponds to the base pointer of an accessor
1926+
// and 'false' otherwise.
1927+
// Note: Although both metadata apply only to the base pointer of an
1928+
// accessor currently, it is possible that one or both may be extended
1929+
// to include other pointers. Therefore, both metadata are required.
19271930
if (parm->hasAttr<SYCLAccessorPtrAttr>()) {
19281931
isKernelArgAnAccessor = true;
1929-
argSYCLKernelRuntimeAligned.push_back(
1932+
argSYCLAccessorPtrs.push_back(
19301933
llvm::ConstantAsMetadata::get(CGF->Builder.getTrue()));
19311934
} else {
1932-
argSYCLKernelRuntimeAligned.push_back(
1935+
argSYCLAccessorPtrs.push_back(
19331936
llvm::ConstantAsMetadata::get(CGF->Builder.getFalse()));
19341937
}
1935-
1936-
if (FD->hasAttr<SYCLSimdAttr>())
1937-
argESIMDAccPtrs.push_back(llvm::ConstantAsMetadata::get(
1938-
CGF->Builder.getInt1(parm->hasAttr<SYCLAccessorPtrAttr>())));
19391938
}
19401939

19411940
bool IsEsimdFunction = FD && FD->hasAttr<SYCLSimdAttr>();
@@ -1945,10 +1944,12 @@ void CodeGenModule::GenOpenCLArgMetadata(llvm::Function *Fn,
19451944
llvm::MDNode::get(VMContext, argSYCLBufferLocationAttr));
19461945
// Generate this metadata only if atleast one kernel argument is an
19471946
// accessor.
1948-
if (isKernelArgAnAccessor)
1949-
Fn->setMetadata(
1950-
"kernel_arg_runtime_aligned",
1951-
llvm::MDNode::get(VMContext, argSYCLKernelRuntimeAligned));
1947+
if (isKernelArgAnAccessor) {
1948+
Fn->setMetadata("kernel_arg_runtime_aligned",
1949+
llvm::MDNode::get(VMContext, argSYCLAccessorPtrs));
1950+
Fn->setMetadata("kernel_arg_exclusive_ptr",
1951+
llvm::MDNode::get(VMContext, argSYCLAccessorPtrs));
1952+
}
19521953
} else {
19531954
Fn->setMetadata("kernel_arg_addr_space",
19541955
llvm::MDNode::get(VMContext, addressQuals));
@@ -1960,9 +1961,11 @@ void CodeGenModule::GenOpenCLArgMetadata(llvm::Function *Fn,
19601961
llvm::MDNode::get(VMContext, argBaseTypeNames));
19611962
Fn->setMetadata("kernel_arg_type_qual",
19621963
llvm::MDNode::get(VMContext, argTypeQuals));
1964+
// FIXME: What is the purpose of this metadata for ESIMD? Can we
1965+
// reuse kernel_arg_exclusive_ptr or kernel_arg_runtime_aligned ?
19631966
if (IsEsimdFunction)
19641967
Fn->setMetadata("kernel_arg_accessor_ptr",
1965-
llvm::MDNode::get(VMContext, argESIMDAccPtrs));
1968+
llvm::MDNode::get(VMContext, argSYCLAccessorPtrs));
19661969
if (getCodeGenOpts().EmitOpenCLArgMetadata)
19671970
Fn->setMetadata("kernel_arg_name",
19681971
llvm::MDNode::get(VMContext, argNames));

clang/test/CodeGenSYCL/kernel-arg-accessor-pointer.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// RUN: %clang_cc1 -fsycl-is-device -internal-isystem %S/Inputs -triple spir64-unknown-unknown -disable-llvm-passes -opaque-pointers -emit-llvm %s -o - | FileCheck %s
22

3-
// This test checks if the metadata "kernel-arg-runtime-aligned"
4-
// is generated if the kernel captures an accessor.
3+
// This test checks if the metadata "kernel-arg-runtime-aligned" and "kernel_arg_exclusive_ptr"
4+
// are generated if the kernel captures an accessor.
55

66
#include "sycl.hpp"
77

@@ -100,37 +100,43 @@ int main() {
100100
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[ACC_RANGE2:%[a-zA-Z0-9_]+6]],
101101
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[MEM_RANGE2:%[a-zA-Z0-9_]+7]],
102102
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[OFFSET2:%[a-zA-Z0-9_]+8]])
103-
// CHECK-SAME: !kernel_arg_runtime_aligned ![[#RTALIGNED1:]]
103+
// CHECK-SAME: !kernel_arg_runtime_aligned ![[#ACCESSORMD1:]]
104+
// CHECK-SAME: !kernel_arg_exclusive_ptr ![[#ACCESSORMD1]]
104105

105106
// Check kernel_readOnlyAcc parameters
106107
// CHECK: define {{.*}}spir_kernel void @{{.*}}kernel_readOnlyAcc
107108
// CHECK-SAME: ptr addrspace(1) noundef readonly align 4 [[MEM_ARG1:%[a-zA-Z0-9_]+]],
108109
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[ACC_RANGE1:%[a-zA-Z0-9_]+1]],
109110
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[MEM_RANGE1:%[a-zA-Z0-9_]+2]],
110111
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[OFFSET1:%[a-zA-Z0-9_]+3]]
111-
// CHECK-SAME: !kernel_arg_runtime_aligned ![[#RTALIGNED2:]]
112+
// CHECK-SAME: !kernel_arg_runtime_aligned ![[#ACCESSORMD2:]]
113+
// CHECK-SAME: !kernel_arg_exclusive_ptr ![[#ACCESSORMD2]]
112114

113115
// Check kernel_B parameters
114116
// CHECK: define {{.*}}spir_kernel void @{{.*}}kernel_B
115117
// CHECK-NOT: kernel_arg_runtime_aligned
118+
// CHECK-NOT: kernel_arg_exclusive_ptr
116119

117120
// Check kernel_C parameters
118121
// CHECK: define {{.*}}spir_kernel void @{{.*}}kernel_C
119122
// CHECK-SAME: i32 noundef [[MEM_ARG1:%[a-zA-Z0-9_]+]]
120123
// CHECK-NOT: kernel_arg_runtime_aligned
124+
// CHECK-NOT: kernel_arg_exclusive_ptr
121125

122126
// Check usm_ptr parameters
123127
// CHECK: define {{.*}}spir_kernel void @{{.*}}usm_ptr
124128
// CHECK-SAME: ptr addrspace(1) noundef align 4 [[MEM_ARG1:%[a-zA-Z0-9_]+]],
125129
// CHECK-SAME: ptr addrspace(1) noundef align 4 [[MEM_ARG1:%[a-zA-Z0-9_]+]]
126130
// CHECK-NOT: kernel_arg_runtime_aligned
131+
// CHECK-NOT: kernel_arg_exclusive_ptr
127132

128133
// CHECK: define {{.*}}spir_kernel void @{{.*}}localAccessor
129134
// CHECK-SAME: ptr addrspace(1) noundef align 4 [[MEM_ARG1:%[a-zA-Z0-9_]+]],
130135
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[ACC_RANGE1:%[a-zA-Z0-9_]+1]],
131136
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[MEM_RANGE1:%[a-zA-Z0-9_]+2]],
132137
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[OFFSET1:%[a-zA-Z0-9_]+3]]
133-
// CHECK-SAME: !kernel_arg_runtime_aligned ![[#RTALIGNED2]]
138+
// CHECK-SAME: !kernel_arg_runtime_aligned ![[#ACCESSORMD2]]
139+
// CHECK-SAME: !kernel_arg_exclusive_ptr ![[#ACCESSORMD2]]
134140

135141
// Check kernel_acc_raw_ptr parameters
136142
// CHECK: define {{.*}}spir_kernel void @{{.*}}kernel_acc_raw_ptr
@@ -139,7 +145,8 @@ int main() {
139145
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[MEM_RANGE1:%[a-zA-Z0-9_]+2]],
140146
// CHECK-SAME: ptr noundef byval{{.*}}align 4 [[OFFSET1:%[a-zA-Z0-9_]+3]]
141147
// CHECK-SAME: ptr addrspace(1) noundef align 4 [[MEM_ARG1:%[a-zA-Z0-9_]+]]
142-
// CHECK-SAME: !kernel_arg_runtime_aligned ![[#RTALIGNED3:]]
148+
// CHECK-SAME: !kernel_arg_runtime_aligned ![[#ACCESSORMD3:]]
149+
// CHECK-SAME: !kernel_arg_exclusive_ptr ![[#ACCESSORMD3]]
143150

144151
// Check esimd_kernel_with_acc parameters
145152
// CHECK: define {{.*}}spir_kernel void @{{.*}}esimd_kernel_with_acc
@@ -148,6 +155,6 @@ int main() {
148155
// Check kernel-arg-runtime-aligned metadata.
149156
// The value of any metadata element is 1 for any kernel arguments
150157
// that corresponds to the base pointer of an accessor and 0 otherwise.
151-
// CHECK: ![[#RTALIGNED1]] = !{i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false}
152-
// CHECK: ![[#RTALIGNED2]] = !{i1 true, i1 false, i1 false, i1 false}
153-
// CHECK: ![[#RTALIGNED3]] = !{i1 true, i1 false, i1 false, i1 false, i1 false}
158+
// CHECK: ![[#ACCESSORMD1]] = !{i1 true, i1 false, i1 false, i1 false, i1 true, i1 false, i1 false, i1 false}
159+
// CHECK: ![[#ACCESSORMD2]] = !{i1 true, i1 false, i1 false, i1 false}
160+
// CHECK: ![[#ACCESSORMD3]] = !{i1 true, i1 false, i1 false, i1 false, i1 false}

0 commit comments

Comments
 (0)