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 | e7f98a969c1ae60aefd39edaf98094379c51ead7 (patch) | |
tree | de5cb2e4028b321fed684c3c399f024b2a04a5eb /test/Analysis | |
parent | 07e37aeeeea4ad0f7895f20abe15d9c4bc4c0a22 (diff) |
[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
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321478 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Analysis')
-rw-r--r-- | test/Analysis/Lint/noalias-byval.ll | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/test/Analysis/Lint/noalias-byval.ll b/test/Analysis/Lint/noalias-byval.ll new file mode 100644 index 00000000000..5b36c6d15df --- /dev/null +++ b/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 } |