From 4bf804fe0d352ea5a69beb0962d99c333beabd32 Mon Sep 17 00:00:00 2001 From: Nick Lewycky Date: Tue, 20 May 2014 05:13:21 +0000 Subject: Teach isKnownNonNull that a nonnull return is not null. Add a test for this case as well as the case of a nonnull attribute (already handled but not tested). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209193 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ValueTracking.cpp | 5 +++++ test/Transforms/InstSimplify/compare.ll | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 280f15b509..4f48753578 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -16,6 +16,7 @@ #include "llvm/ADT/SmallPtrSet.h" #include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/MemoryBuiltins.h" +#include "llvm/IR/CallSite.h" #include "llvm/IR/ConstantRange.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" @@ -2073,6 +2074,10 @@ bool llvm::isKnownNonNull(const Value *V, const TargetLibraryInfo *TLI) { if (const GlobalValue *GV = dyn_cast(V)) return !GV->hasExternalWeakLinkage(); + if (ImmutableCallSite CS = V) + if (CS.paramHasAttr(0, Attribute::NonNull)) + return true; + // operator new never returns null. if (isOperatorNewLikeFn(V, TLI, /*LookThroughBitCast=*/true)) return true; diff --git a/test/Transforms/InstSimplify/compare.ll b/test/Transforms/InstSimplify/compare.ll index 1a62e27dd8..105e244ed8 100644 --- a/test/Transforms/InstSimplify/compare.ll +++ b/test/Transforms/InstSimplify/compare.ll @@ -866,3 +866,20 @@ define i1 @exact_ashr_sgt_false(i32 %a) { ; CHECK-LABEL: @exact_ashr_sgt_false ; CHECK-NEXT: ret i1 false } + +define i1 @nonnull_arg(i32* nonnull %i) { + %cmp = icmp eq i32* %i, null + ret i1 %cmp +; CHECK-LABEL: @nonnull_arg +; CHECK: ret i1 false +} + +declare nonnull i32* @returns_nonnull_helper() +define i1 @returns_nonnull() { + %call = call nonnull i32* @returns_nonnull_helper() + %cmp = icmp eq i32* %call, null + ret i1 %cmp +; CHECK-LABEL: @returns_nonnull +; CHECK: ret i1 false +} + -- cgit v1.2.3