From 84bc62f7a350ab9a513f5ee28e22ac4e34b1503d Mon Sep 17 00:00:00 2001 From: Artur Pilipenko Date: Fri, 18 Sep 2015 12:33:31 +0000 Subject: [PATCH] Support align attribute for return values Reviewed By: reames Differential Revision: http://reviews.llvm.org/D12844 llvm-svn: 247984 --- llvm/lib/Analysis/ValueTracking.cpp | 2 ++ llvm/lib/AsmParser/LLParser.cpp | 8 +++++++- .../Analysis/ValueTracking/memory-dereferenceable.ll | 11 +++++++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index ff20a0f2b42a6..98fbfdc861c6d 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2952,6 +2952,8 @@ static bool isAligned(const Value *Base, APInt Offset, unsigned Align, BaseAlign = GV->getAlignment(); else if (const Argument *A = dyn_cast(Base)) BaseAlign = A->getParamAlignment(); + else if (auto CS = ImmutableCallSite(Base)) + BaseAlign = CS.getAttributes().getParamAlignment(AttributeSet::ReturnIndex); if (!BaseAlign) { Type *Ty = Base->getType()->getPointerElementType(); diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index b2f7af6174326..d7a05fe99c8cb 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -1380,6 +1380,13 @@ 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; @@ -1387,7 +1394,6 @@ bool LLParser::ParseOptionalReturnAttrs(AttrBuilder &B) { 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: diff --git a/llvm/test/Analysis/ValueTracking/memory-dereferenceable.ll b/llvm/test/Analysis/ValueTracking/memory-dereferenceable.ll index 1d6f32eea72de..550b01c4c9aa1 100644 --- a/llvm/test/Analysis/ValueTracking/memory-dereferenceable.ll +++ b/llvm/test/Analysis/ValueTracking/memory-dereferenceable.ll @@ -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* @@ -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 }