[llvm] r248721 - Introduce !align metadata for load instruction
Artur Pilipenko via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 28 10:41:08 PDT 2015
Author: apilipenko
Date: Mon Sep 28 12:41:08 2015
New Revision: 248721
URL: http://llvm.org/viewvc/llvm-project?rev=248721&view=rev
Log:
Introduce !align metadata for load instruction
Reviewed By: hfinkel
Differential Revision: http://reviews.llvm.org/D12853
Modified:
llvm/trunk/docs/LangRef.rst
llvm/trunk/include/llvm/IR/LLVMContext.h
llvm/trunk/lib/Analysis/ValueTracking.cpp
llvm/trunk/lib/IR/LLVMContext.cpp
llvm/trunk/test/Analysis/ValueTracking/memory-dereferenceable.ll
Modified: llvm/trunk/docs/LangRef.rst
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/docs/LangRef.rst?rev=248721&r1=248720&r2=248721&view=diff
==============================================================================
--- llvm/trunk/docs/LangRef.rst (original)
+++ llvm/trunk/docs/LangRef.rst Mon Sep 28 12:41:08 2015
@@ -6860,10 +6860,11 @@ Syntax:
::
- <result> = load [volatile] <ty>, <ty>* <pointer>[, align <alignment>][, !nontemporal !<index>][, !invariant.load !<index>][, !invariant.group !<index>][, !nonnull !<index>][, !dereferenceable !<deref_bytes_node>][, !dereferenceable_or_null !<deref_bytes_node>]
+ <result> = load [volatile] <ty>, <ty>* <pointer>[, align <alignment>][, !nontemporal !<index>][, !invariant.load !<index>][, !invariant.group !<index>][, !nonnull !<index>][, !dereferenceable !<deref_bytes_node>][, !dereferenceable_or_null !<deref_bytes_node>][, !align !<align_node>]
<result> = load atomic [volatile] <ty>* <pointer> [singlethread] <ordering>, align <alignment> [, !invariant.group !<index>]
!<index> = !{ i32 1 }
!<deref_bytes_node> = !{i64 <dereferenceable_bytes>}
+ !<align_node> = !{ i64 <value_alignment> }
Overview:
"""""""""
@@ -6948,6 +6949,14 @@ value in the metadata node. This is anal
attribute on parameters and return values. This metadata can only be applied
to loads of a pointer type.
+The optional ``!align`` metadata must reference a single metadata name
+``<align_node>`` corresponding to a metadata node with one ``i64`` entry.
+The existence of the ``!align`` metadata on the instruction tells the
+optimizer that the value loaded is known to be aligned to a boundary specified
+by the integer value in the metadata node. The alignment must be a power of 2.
+This is analogous to the ''align'' attribute on parameters and return values.
+This metadata can only be applied to loads of a pointer type.
+
Semantics:
""""""""""
Modified: llvm/trunk/include/llvm/IR/LLVMContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/LLVMContext.h?rev=248721&r1=248720&r2=248721&view=diff
==============================================================================
--- llvm/trunk/include/llvm/IR/LLVMContext.h (original)
+++ llvm/trunk/include/llvm/IR/LLVMContext.h Mon Sep 28 12:41:08 2015
@@ -63,7 +63,8 @@ public:
MD_dereferenceable_or_null = 13, // "dereferenceable_or_null"
MD_make_implicit = 14, // "make.implicit"
MD_unpredictable = 15, // "unpredictable"
- MD_invariant_group = 16 // "invariant.group"
+ MD_invariant_group = 16, // "invariant.group"
+ MD_align = 17 // "align"
};
/// getMDKindID - Return a unique non-zero ID for the specified metadata kind.
Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=248721&r1=248720&r2=248721&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Mon Sep 28 12:41:08 2015
@@ -2979,6 +2979,11 @@ static bool isAligned(const Value *Base,
BaseAlign = A->getParamAlignment();
else if (auto CS = ImmutableCallSite(Base))
BaseAlign = CS.getAttributes().getParamAlignment(AttributeSet::ReturnIndex);
+ else if (const LoadInst *LI = dyn_cast<LoadInst>(Base))
+ if (MDNode *MD = LI->getMetadata(LLVMContext::MD_align)) {
+ ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(0));
+ BaseAlign = CI->getLimitedValue();
+ }
if (!BaseAlign) {
Type *Ty = Base->getType()->getPointerElementType();
Modified: llvm/trunk/lib/IR/LLVMContext.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/LLVMContext.cpp?rev=248721&r1=248720&r2=248721&view=diff
==============================================================================
--- llvm/trunk/lib/IR/LLVMContext.cpp (original)
+++ llvm/trunk/lib/IR/LLVMContext.cpp Mon Sep 28 12:41:08 2015
@@ -123,6 +123,10 @@ LLVMContext::LLVMContext() : pImpl(new L
"invariant.group kind id drifted");
(void)InvariantGroupId;
+ // Create the 'align' metadata kind.
+ unsigned AlignID = getMDKindID("align");
+ assert(AlignID == MD_align && "align kind id drifted");
+ (void)AlignID;
}
LLVMContext::~LLVMContext() { delete pImpl; }
Modified: llvm/trunk/test/Analysis/ValueTracking/memory-dereferenceable.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ValueTracking/memory-dereferenceable.ll?rev=248721&r1=248720&r2=248721&view=diff
==============================================================================
--- llvm/trunk/test/Analysis/ValueTracking/memory-dereferenceable.ll (original)
+++ llvm/trunk/test/Analysis/ValueTracking/memory-dereferenceable.ll Mon Sep 28 12:41:08 2015
@@ -122,6 +122,14 @@ entry:
%load24 = load i32, i32* %deref_return, align 16
%load25 = load i32, i32* %deref_and_aligned_return, align 16
+ ; Load from a dereferenceable and aligned load
+; CHECK: %d4_unaligned_load{{.*}}(unaligned)
+; CHECK: %d4_aligned_load{{.*}}(aligned)
+ %d4_unaligned_load = load i32*, i32** @globali32ptr, !dereferenceable !0
+ %d4_aligned_load = load i32*, i32** @globali32ptr, !dereferenceable !0, !align !{i64 16}
+ %load26 = load i32, i32* %d4_unaligned_load, align 16
+ %load27 = load i32, i32* %d4_aligned_load, align 16
+
ret void
}
More information about the llvm-commits
mailing list