[PATCH] D115161: [IR] Allow the 'align' param attr on vectors of pointers
Fraser Cormack via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 6 08:32:44 PST 2021
frasercrmck created this revision.
frasercrmck added reviewers: simoll, craig.topper, anna, fhahn, jdoerfert, dantrushin.
Herald added subscribers: dexonsmith, rogfer01, hiraditya.
frasercrmck requested review of this revision.
Herald added subscribers: llvm-commits, vkmr.
Herald added a project: LLVM.
This patch extends the available uses of the 'align' parameter attribute
to include vectors of pointers. The attribute specifies pointer
alignment element-wise.
This change was previously requested and discussed in D87304 <https://reviews.llvm.org/D87304>.
The vector predication (VP) intrinsics intend to use this for scatter
and gather operations, as they lack the explicit alignment parameter
that the masked versions use.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D115161
Files:
llvm/docs/LangRef.rst
llvm/lib/IR/Attributes.cpp
llvm/test/Bitcode/attributes.ll
Index: llvm/test/Bitcode/attributes.ll
===================================================================
--- llvm/test/Bitcode/attributes.ll
+++ llvm/test/Bitcode/attributes.ll
@@ -478,6 +478,11 @@
ret void;
}
+define void @f81(<4 x i8*> align 32 %0, <vscale x 1 x double*> align 64 %1) {
+; CHECK: define void @f81(<4 x i8*> align 32 %0, <vscale x 1 x double*> align 64 %1)
+ ret void
+}
+
; CHECK: attributes #0 = { noreturn }
; CHECK: attributes #1 = { nounwind }
; CHECK: attributes #2 = { readnone }
Index: llvm/lib/IR/Attributes.cpp
===================================================================
--- llvm/lib/IR/Attributes.cpp
+++ llvm/lib/IR/Attributes.cpp
@@ -1812,12 +1812,12 @@
AttrBuilder Incompatible;
if (!Ty->isIntegerTy())
- // Attribute that only apply to integers.
+ // Attributes that only apply to integers.
Incompatible.addAttribute(Attribute::SExt)
.addAttribute(Attribute::ZExt);
if (!Ty->isPointerTy())
- // Attribute that only apply to pointers.
+ // Attributes that only apply to pointers.
Incompatible.addAttribute(Attribute::Nest)
.addAttribute(Attribute::NoAlias)
.addAttribute(Attribute::NoCapture)
@@ -1825,7 +1825,6 @@
.addAttribute(Attribute::ReadNone)
.addAttribute(Attribute::ReadOnly)
.addAttribute(Attribute::SwiftError)
- .addAlignmentAttr(1) // the int here is ignored
.addDereferenceableAttr(1) // the int here is ignored
.addDereferenceableOrNullAttr(1) // the int here is ignored
.addPreallocatedAttr(Ty)
@@ -1835,6 +1834,10 @@
.addByRefAttr(Ty)
.addTypeAttr(Attribute::ElementType, Ty);
+ if (!Ty->isPtrOrPtrVectorTy())
+ // Attributes that only apply to pointers or vectors of pointers.
+ Incompatible.addAlignmentAttr(1); // the int here is ignored
+
// Some attributes can apply to all "values" but there are no `void` values.
if (Ty->isVoidTy())
Incompatible.addAttribute(Attribute::NoUndef);
Index: llvm/docs/LangRef.rst
===================================================================
--- llvm/docs/LangRef.rst
+++ llvm/docs/LangRef.rst
@@ -1210,12 +1210,14 @@
.. _attr_align:
``align <n>`` or ``align(<n>)``
- This indicates that the pointer value has the specified alignment.
- If the pointer value does not have the specified alignment,
- :ref:`poison value <poisonvalues>` is returned or passed instead. The
- ``align`` attribute should be combined with the ``noundef`` attribute to
- ensure a pointer is aligned, or otherwise the behavior is undefined. Note
- that ``align 1`` has no effect on non-byval, non-preallocated arguments.
+ This indicates that the pointer value or vector of pointers has the
+ specified alignment. If applied to a vector of pointers, *all* pointers
+ (elements) have the specified alignment. If the pointer value does not have
+ the specified alignment, :ref:`poison value <poisonvalues>` is returned or
+ passed instead. The ``align`` attribute should be combined with the
+ ``noundef`` attribute to ensure a pointer is aligned, or otherwise the
+ behavior is undefined. Note that ``align 1`` has no effect on non-byval,
+ non-preallocated arguments.
Note that this attribute has additional semantics when combined with the
``byval`` or ``preallocated`` attribute, which are documented there.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D115161.392081.patch
Type: text/x-patch
Size: 3437 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20211206/1fe3e6b9/attachment.bin>
More information about the llvm-commits
mailing list