LLVM 24.0.0git
Loads.h
Go to the documentation of this file.
1//===- Loads.h - Local load analysis --------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file declares simple local analyses for load instructions.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_ANALYSIS_LOADS_H
14#define LLVM_ANALYSIS_LOADS_H
15
16#include "llvm/ADT/APInt.h"
18#include "llvm/IR/BasicBlock.h"
22
23namespace llvm {
24
25class BatchAAResults;
26class AssumptionCache;
27class DataLayout;
28class DominatorTree;
29class Instruction;
30class LoadInst;
32class Loop;
33class MemoryLocation;
34class SCEV;
35class ScalarEvolution;
36class SCEVPredicate;
37class StoreInst;
38template <typename T> class SmallVectorImpl;
40
41/// Returns true if V is always a dereferenceable pointer with alignment
42/// greater or equal than requested. If the context instruction is specified
43/// performs context-sensitive analysis and returns true if the pointer is
44/// dereferenceable at the specified instruction.
45/// If \p IgnoreFree is set, ignore potential frees of the object.
47 Align Alignment,
48 const SimplifyQuery &Q,
49 bool IgnoreFree = false);
50
51/// Returns true if V is always dereferenceable for Size byte with alignment
52/// greater or equal than requested. If the context instruction is specified
53/// performs context-sensitive analysis and returns true if the pointer is
54/// dereferenceable at the specified instruction.
55/// If \p IgnoreFree is set, ignore potential frees of the object.
57 Align Alignment,
58 const APInt &Size,
59 const SimplifyQuery &Q,
60 bool IgnoreFree = false);
61
62/// Equivalent to isDereferenceableAndAlignedPointer with an alignment of 1.
64 const SimplifyQuery &Q,
65 bool IgnoreFree = false);
66
67/// Equivalent to isDereferenceableAndAlignedPointer with an alignment of 1.
69 const SimplifyQuery &Q,
70 bool IgnoreFree = false);
71
72/// Return true if we know that executing a load from this value cannot trap.
73///
74/// If SQ.CtxI is specified this method performs context-sensitive analysis
75/// and returns true if it is safe to load immediately before SQ.CtxI.
76///
77/// If it is not obviously safe to load from the specified pointer, we do a
78/// quick local scan of the basic block containing SQ.CtxI, to determine if
79/// the address is already accessed.
81 const APInt &Size,
82 const SimplifyQuery &SQ,
83 bool IgnoreFree = false);
84
85/// Return true if we can prove that the given load (which is assumed to be
86/// within the specified loop) would access only dereferenceable memory, and
87/// be properly aligned on every iteration of the specified loop regardless of
88/// its placement within the loop. (i.e. does not require predication beyond
89/// that required by the header itself and could be hoisted into the header
90/// if desired.) This is more powerful than the variants above when the
91/// address loaded from is analyzeable by SCEV.
94 AssumptionCache *AC = nullptr,
95 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr);
96
97/// Overload for isDereferenceableAndAlignedInLoop taking the pointer and access
98/// size directly as SCEVs.
100 const SCEV *PtrSCEV, Align Alignment, const SCEV *EltSizeSCEV, Loop *L,
101 ScalarEvolution &SE, DominatorTree &DT, AssumptionCache *AC = nullptr,
102 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr);
103
104/// Returns true if the loop contains read-only memory accesses and doesn't
105/// throw. Puts loads that may fault into \p NonDereferenceableAndAlignedLoads.
106LLVM_ABI bool
108 AssumptionCache *AC,
109 SmallVectorImpl<LoadInst *> &NonDereferenceableAndAlignedLoads,
110 SmallVectorImpl<const SCEVPredicate *> *Predicates = nullptr);
111
112/// Return true if we know that executing a load from this value cannot trap.
113///
114/// If SQ.CtxI is specified this method performs context-sensitive analysis
115/// and returns true if it is safe to load immediately before SQ.CtxI.
116///
117/// If it is not obviously safe to load from the specified pointer, we do a
118/// quick local scan of the basic block containing SQ.CtxI, to determine if
119/// the address is already accessed.
120LLVM_ABI bool isSafeToLoadUnconditionally(Value *V, Type *Ty, Align Alignment,
121 const SimplifyQuery &SQ,
122 bool IgnoreFree = false);
123
124/// Return true if speculation of the given load must be suppressed to avoid
125/// ordering or interfering with an active sanitizer. If not suppressed,
126/// dereferenceability and alignment must be proven separately. Note: This
127/// is only needed for raw reasoning; if you use the interface below
128/// (isSafeToSpeculativelyExecute), this is handled internally.
130
131/// The default number of maximum instructions to scan in the block, used by
132/// FindAvailableLoadedValue().
134
135/// Scan backwards to see if we have the value of the given load available
136/// locally within a small number of instructions.
137///
138/// You can use this function to scan across multiple blocks: after you call
139/// this function, if ScanFrom points at the beginning of the block, it's safe
140/// to continue scanning the predecessors.
141///
142/// Note that performing load CSE requires special care to make sure the
143/// metadata is set appropriately. In particular, aliasing metadata needs
144/// to be merged. (This doesn't matter for store-to-load forwarding because
145/// the only relevant load gets deleted.)
146///
147/// \param Load The load we want to replace.
148/// \param ScanBB The basic block to scan.
149/// \param [in,out] ScanFrom The location to start scanning from. When this
150/// function returns, it points at the last instruction scanned.
151/// \param MaxInstsToScan The maximum number of instructions to scan. If this
152/// is zero, the whole block will be scanned.
153/// \param AA Optional pointer to alias analysis, to make the scan more
154/// precise.
155/// \param [out] IsLoadCSE Whether the returned value is a load from the same
156/// location in memory, as opposed to the value operand of a store.
157///
158/// \returns The found value, or nullptr if no value is found.
160 LoadInst *Load, BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom,
161 unsigned MaxInstsToScan = DefMaxInstsToScan, BatchAAResults *AA = nullptr,
162 bool *IsLoadCSE = nullptr, unsigned *NumScanedInst = nullptr);
163
164/// This overload provides a more efficient implementation of
165/// FindAvailableLoadedValue() for the case where we are not interested in
166/// finding the closest clobbering instruction if no available load is found.
167/// This overload cannot be used to scan across multiple blocks.
170 unsigned MaxInstsToScan = DefMaxInstsToScan);
171
172/// Check whether \p SI, which may alias \p MemLoc, can be safely skipped.
173/// This is possible when \p SI does only MustAlias or NoAlias \p MemLoc (no
174/// partial overlap possible), and it stores the value \p MemLoc currently
175/// holds (loaded before the store and not modified in between).
177 const MemoryLocation &MemLoc,
178 Align MemLocAlign,
180 unsigned ScanLimit);
181
182/// Scan backwards to see if we have the value of the given pointer available
183/// locally within a small number of instructions.
184///
185/// You can use this function to scan across multiple blocks: after you call
186/// this function, if ScanFrom points at the beginning of the block, it's safe
187/// to continue scanning the predecessors.
188///
189/// \param Loc The location we want the load and store to originate from.
190/// \param AccessTy The access type of the pointer.
191/// \param AccessProps The properties of the load we want to replace.
192/// \param ScanBB The basic block to scan.
193/// \param [in,out] ScanFrom The location to start scanning from. When this
194/// function returns, it points at the last instruction scanned.
195/// \param MaxInstsToScan The maximum number of instructions to scan. If this
196/// is zero, the whole block will be scanned.
197/// \param AA Optional pointer to alias analysis, to make the scan more
198/// precise.
199/// \param [out] IsLoadCSE Whether the returned value is a load from the same
200/// location in memory, as opposed to the value operand of a store.
201///
202/// \returns The found value, or nullptr if no value is found.
205 const LoadStoreInstProperties &AccessProps,
206 BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom,
207 unsigned MaxInstsToScan, BatchAAResults *AA,
208 bool *IsLoadCSE, unsigned *NumScanedInst);
209
210/// Returns true if a pointer value \p From can be replaced with another pointer
211/// value \To if they are deemed equal through some means (e.g. information from
212/// conditions).
213/// NOTE: The current implementation allows replacement in Icmp and PtrToInt
214/// instructions, as well as when we are replacing with a null pointer.
215/// Additionally it also allows replacement of pointers when both pointers have
216/// the same underlying object.
217LLVM_ABI bool canReplacePointersIfEqual(const Value *From, const Value *To,
218 const DataLayout &DL);
219LLVM_ABI bool canReplacePointersInUseIfEqual(const Use &U, const Value *To,
220 const DataLayout &DL);
221
222/// Linear expression BasePtr + Index * Scale + Offset.
223/// Index, Scale and Offset all have the same bit width, which matches the
224/// pointer index size of BasePtr.
225/// Index may be nullptr if Scale is 0.
236
237/// Decompose a pointer into a linear expression. This may look through
238/// multiple GEPs.
239LLVM_ABI LinearExpression decomposeLinearExpression(const DataLayout &DL,
240 Value *Ptr);
241}
242
243#endif
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define LLVM_ABI
Definition Compiler.h:215
Class for arbitrary precision integers.
Definition APInt.h:78
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
This class is a wrapper over an AAResults, and it is intended to be used only when there are no IR ch...
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
Represents flags for the getelementptr instruction/expression.
static GEPNoWrapFlags all()
An instruction for reading from memory.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
Representation for a specific memory location.
This class represents an assumption made using SCEV expressions which can be checked at run-time.
This class represents an analyzed expression in the program.
The main scalar evolution driver.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
An instruction for storing to memory.
Provides information about what library functions are available for the current target.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
Abstract Attribute helper functions.
Definition Attributor.h:165
This is an optimization pass for GlobalISel generic memory operations.
@ Load
The value being inserted comes from a load (InsertElement only).
LLVM_ABI bool isStorePreservingMemoryLocation(const StoreInst *SI, const MemoryLocation &MemLoc, Align MemLocAlign, BatchAAResults &AA, unsigned ScanLimit)
Check whether SI, which may alias MemLoc, can be safely skipped.
Definition Loads.cpp:845
LLVM_ABI bool mustSuppressSpeculation(const LoadInst &LI)
Return true if speculation of the given load must be suppressed to avoid ordering or interfering with...
Definition Loads.cpp:452
LLVM_ABI Value * FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan=DefMaxInstsToScan, BatchAAResults *AA=nullptr, bool *IsLoadCSE=nullptr, unsigned *NumScanedInst=nullptr)
Scan backwards to see if we have the value of the given load available locally within a small number ...
Definition Loads.cpp:554
LLVM_ABI bool canReplacePointersInUseIfEqual(const Use &U, const Value *To, const DataLayout &DL)
Definition Loads.cpp:926
LLVM_ABI bool canReplacePointersIfEqual(const Value *From, const Value *To, const DataLayout &DL)
Returns true if a pointer value From can be replaced with another pointer value \To if they are deeme...
Definition Loads.cpp:946
LLVM_ABI LinearExpression decomposeLinearExpression(const DataLayout &DL, Value *Ptr)
Decompose a pointer into a linear expression.
Definition Loads.cpp:974
LLVM_ABI cl::opt< unsigned > DefMaxInstsToScan
The default number of maximum instructions to scan in the block, used by FindAvailableLoadedValue().
LLVM_ABI bool isSafeToLoadUnconditionally(Value *V, Align Alignment, const APInt &Size, const SimplifyQuery &SQ, bool IgnoreFree=false)
Return true if we know that executing a load from this value cannot trap.
Definition Loads.cpp:456
LLVM_ABI bool isDereferenceableAndAlignedPointer(const Value *V, Type *Ty, Align Alignment, const SimplifyQuery &Q, bool IgnoreFree=false)
Returns true if V is always a dereferenceable pointer with alignment greater or equal than requested.
Definition Loads.cpp:244
constexpr unsigned BitWidth
LLVM_ABI bool isReadOnlyLoop(Loop *L, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC, SmallVectorImpl< LoadInst * > &NonDereferenceableAndAlignedLoads, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Returns true if the loop contains read-only memory accesses and doesn't throw.
Definition Loads.cpp:956
LLVM_ABI bool isDereferenceablePointer(const Value *V, Type *Ty, const SimplifyQuery &Q, bool IgnoreFree=false)
Equivalent to isDereferenceableAndAlignedPointer with an alignment of 1.
Definition Loads.cpp:264
LLVM_ABI Value * findAvailablePtrLoadStore(const MemoryLocation &Loc, Type *AccessTy, const LoadStoreInstProperties &AccessProps, BasicBlock *ScanBB, BasicBlock::iterator &ScanFrom, unsigned MaxInstsToScan, BatchAAResults *AA, bool *IsLoadCSE, unsigned *NumScanedInst)
Scan backwards to see if we have the value of the given pointer available locally within a small numb...
Definition Loads.cpp:715
LLVM_ABI bool isDereferenceableAndAlignedInLoop(LoadInst *LI, Loop *L, ScalarEvolution &SE, DominatorTree &DT, AssumptionCache *AC=nullptr, SmallVectorImpl< const SCEVPredicate * > *Predicates=nullptr)
Return true if we can prove that the given load (which is assumed to be within the specified loop) wo...
Definition Loads.cpp:304
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
LinearExpression(Value *BasePtr, unsigned BitWidth)
Definition Loads.h:233
GEPNoWrapFlags Flags
Definition Loads.h:231
A structure representing the properties of a load or store instruction.