[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