diff options
author | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-04-16 20:29:50 +0000 |
---|---|---|
committer | Sanjoy Das <sanjoy@playingwithpointers.com> | 2015-04-16 20:29:50 +0000 |
commit | 31ea6d1590ce79845504b8d928f07cb71bd4be80 (patch) | |
tree | f253459b724d977c2b1ff6a0cdbcc620a8e89f9d /llvm/test | |
parent | 90356501f54dd6eebcb053a3206d5a4afc3bebb9 (diff) | |
download | bcm5719-llvm-31ea6d1590ce79845504b8d928f07cb71bd4be80.tar.gz bcm5719-llvm-31ea6d1590ce79845504b8d928f07cb71bd4be80.zip |
[IR] Introduce a dereferenceable_or_null(N) attribute.
Summary:
If a pointer is marked as dereferenceable_or_null(N), LLVM assumes it
is either `null` or `dereferenceable(N)` or both. This change only
introduces the attribute and adds a token test case for the `llvm-as`
/ `llvm-dis`. It does not hook up other parts of the optimizer to
actually exploit the attribute -- those changes will come later.
For pointers in address space 0, `dereferenceable(N)` is now exactly
equivalent to `dereferenceable_or_null(N)` && `nonnull`. For other
address spaces, `dereferenceable(N)` is potentially weaker than
`dereferenceable_or_null(N)` && `nonnull` (since we could have a null
`dereferenceable(N)` pointer).
The motivating case for this change is Java (and other managed
languages), where pointers are either `null` or dereferenceable up to
some usually known-at-compile-time constant offset.
Reviewers: rafael, hfinkel
Reviewed By: hfinkel
Subscribers: nicholas, llvm-commits
Differential Revision: http://reviews.llvm.org/D8650
llvm-svn: 235132
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/Bitcode/attributes.ll | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/llvm/test/Bitcode/attributes.ll b/llvm/test/Bitcode/attributes.ll index c75ee80dc66..9fbdfeb0ef0 100644 --- a/llvm/test/Bitcode/attributes.ll +++ b/llvm/test/Bitcode/attributes.ll @@ -245,6 +245,12 @@ define void @f41(i8* align 32, double* align 64) { ret void } +; CHECK: define dereferenceable_or_null(8) i8* @f42(i8* dereferenceable_or_null(8) %foo) +define dereferenceable_or_null(8) i8* @f42(i8* dereferenceable_or_null(8) %foo) { + entry: + ret i8* %foo +} + ; CHECK: attributes #0 = { noreturn } ; CHECK: attributes #1 = { nounwind } ; CHECK: attributes #2 = { readnone } |