[PATCH] Use align parameter attribute for all pointer arguments
Philip Reames
listmail at philipreames.com
Tue Jul 22 09:55:35 PDT 2014
Same. LGTM.
I take it you're going to canonicalize assumptions about alignment as
align attributes where possible?
Philip
On 07/22/2014 09:31 AM, Chandler Carruth wrote:
>
> LGTM, seems like obvious goodness to me.
>
> On Jul 22, 2014 9:04 AM, "hfinkel at anl.gov <mailto:hfinkel at anl.gov>"
> <hfinkel at anl.gov <mailto:hfinkel at anl.gov>> wrote:
>
> Hi chandlerc, reames, aschwaighofer, nadav,
>
> This is almost more of a documentation change than anything else...
>
> We currently support the align attribute on all (pointer)
> parameters, but we only use it for byval parameters. However, it
> is completely consistent at the IR level to treat 'align n' on all
> pointer parameters as an alignment assumption on the pointer. This
> patch does this:
>
> 1. Causes computeKnownBits to use the align attribute on all
> pointer parameters, not just byval parameters.
> 2. Updated the LangRef to document the align parameter attribute
> (as it turns out, it was not documented at all previously,
> although the byval documentation mentioned that it could be used).
>
> There are two benefits to doing this:
> 1. It allows enhancing alignment based on the pointer alignment
> after inlining
> 2. It allows simplification of pointer arithmetic
>
> My primary use case for these things involves pointers that are
> over-aligned to allow for efficient vectorized code generation.
>
> Thanks again!
>
> http://reviews.llvm.org/D4620
>
> Files:
> docs/LangRef.rst
> lib/Analysis/ValueTracking.cpp
> test/Bitcode/attributes.ll
> test/Transforms/InstCombine/align-attr.ll
>
> Index: docs/LangRef.rst
> ===================================================================
> --- docs/LangRef.rst
> +++ docs/LangRef.rst
> @@ -921,6 +921,13 @@
> the first parameter. This is not a valid attribute for return
> values.
>
> +``align <n>``
> + This indicates that the pointer value may be assumed by the
> optimizer to
> + have the specified alignment.
> +
> + Note that this attribute has additional semantics when
> combined with the
> + ``byval`` attribute.
> +
> .. _noalias:
>
> ``noalias``
> Index: lib/Analysis/ValueTracking.cpp
> ===================================================================
> --- lib/Analysis/ValueTracking.cpp
> +++ lib/Analysis/ValueTracking.cpp
> @@ -308,13 +308,9 @@
> }
>
> if (Argument *A = dyn_cast<Argument>(V)) {
> - unsigned Align = 0;
> + unsigned Align = A->getType()->isPointerTy() ?
> A->getParamAlignment() : 0;
>
> - if (A->hasByValOrInAllocaAttr()) {
> - // Get alignment information off byval/inalloca arguments
> if specified in
> - // the IR.
> - Align = A->getParamAlignment();
> - } else if (TD && A->hasStructRetAttr()) {
> + if (!Align && TD && A->hasStructRetAttr()) {
> // An sret parameter has at least the ABI alignment of the
> return type.
> Type *EltTy =
> cast<PointerType>(A->getType())->getElementType();
> if (EltTy->isSized())
> Index: test/Bitcode/attributes.ll
> ===================================================================
> --- test/Bitcode/attributes.ll
> +++ test/Bitcode/attributes.ll
> @@ -239,6 +239,11 @@
> ret i8* %a
> }
>
> +define void @f41(i8* align 32, double* align 64) {
> +; CHECK: define void @f41(i8* align 32, double* align 64) {
> + ret void
> +}
> +
> ; CHECK: attributes #0 = { noreturn }
> ; CHECK: attributes #1 = { nounwind }
> ; CHECK: attributes #2 = { readnone }
> Index: test/Transforms/InstCombine/align-attr.ll
> ===================================================================
> --- /dev/null
> +++ test/Transforms/InstCombine/align-attr.ll
> @@ -0,0 +1,15 @@
> +; RUN: opt < %s -instcombine -S | FileCheck %s
> +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> +; Function Attrs: nounwind uwtable
> +define i32 @foo1(i32* align 32 %a) #0 {
> +entry:
> + %0 = load i32* %a, align 4
> + ret i32 %0
> +
> +; CHECK-LABEL: @foo1
> +; CHECK-DAG: load i32* %a, align 32
> +; CHECK: ret i32
> +}
> +
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140722/4e5e325c/attachment.html>
More information about the llvm-commits
mailing list