From 2587e3ecef2674ff3ef159e902155f9b624f01a6 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Sat, 24 Jun 2017 01:35:13 +0000 Subject: [PATCH] Make visible isDereferenceableAndAlignedPointer(..., const APInt &Size, ...) Summary: Used by D34311 and D34467 Reviewers: hfinkel, efriedma Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D34585 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@306193 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Analysis/Loads.h | 9 +++++++++ lib/Analysis/Loads.cpp | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/llvm/Analysis/Loads.h b/include/llvm/Analysis/Loads.h index a59c1f88e22..f110c28bfc6 100644 --- a/include/llvm/Analysis/Loads.h +++ b/include/llvm/Analysis/Loads.h @@ -39,6 +39,15 @@ bool isDereferenceableAndAlignedPointer(const Value *V, unsigned Align, const Instruction *CtxI = nullptr, const DominatorTree *DT = nullptr); +/// Returns true if V is always dereferenceable for Size byte with alignment +/// greater or equal than requested. If the context instruction is specified +/// performs context-sensitive analysis and returns true if the pointer is +/// dereferenceable at the specified instruction. +bool isDereferenceableAndAlignedPointer(const Value *V, unsigned Align, + const APInt &Size, const DataLayout &DL, + const Instruction *CtxI = nullptr, + const DominatorTree *DT = nullptr); + /// Return true if we know that executing a load from this value cannot trap. /// /// If DT and ScanFrom are specified this method performs context-sensitive diff --git a/lib/Analysis/Loads.cpp b/lib/Analysis/Loads.cpp index 96799a459bf..591b0fc481d 100644 --- a/lib/Analysis/Loads.cpp +++ b/lib/Analysis/Loads.cpp @@ -116,6 +116,16 @@ static bool isDereferenceableAndAlignedPointer( return false; } +bool llvm::isDereferenceableAndAlignedPointer(const Value *V, unsigned Align, + const APInt &Size, + const DataLayout &DL, + const Instruction *CtxI, + const DominatorTree *DT) { + SmallPtrSet Visited; + return ::isDereferenceableAndAlignedPointer(V, Align, Size, DL, CtxI, DT, + Visited); +} + bool llvm::isDereferenceableAndAlignedPointer(const Value *V, unsigned Align, const DataLayout &DL, const Instruction *CtxI, -- 2.50.1