Skip to content

Commit

Permalink
Support align attribute for return values
Browse files Browse the repository at this point in the history
Reviewed By: reames

Differential Revision: http://reviews.llvm.org/D12844

llvm-svn: 247984
  • Loading branch information
arpilipe committed Sep 18, 2015
1 parent eda0a48 commit 84bc62f
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 1 deletion.
2 changes: 2 additions & 0 deletions llvm/lib/Analysis/ValueTracking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2952,6 +2952,8 @@ static bool isAligned(const Value *Base, APInt Offset, unsigned Align,
BaseAlign = GV->getAlignment();
else if (const Argument *A = dyn_cast<Argument>(Base))
BaseAlign = A->getParamAlignment();
else if (auto CS = ImmutableCallSite(Base))
BaseAlign = CS.getAttributes().getParamAlignment(AttributeSet::ReturnIndex);

if (!BaseAlign) {
Type *Ty = Base->getType()->getPointerElementType();
Expand Down
8 changes: 7 additions & 1 deletion llvm/lib/AsmParser/LLParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1380,14 +1380,20 @@ bool LLParser::ParseOptionalReturnAttrs(AttrBuilder &B) {
B.addDereferenceableOrNullAttr(Bytes);
continue;
}
case lltok::kw_align: {
unsigned Alignment;
if (ParseOptionalAlignment(Alignment))
return true;
B.addAlignmentAttr(Alignment);
continue;
}
case lltok::kw_inreg: B.addAttribute(Attribute::InReg); break;
case lltok::kw_noalias: B.addAttribute(Attribute::NoAlias); break;
case lltok::kw_nonnull: B.addAttribute(Attribute::NonNull); break;
case lltok::kw_signext: B.addAttribute(Attribute::SExt); break;
case lltok::kw_zeroext: B.addAttribute(Attribute::ZExt); break;

// Error handling.
case lltok::kw_align:
case lltok::kw_byval:
case lltok::kw_inalloca:
case lltok::kw_nest:
Expand Down
11 changes: 11 additions & 0 deletions llvm/test/Analysis/ValueTracking/memory-dereferenceable.ll
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ target datalayout = "e"

declare zeroext i1 @return_i1()

declare i32* @foo()
@globalstr = global [6 x i8] c"hello\00"
@globali32ptr = external global i32*

Expand Down Expand Up @@ -111,6 +112,16 @@ entry:
%load21 = load i8, i8 addrspace(1)* %gep.align1.offset16, align 16
%load22 = load i8, i8 addrspace(1)* %gep.align16.offset16, align 16

; CHECK-NOT: %no_deref_return
; CHECK: %deref_return{{.*}}(unaligned)
; CHECK: %deref_and_aligned_return{{.*}}(aligned)
%no_deref_return = call i32* @foo()
%deref_return = call dereferenceable(32) i32* @foo()
%deref_and_aligned_return = call dereferenceable(32) align 16 i32* @foo()
%load23 = load i32, i32* %no_deref_return
%load24 = load i32, i32* %deref_return, align 16
%load25 = load i32, i32* %deref_and_aligned_return, align 16

ret void
}

Expand Down

0 comments on commit 84bc62f

Please sign in to comment.