[llvm] r246137 - isKnownNonNull needs to consider globals in non-zero address spaces.
Pete Cooper via llvm-commits
llvm-commits at lists.llvm.org
Wed Aug 26 20:16:29 PDT 2015
Author: pete
Date: Wed Aug 26 22:16:29 2015
New Revision: 246137
URL: http://llvm.org/viewvc/llvm-project?rev=246137&view=rev
Log:
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.
Added:
llvm/trunk/test/Transforms/InstCombine/nonnull-attribute.ll
Modified:
llvm/trunk/lib/Analysis/ValueTracking.cpp
Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=246137&r1=246136&r2=246137&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Wed Aug 26 22:16:29 2015
@@ -3226,9 +3226,12 @@ bool llvm::isKnownNonNull(const Value *V
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))
Added: llvm/trunk/test/Transforms/InstCombine/nonnull-attribute.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/nonnull-attribute.ll?rev=246137&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/nonnull-attribute.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/nonnull-attribute.ll Wed Aug 26 22:16:29 2015
@@ -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.
+
+ at as0 = external global i32
+ at 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
+}
More information about the llvm-commits
mailing list