[PATCH] D12844: Support align attribute for return values
Artur Pilipenko via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 14 09:10:54 PDT 2015
apilipenko created this revision.
apilipenko added reviewers: hfinkel, reames, sanjoy.
apilipenko added a subscriber: llvm-commits.
Since D10475 we take alignment into account to decide if it's safe to speculate load. Now pointer has to be both dereferenceable and properly aligned to be speculative loadable. It means that we want to support align attribute everywhere we support dereferenceable attribute.
Align attribute was supported for function arguments only. Support this attribute for return values as well.
http://reviews.llvm.org/D12844
Files:
lib/Analysis/ValueTracking.cpp
lib/AsmParser/LLParser.cpp
test/Analysis/ValueTracking/memory-dereferenceable.ll
Index: test/Analysis/ValueTracking/memory-dereferenceable.ll
===================================================================
--- test/Analysis/ValueTracking/memory-dereferenceable.ll
+++ test/Analysis/ValueTracking/memory-dereferenceable.ll
@@ -7,6 +7,7 @@
declare zeroext i1 @return_i1()
+declare i32* @foo()
@globalstr = global [6 x i8] c"hello\00"
@globali32ptr = external global i32*
@@ -111,6 +112,16 @@
%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
}
Index: lib/AsmParser/LLParser.cpp
===================================================================
--- lib/AsmParser/LLParser.cpp
+++ lib/AsmParser/LLParser.cpp
@@ -1379,14 +1379,20 @@
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:
Index: lib/Analysis/ValueTracking.cpp
===================================================================
--- lib/Analysis/ValueTracking.cpp
+++ lib/Analysis/ValueTracking.cpp
@@ -2952,6 +2952,8 @@
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();
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D12844.34684.patch
Type: text/x-patch
Size: 2574 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150914/985f47ac/attachment.bin>
More information about the llvm-commits
mailing list