Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 24 additions & 21 deletions clang/lib/CodeGen/CodeGenModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1807,11 +1807,7 @@ void CodeGenModule::GenOpenCLArgMetadata(llvm::Function *Fn,

// MDNode for listing SYCL kernel pointer arguments originating from
// accessors.
SmallVector<llvm::Metadata *, 8> argSYCLKernelRuntimeAligned;

// MDNode for listing ESIMD kernel pointer arguments originating from
// accessors.
SmallVector<llvm::Metadata *, 8> argESIMDAccPtrs;
SmallVector<llvm::Metadata *, 8> argSYCLAccessorPtrs;

bool isKernelArgAnAccessor = false;

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

// If a kernel pointer argument comes from an accessor, we generate
// a new metadata(kernel_arg_runtime_aligned) to the kernel to indicate
// that this pointer has runtime allocated alignment. The value of any
// "kernel_arg_runtime_aligned" metadata element is 'true' for any kernel
// arguments that corresponds to the base pointer of an accessor and
// 'false' otherwise.
// the following metadata :
// 1. kernel_arg_runtime_aligned - To indicate that this pointer has
// runtime allocated alignment.
// 2. kernel_arg_exclusive_ptr - To indicate that it is illegal to
// dereference the pointer from outside current invocation of the
// kernel.
// In both cases, the value of metadata element is 'true' for any
// kernel arguments that corresponds to the base pointer of an accessor
// and 'false' otherwise.
// Note: Although both metadata apply only to the base pointer of an
// accessor currently, it is possible that one or both may be extended
// to include other pointers. Therefore, both metadata are required.
if (parm->hasAttr<SYCLAccessorPtrAttr>()) {
isKernelArgAnAccessor = true;
argSYCLKernelRuntimeAligned.push_back(
argSYCLAccessorPtrs.push_back(
llvm::ConstantAsMetadata::get(CGF->Builder.getTrue()));
} else {
argSYCLKernelRuntimeAligned.push_back(
argSYCLAccessorPtrs.push_back(
llvm::ConstantAsMetadata::get(CGF->Builder.getFalse()));
}

if (FD->hasAttr<SYCLSimdAttr>())
argESIMDAccPtrs.push_back(llvm::ConstantAsMetadata::get(
CGF->Builder.getInt1(parm->hasAttr<SYCLAccessorPtrAttr>())));
}

bool IsEsimdFunction = FD && FD->hasAttr<SYCLSimdAttr>();
Expand All @@ -1945,10 +1944,12 @@ void CodeGenModule::GenOpenCLArgMetadata(llvm::Function *Fn,
llvm::MDNode::get(VMContext, argSYCLBufferLocationAttr));
// Generate this metadata only if atleast one kernel argument is an
// accessor.
if (isKernelArgAnAccessor)
Fn->setMetadata(
"kernel_arg_runtime_aligned",
llvm::MDNode::get(VMContext, argSYCLKernelRuntimeAligned));
if (isKernelArgAnAccessor) {
Fn->setMetadata("kernel_arg_runtime_aligned",
llvm::MDNode::get(VMContext, argSYCLAccessorPtrs));
Fn->setMetadata("kernel_arg_exclusive_ptr",
llvm::MDNode::get(VMContext, argSYCLAccessorPtrs));
}
} else {
Fn->setMetadata("kernel_arg_addr_space",
llvm::MDNode::get(VMContext, addressQuals));
Expand All @@ -1960,9 +1961,11 @@ void CodeGenModule::GenOpenCLArgMetadata(llvm::Function *Fn,
llvm::MDNode::get(VMContext, argBaseTypeNames));
Fn->setMetadata("kernel_arg_type_qual",
llvm::MDNode::get(VMContext, argTypeQuals));
// FIXME: What is the purpose of this metadata for ESIMD? Can we
// reuse kernel_arg_exclusive_ptr or kernel_arg_runtime_aligned ?
if (IsEsimdFunction)
Fn->setMetadata("kernel_arg_accessor_ptr",
llvm::MDNode::get(VMContext, argESIMDAccPtrs));
llvm::MDNode::get(VMContext, argSYCLAccessorPtrs));
if (getCodeGenOpts().EmitOpenCLArgMetadata)
Fn->setMetadata("kernel_arg_name",
llvm::MDNode::get(VMContext, argNames));
Expand Down
25 changes: 16 additions & 9 deletions clang/test/CodeGenSYCL/kernel-arg-accessor-pointer.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// 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

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

#include "sycl.hpp"

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

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

// Check kernel_B parameters
// CHECK: define {{.*}}spir_kernel void @{{.*}}kernel_B
// CHECK-NOT: kernel_arg_runtime_aligned
// CHECK-NOT: kernel_arg_exclusive_ptr

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

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

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

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

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