forked from OSchip/llvm-project
Introduce !align metadata for load instruction
Reviewed By: hfinkel Differential Revision: http://reviews.llvm.org/D12853 llvm-svn: 248721
This commit is contained in:
parent
8aba4b0589
commit
b4d009042b
|
@ -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 analogous to the ''dereferenceable_or_null''
|
|||
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:
|
||||
""""""""""
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -2979,6 +2979,11 @@ static bool isAligned(const Value *Base, APInt Offset, unsigned Align,
|
|||
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();
|
||||
|
|
|
@ -123,6 +123,10 @@ LLVMContext::LLVMContext() : pImpl(new LLVMContextImpl(*this)) {
|
|||
"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; }
|
||||
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue