From: Pete Cooper Date: Thu, 27 Aug 2015 03:16:29 +0000 (+0000) Subject: isKnownNonNull needs to consider globals in non-zero address spaces. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=a72297881f8d1892fd6f0480469617a1b80c18d9;p=oota-llvm.git isKnownNonNull needs to consider globals in non-zero address spaces. Globals in address spaces other than one may have 0 as a valid address, so we should not assume that they can be null. Reviewed by Philip Reames. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@246137 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/ValueTracking.cpp b/lib/Analysis/ValueTracking.cpp index 9b930d7d2eb..352b0fbd4dc 100644 --- a/lib/Analysis/ValueTracking.cpp +++ b/lib/Analysis/ValueTracking.cpp @@ -3226,9 +3226,12 @@ bool llvm::isKnownNonNull(const Value *V, const TargetLibraryInfo *TLI) { if (const Argument *A = dyn_cast(V)) return A->hasByValOrInAllocaAttr() || A->hasNonNullAttr(); - // Global values are not null unless extern weak. + // A global variable in address space 0 is non null unless extern weak. + // Other address spaces may have null as a valid address for a global, + // so we can't assume anything. if (const GlobalValue *GV = dyn_cast(V)) - return !GV->hasExternalWeakLinkage(); + return !GV->hasExternalWeakLinkage() && + GV->getType()->getAddressSpace() == 0; // A Load tagged w/nonnull metadata is never null. if (const LoadInst *LI = dyn_cast(V)) diff --git a/test/Transforms/InstCombine/nonnull-attribute.ll b/test/Transforms/InstCombine/nonnull-attribute.ll new file mode 100644 index 00000000000..74fb0911492 --- /dev/null +++ b/test/Transforms/InstCombine/nonnull-attribute.ll @@ -0,0 +1,19 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +; This test makes sure that we do not assume globals in address spaces other +; than 0 are able to be null. + +@as0 = external global i32 +@as1 = external addrspace(1) global i32 + +declare void @addrspace0(i32*) +declare void @addrspace1(i32 addrspace(1)*) + +; CHECK: call void @addrspace0(i32* nonnull @as0) +; CHECK: call void @addrspace1(i32 addrspace(1)* @as1) + +define void @test() { + call void @addrspace0(i32* @as0) + call void @addrspace1(i32 addrspace(1)* @as1) + ret void +}