diff options
-rw-r--r-- | lib/Transforms/InstCombine/InstCombineCalls.cpp | 2 | ||||
-rw-r--r-- | test/Transforms/InstCombine/gc.relocate.ll | 31 |
2 files changed, 32 insertions, 1 deletions
diff --git a/lib/Transforms/InstCombine/InstCombineCalls.cpp b/lib/Transforms/InstCombine/InstCombineCalls.cpp index 1b9abfdacbf..cc7d4be7a78 100644 --- a/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -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 diff --git a/test/Transforms/InstCombine/gc.relocate.ll b/test/Transforms/InstCombine/gc.relocate.ll index a51aac10eb5..6003bff1527 100644 --- a/test/Transforms/InstCombine/gc.relocate.ll +++ b/test/Transforms/InstCombine/gc.relocate.ll @@ -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 +} |