diff options
| author | Johannes Doerfert <jdoerfert@anl.gov> | 2019-08-23 15:45:46 +0000 |
|---|---|---|
| committer | Johannes Doerfert <jdoerfert@anl.gov> | 2019-08-23 15:45:46 +0000 |
| commit | 2f2d7c3addff2e03e0b051a663743bb751ddb5bd (patch) | |
| tree | ea40c250ca29c5164d7cdb53f52f7077bfb72c41 /llvm/test/Transforms | |
| parent | deb9ea3a8c842f279cf9d7db695760acd55be660 (diff) | |
| download | bcm5719-llvm-2f2d7c3addff2e03e0b051a663743bb751ddb5bd.tar.gz bcm5719-llvm-2f2d7c3addff2e03e0b051a663743bb751ddb5bd.zip | |
[Attributor][Fix] Deal with "growing" dereferenceability
Summary:
If we have a negative inbounds offset dereferenceabily "grows". However,
until we do not handle the overflow that can occur in the
dereferenceable bytes and the problem with loops, we simply do not grow
the state.
Reviewers: sstefan1, uenoku
Subscribers: hiraditya, bollu, llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D66557
llvm-svn: 369771
Diffstat (limited to 'llvm/test/Transforms')
| -rw-r--r-- | llvm/test/Transforms/FunctionAttrs/dereferenceable.ll | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/llvm/test/Transforms/FunctionAttrs/dereferenceable.ll b/llvm/test/Transforms/FunctionAttrs/dereferenceable.ll index f75f9203e84..f61b62e9e23 100644 --- a/llvm/test/Transforms/FunctionAttrs/dereferenceable.ll +++ b/llvm/test/Transforms/FunctionAttrs/dereferenceable.ll @@ -50,3 +50,33 @@ define dereferenceable(4) i32* @test4(i32* dereferenceable(8) %0) local_unnamed_ ret i32* %0 } +; TEST 5 +; loop in which dereferenceabily "grows" +declare void @deref_phi_user(i32* %a); +define void @deref_phi(i32* dereferenceable(4000) %a) { +entry: + br label %for.cond + +for.cond: ; preds = %for.inc, %entry + %i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ] + %a.addr.0 = phi i32* [ %a, %entry ], [ %incdec.ptr, %for.inc ] +; CHECK: call void @deref_phi_user(i32* dereferenceable(4000) %a.addr.0) + call void @deref_phi_user(i32* %a.addr.0) + %tmp = load i32, i32* %a.addr.0, align 4 + %cmp = icmp slt i32 %i.0, %tmp + br i1 %cmp, label %for.body, label %for.cond.cleanup + +for.cond.cleanup: ; preds = %for.cond + br label %for.end + +for.body: ; preds = %for.cond + br label %for.inc + +for.inc: ; preds = %for.body + %incdec.ptr = getelementptr inbounds i32, i32* %a.addr.0, i64 -1 + %inc = add nuw nsw i32 %i.0, 1 + br label %for.cond + +for.end: ; preds = %for.cond.cleanup + ret void +} |

