mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 00:16:25 +00:00
Support align attribute for return values
Reviewed By: reames Differential Revision: http://reviews.llvm.org/D12844 llvm-svn: 247984
This commit is contained in:
parent
def3e26caa
commit
a27007918a
@ -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();
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user