mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01: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:
parent
d2d22a2dd9
commit
7ecbe8117c
@ -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))
|
||||
|
19
test/Transforms/InstCombine/nonnull-attribute.ll
Normal file
19
test/Transforms/InstCombine/nonnull-attribute.ll
Normal 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
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user