From 7a26326442ed1feadbeef62799daba43e2912a3c Mon Sep 17 00:00:00 2001 From: Artur Pilipenko Date: Wed, 11 May 2016 14:43:28 +0000 Subject: NFC. Introduce Value::isPointerDereferenceable Extract a part of isDereferenceableAndAlignedPointer functionality to Value: Reviewed By: hfinkel, sanjoy Differential Revision: http://reviews.llvm.org/D17611 llvm-svn: 269190 --- llvm/lib/Analysis/Loads.cpp | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) (limited to 'llvm/lib/Analysis') diff --git a/llvm/lib/Analysis/Loads.cpp b/llvm/lib/Analysis/Loads.cpp index 58a8723626b..b0355ccee87 100644 --- a/llvm/lib/Analysis/Loads.cpp +++ b/llvm/lib/Analysis/Loads.cpp @@ -91,9 +91,12 @@ static bool isDereferenceableAndAlignedPointer( // Note that it is not safe to speculate into a malloc'd region because // malloc may return null. - // These are obviously ok if aligned. - if (isa(V)) + bool CheckForNonNull; + if (V->isPointerDereferenceable(CheckForNonNull)) { + if (CheckForNonNull && !isKnownNonNullAt(V, CtxI, DT, TLI)) + return false; return isAligned(V, Align, DL); + } // It's not always safe to follow a bitcast, for example: // bitcast i8* (alloca i8) to i32* @@ -112,16 +115,6 @@ static bool isDereferenceableAndAlignedPointer( CtxI, DT, TLI, Visited); } - // Global variables which can't collapse to null are ok. - if (const GlobalVariable *GV = dyn_cast(V)) - if (!GV->hasExternalWeakLinkage()) - return isAligned(V, Align, DL); - - // byval arguments are okay. - if (const Argument *A = dyn_cast(V)) - if (A->hasByValAttr()) - return isAligned(V, Align, DL); - if (isDereferenceableFromAttribute(V, DL, CtxI, DT, TLI)) return isAligned(V, Align, DL); -- cgit v1.2.3