1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-19 02:52:53 +02:00

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.

llvm-svn: 246137
This commit is contained in:
Pete Cooper 2015-08-27 03:16:29 +00:00
parent d2d22a2dd9
commit 7ecbe8117c
2 changed files with 24 additions and 2 deletions

View File

@ -3226,9 +3226,12 @@ bool llvm::isKnownNonNull(const Value *V, const TargetLibraryInfo *TLI) {
if (const Argument *A = dyn_cast<Argument>(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<GlobalValue>(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<LoadInst>(V))

View File

@ -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
}