diff options
author | Nikita Popov <npopov@redhat.com> | 2022-02-03 14:46:57 +0100 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2022-02-08 16:12:51 +0100 |
commit | 18834dca2d787fb46532c0b688e396613e132020 (patch) | |
tree | 845c69658f644a45e5aa3db8836b62903391cfc6 /clang/lib/CodeGen/CGCall.cpp | |
parent | 997027347db7c704d14d5901c828a0f249d30c3f (diff) | |
download | llvm-18834dca2d787fb46532c0b688e396613e132020.zip llvm-18834dca2d787fb46532c0b688e396613e132020.tar.gz llvm-18834dca2d787fb46532c0b688e396613e132020.tar.bz2 |
[OpenCL] Mark kernel arguments as ABI aligned
Following the discussion on D118229, this marks all pointer-typed
kernel arguments as having ABI alignment, per section 6.3.5 of
the OpenCL spec:
> For arguments to a __kernel function declared to be a pointer to
> a data type, the OpenCL compiler can assume that the pointee is
> always appropriately aligned as required by the data type.
Differential Revision: https://reviews.llvm.org/D118894
Diffstat (limited to 'clang/lib/CodeGen/CGCall.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGCall.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index 7ee4cdb..ab1aa6c 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -2485,6 +2485,20 @@ void CodeGenModule::ConstructAttributeList(StringRef Name, } } + // From OpenCL spec v3.0.10 section 6.3.5 Alignment of Types: + // > For arguments to a __kernel function declared to be a pointer to a + // > data type, the OpenCL compiler can assume that the pointee is always + // > appropriately aligned as required by the data type. + if (TargetDecl && TargetDecl->hasAttr<OpenCLKernelAttr>() && + ParamType->isPointerType()) { + QualType PTy = ParamType->getPointeeType(); + if (!PTy->isIncompleteType() && PTy->isConstantSizeType()) { + llvm::Align Alignment = + getNaturalPointeeTypeAlignment(ParamType).getAsAlign(); + Attrs.addAlignmentAttr(Alignment); + } + } + switch (FI.getExtParameterInfo(ArgNo).getABI()) { case ParameterABI::Ordinary: break; |