Skip to content

Commit

Permalink
[InstCombineCalls] Use isKnownNonNullAt() to check nullness of gc.rel…
Browse files Browse the repository at this point in the history
…ocate return value

Summary: This patch replaces isKnownNonNull() with isKnownNonNullAt() when checking nullness of gc.relocate return value. In this way it can handle cases where the relocated value does not have nonnull attribute but has a dominating null check from the CFG.

Reviewers: reames

Subscribers: llvm-commits, sanjoy

Differential Revision: http://reviews.llvm.org/D12772

llvm-svn: 247353
  • Loading branch information
lic9 committed Sep 10, 2015
1 parent 48b090a commit 32a5141
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
2 changes: 1 addition & 1 deletion llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp
Expand Up @@ -1367,7 +1367,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) {
}

// isKnownNonNull -> nonnull attribute
if (isKnownNonNull(DerivedPtr))
if (isKnownNonNullAt(DerivedPtr, II, DT, TLI))
II->addAttribute(AttributeSet::ReturnIndex, Attribute::NonNull);

// isDereferenceablePointer -> deref attribute
Expand Down
31 changes: 31 additions & 0 deletions llvm/test/Transforms/InstCombine/gc.relocate.ll
Expand Up @@ -19,3 +19,34 @@ entry:
%relocate = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %tok, i32 7, i32 7)
ret i32 addrspace(1)* %relocate
}

define i32 @explicit_nonnull(i32 addrspace(1)* nonnull %dparam) gc "statepoint-example" {
; Checks that a nonnull pointer
; CHECK-LABEL: @explicit_nonnull
; CHECK: ret i32 1
entry:
%load = load i32, i32 addrspace(1)* %dparam
%tok = tail call i32 (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* %dparam)
%relocate = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %tok, i32 7, i32 7)
%cmp = icmp eq i32 addrspace(1)* %relocate, null
%ret_val = select i1 %cmp, i32 0, i32 1
ret i32 %ret_val
}

define i32 @implicit_nonnull(i32 addrspace(1)* %dparam) gc "statepoint-example" {
; Checks that a nonnull pointer
; CHECK-LABEL: @implicit_nonnull
; CHECK: ret i32 1
entry:
%cond = icmp eq i32 addrspace(1)* %dparam, null
br i1 %cond, label %no_gc, label %gc
gc:
%load = load i32, i32 addrspace(1)* %dparam
%tok = tail call i32 (i64, i32, i1 ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_i1f(i64 0, i32 0, i1 ()* @return_i1, i32 0, i32 0, i32 0, i32 0, i32 addrspace(1)* %dparam)
%relocate = call i32 addrspace(1)* @llvm.experimental.gc.relocate.p1i32(i32 %tok, i32 7, i32 7)
%cmp = icmp eq i32 addrspace(1)* %relocate, null
%ret_val = select i1 %cmp, i32 0, i32 1
ret i32 %ret_val
no_gc:
unreachable
}

0 comments on commit 32a5141

Please sign in to comment.