[PATCH] Use align parameter attribute for all pointer arguments

hfinkel at anl.gov hfinkel at anl.gov
Tue Jul 22 09:01:25 PDT 2014


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
+}
+
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D4620.11760.patch
Type: text/x-patch
Size: 2339 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140722/3bf60540/attachment.bin>


More information about the llvm-commits mailing list