diff options
| author | Mikael Holmen <mikael.holmen@ericsson.com> | 2017-12-27 08:48:33 +0000 |
|---|---|---|
| committer | Mikael Holmen <mikael.holmen@ericsson.com> | 2017-12-27 08:48:33 +0000 |
| commit | fb2fd20f508ead839d2fc43994cacd549f53c21c (patch) | |
| tree | 8a026ba5ed87c421dc830201d8e956b1fc566dba /llvm/test | |
| parent | f4811ebc395edb95a8bfedf822f2bb6923f3c658 (diff) | |
| download | bcm5719-llvm-fb2fd20f508ead839d2fc43994cacd549f53c21c.tar.gz bcm5719-llvm-fb2fd20f508ead839d2fc43994cacd549f53c21c.zip | |
[Lint] Don't warn about noalias argument aliasing if other argument is byval
Summary:
When using byval, the data is effectively copied as part of the call
anyway, so we aren't actually passing the pointer and thus there is no
reason to issue a warning.
Reviewers: rnk
Reviewed By: rnk
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D40118
llvm-svn: 321478
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/Analysis/Lint/noalias-byval.ll | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/llvm/test/Analysis/Lint/noalias-byval.ll b/llvm/test/Analysis/Lint/noalias-byval.ll new file mode 100644 index 00000000000..5b36c6d15df --- /dev/null +++ b/llvm/test/Analysis/Lint/noalias-byval.ll @@ -0,0 +1,48 @@ +; RUN: opt < %s -lint -disable-output 2>&1 | FileCheck %s + +%s = type { i8 } + +; Function Attrs: argmemonly nounwind +declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture writeonly, i8* nocapture readonly, i32, i32, i1) #0 + +; Function Attrs: argmemonly nounwind +declare void @llvm.memset.p0i8.i8.i32(i8* nocapture writeonly, i8, i32, i32, i1) #0 + +declare void @f1(%s* noalias nocapture sret, %s* nocapture readnone) + +define void @f2() { +entry: + %c = alloca %s + %tmp = alloca %s + %0 = bitcast %s* %c to i8* + %1 = bitcast %s* %tmp to i8* + call void @llvm.memset.p0i8.i8.i32(i8* %0, i8 0, i32 1, i32 1, i1 false) + call void @f1(%s* sret %c, %s* %c) + ret void +} + +; Lint should complain about us passing %c to both arguments since one of them +; is noalias. +; CHECK: Unusual: noalias argument aliases another argument +; CHECK-NEXT: call void @f1(%s* sret %c, %s* %c) + +declare void @f3(%s* noalias nocapture sret, %s* byval nocapture readnone) + +define void @f4() { +entry: + %c = alloca %s + %tmp = alloca %s + %0 = bitcast %s* %c to i8* + %1 = bitcast %s* %tmp to i8* + call void @llvm.memset.p0i8.i8.i32(i8* %0, i8 0, i32 1, i32 1, i1 false) + call void @f3(%s* sret %c, %s* byval %c) + ret void +} + +; Lint should not complain about passing %c to both arguments even if one is +; noalias, since the other one is byval, effectively copying the data to the +; stack instead of passing the pointer itself. +; CHECK-NOT: Unusual: noalias argument aliases another argument +; CHECK-NOT: call void @f3(%s* sret %c, %s* %c) + +attributes #0 = { argmemonly nounwind } |

