[llvm-commits] [llvm] r112015 - in /llvm/trunk: lib/Analysis/LazyValueInfo.cpp test/Transforms/JumpThreading/lvi-load.ll

Owen Anderson resistor at mac.com
Tue Aug 24 18:16:47 PDT 2010


Author: resistor
Date: Tue Aug 24 20:16:47 2010
New Revision: 112015

URL: http://llvm.org/viewvc/llvm-project?rev=112015&view=rev
Log:
In the default address space, any GEP off of null results in a trap value if you try to load it.  Thus,
any load in the default address space that completes implies that the base value that it GEP'd from
was not null.

Added:
    llvm/trunk/test/Transforms/JumpThreading/lvi-load.ll
Modified:
    llvm/trunk/lib/Analysis/LazyValueInfo.cpp

Modified: llvm/trunk/lib/Analysis/LazyValueInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LazyValueInfo.cpp?rev=112015&r1=112014&r2=112015&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/LazyValueInfo.cpp (original)
+++ llvm/trunk/lib/Analysis/LazyValueInfo.cpp Tue Aug 24 20:16:47 2010
@@ -457,10 +457,11 @@
     // then we know that the pointer can't be NULL.
     if (Val->getType()->isPointerTy()) {
       const PointerType *PTy = cast<PointerType>(Val->getType());
-      for (Value::use_iterator UI = Val->use_begin(), UE = Val->use_end();
-           UI != UE; ++UI) {
-        LoadInst *L = dyn_cast<LoadInst>(*UI);
-        if (L && L->getParent() == BB && L->getPointerAddressSpace() == 0) {
+      for (BasicBlock::iterator BI = BB->begin(), BE = BB->end();BI != BE;++BI){
+        LoadInst *L = dyn_cast<LoadInst>(BI);
+        if (L && L->getPointerAddressSpace() == 0 &&
+            L->getPointerOperand()->getUnderlyingObject() ==
+              Val->getUnderlyingObject()) {
           return LVILatticeVal::getNot(ConstantPointerNull::get(PTy));
         }
       }

Added: llvm/trunk/test/Transforms/JumpThreading/lvi-load.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/JumpThreading/lvi-load.ll?rev=112015&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/JumpThreading/lvi-load.ll (added)
+++ llvm/trunk/test/Transforms/JumpThreading/lvi-load.ll Tue Aug 24 20:16:47 2010
@@ -0,0 +1,48 @@
+; RUN: opt -S -jump-threading -enable-jump-threading-lvi < %s | FileCheck %s
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+target triple = "x86_64-apple-darwin10.4"
+
+%"struct.llvm::PATypeHolder" = type { %"struct.llvm::Type"* }
+%"struct.llvm::PointerIntPair<llvm::Use**,2u,llvm::Use::PrevPtrTag,llvm::PointerLikeTypeTraits<llvm::Use**> >" = type { i64 }
+%"struct.llvm::Type" = type opaque
+%"struct.llvm::Use" = type { %"struct.llvm::Value"*, %"struct.llvm::Use"*, %"struct.llvm::PointerIntPair<llvm::Use**,2u,llvm::Use::PrevPtrTag,llvm::PointerLikeTypeTraits<llvm::Use**> >" }
+%"struct.llvm::Value" = type { i32 (...)**, i8, i8, i16, %"struct.llvm::PATypeHolder", %"struct.llvm::Use"*, %"struct.llvm::ValueName"* }
+%"struct.llvm::ValueName" = type opaque
+
+ at _ZZN4llvm4castINS_11InstructionEPNS_5ValueEEENS_10cast_rettyIT_T0_E8ret_typeERKS6_E8__func__ = internal constant [5 x i8] c"cast\00", align 8 ; <[5 x i8]*> [#uses=1]
+ at .str = private constant [31 x i8] c"include/llvm/Support/Casting.h\00", align 8 ; <[31 x i8]*> [#uses=1]
+ at .str1 = private constant [59 x i8] c"isa<X>(Val) && \22cast<Ty>() argument of incompatible type!\22\00", align 8 ; <[59 x i8]*> [#uses=1]
+
+; CHECK: Z3fooPN4llvm5ValueE
+define zeroext i8 @_Z3fooPN4llvm5ValueE(%"struct.llvm::Value"* %V) ssp {
+entry:
+  %0 = getelementptr inbounds %"struct.llvm::Value"* %V, i64 0, i32 1 ; <i8*> [#uses=1]
+  %1 = load i8* %0, align 8                       ; <i8> [#uses=2]
+  %2 = icmp ugt i8 %1, 20                         ; <i1> [#uses=1]
+  br i1 %2, label %bb.i, label %bb2
+
+bb.i:                                             ; preds = %entry
+  %toBoolnot.i.i = icmp ult i8 %1, 21             ; <i1> [#uses=1]
+  br i1 %toBoolnot.i.i, label %bb6.i.i, label %_ZN4llvm8dyn_castINS_11InstructionEPNS_5ValueEEENS_10cast_rettyIT_T0_E8ret_typeERKS6_.exit
+
+bb6.i.i:                                          ; preds = %bb.i
+  tail call void @__assert_rtn(i8* getelementptr inbounds ([5 x i8]* @_ZZN4llvm4castINS_11InstructionEPNS_5ValueEEENS_10cast_rettyIT_T0_E8ret_typeERKS6_E8__func__, i64 0, i64 0), i8* getelementptr inbounds ([31 x i8]* @.str, i64 0, i64 0), i32 202, i8* getelementptr inbounds ([59 x i8]* @.str1, i64 0, i64 0)) noreturn
+  unreachable
+
+_ZN4llvm8dyn_castINS_11InstructionEPNS_5ValueEEENS_10cast_rettyIT_T0_E8ret_typeERKS6_.exit: ; preds = %bb.i
+; CHECK-NOT: null
+  %3 = icmp eq %"struct.llvm::Value"* %V, null    ; <i1> [#uses=1]
+  br i1 %3, label %bb2, label %bb
+
+bb:                                               ; preds = %_ZN4llvm8dyn_castINS_11InstructionEPNS_5ValueEEENS_10cast_rettyIT_T0_E8ret_typeERKS6_.exit
+  tail call void @_ZNK4llvm5Value4dumpEv(%"struct.llvm::Value"* %V)
+; CHECK: ret
+  ret i8 1
+
+bb2:                                              ; preds = %entry, %_ZN4llvm8dyn_castINS_11InstructionEPNS_5ValueEEENS_10cast_rettyIT_T0_E8ret_typeERKS6_.exit
+  ret i8 0
+}
+
+declare void @__assert_rtn(i8*, i8*, i32, i8*) noreturn
+
+declare void @_ZNK4llvm5Value4dumpEv(%"struct.llvm::Value"*)





More information about the llvm-commits mailing list