LLVM 23.0.0git
LazyValueInfo.h
Go to the documentation of this file.
1//===- LazyValueInfo.h - Value constraint analysis --------------*- C++ -*-===//
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 defines the interface for lazy computation of value constraint
10// information.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_ANALYSIS_LAZYVALUEINFO_H
15#define LLVM_ANALYSIS_LAZYVALUEINFO_H
16
17#include "llvm/IR/InstrTypes.h"
18#include "llvm/IR/PassManager.h"
19#include "llvm/Pass.h"
20
21namespace llvm {
22 class AssumptionCache;
23 class BasicBlock;
24 class Constant;
25 class DataLayout;
26 class DominatorTree;
27 class Instruction;
28 class Value;
29 class Use;
31 /// This pass computes, caches, and vends lazy value constraint information.
32 class LazyValueInfo {
34 Function *F = nullptr;
35 AssumptionCache *AC = nullptr;
36 LazyValueInfoImpl *PImpl = nullptr;
37 LazyValueInfo(const LazyValueInfo &) = delete;
38 void operator=(const LazyValueInfo &) = delete;
39
40 LazyValueInfoImpl *getImpl();
41 LazyValueInfoImpl &getOrCreateImpl();
42
43 public:
45 LazyValueInfo() = default;
46 LazyValueInfo(Function *F, AssumptionCache *AC) : F(F), AC(AC) {}
47 LazyValueInfo(LazyValueInfo &&Arg)
48 : F(Arg.F), AC(Arg.AC), PImpl(Arg.PImpl) {
49 Arg.PImpl = nullptr;
50 }
51 LazyValueInfo &operator=(LazyValueInfo &&Arg) {
53 F = Arg.F;
54 AC = Arg.AC;
55 PImpl = Arg.PImpl;
56 Arg.PImpl = nullptr;
57 return *this;
58 }
59
60 // Public query interface.
61
62 /// Determine whether the specified value comparison with a constant is
63 /// known to be true or false on the specified CFG edge. Pred is a CmpInst
64 /// predicate.
66 Constant *C, BasicBlock *FromBB,
67 BasicBlock *ToBB,
68 Instruction *CxtI = nullptr);
69
70 /// Determine whether the specified value comparison with a constant is
71 /// known to be true or false at the specified instruction. \p Pred is a
72 /// CmpInst predicate. If \p UseBlockValue is true, the block value is also
73 /// taken into account.
75 Constant *C, Instruction *CxtI,
76 bool UseBlockValue);
77
78 /// Determine whether the specified value comparison is known to be true
79 /// or false at the specified instruction. While this takes two Value's,
80 /// it still requires that one of them is a constant.
81 /// \p Pred is a CmpInst predicate.
82 /// If \p UseBlockValue is true, the block value is also taken into account.
84 Value *RHS, Instruction *CxtI,
85 bool UseBlockValue);
86
87 /// Determine whether the specified value is known to be a constant at the
88 /// specified instruction. Return null if not.
90
91 /// Return the ConstantRange constraint that is known to hold for the
92 /// specified value at the specified instruction. This may only be called
93 /// on integer-typed Values.
95 bool UndefAllowed);
96
97 /// Return the ConstantRange constraint that is known to hold for the value
98 /// at a specific use-site.
100 bool UndefAllowed);
101
102 /// Determine whether the specified value is known to be a
103 /// constant on the specified edge. Return null if not.
105 BasicBlock *ToBB,
106 Instruction *CxtI = nullptr);
107
108 /// Return the ConstantRage constraint that is known to hold for the
109 /// specified value on the specified edge. This may be only be called
110 /// on integer-typed Values.
112 BasicBlock *ToBB,
113 Instruction *CxtI = nullptr);
114
115 /// Inform the analysis cache that we have threaded an edge from
116 /// PredBB to OldSucc to be from PredBB to NewSucc instead.
117 LLVM_ABI void threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc,
118 BasicBlock *NewSucc);
119
120 /// Remove information related to this value from the cache.
121 LLVM_ABI void forgetValue(Value *V);
122
123 /// Inform the analysis cache that we have erased a block.
125
126 /// Complete flush all previously computed values
127 LLVM_ABI void clear();
128
129 /// Print the \LazyValueInfo Analysis.
130 /// We pass in the DTree that is required for identifying which basic blocks
131 /// we can solve/print for, in the LVIPrinter.
133
134 // For old PM pass. Delete once LazyValueInfoWrapperPass is gone.
135 LLVM_ABI void releaseMemory();
136
137 /// Handle invalidation events in the new pass manager.
139 FunctionAnalysisManager::Invalidator &Inv);
140 };
141
142/// Analysis to compute lazy value information.
143class LazyValueAnalysis : public AnalysisInfoMixin<LazyValueAnalysis> {
144public:
147
148private:
149 static AnalysisKey Key;
151};
152
153/// Printer pass for the LazyValueAnalysis results.
155 : public RequiredPassInfoMixin<LazyValueInfoPrinterPass> {
156 raw_ostream &OS;
157
158public:
159 explicit LazyValueInfoPrinterPass(raw_ostream &OS) : OS(OS) {}
160
162};
163
164/// Wrapper around LazyValueInfo.
165class LLVM_ABI LazyValueInfoWrapperPass : public FunctionPass {
166 LazyValueInfoWrapperPass(const LazyValueInfoWrapperPass&) = delete;
167 void operator=(const LazyValueInfoWrapperPass&) = delete;
168public:
169 static char ID;
170 LazyValueInfoWrapperPass();
172 assert(!Info.PImpl && "releaseMemory not called");
173 }
174
175 LazyValueInfo &getLVI();
176
177 void getAnalysisUsage(AnalysisUsage &AU) const override;
178 void releaseMemory() override;
179 bool runOnFunction(Function &F) override;
180private:
181 LazyValueInfo Info;
182};
183
184} // end namespace llvm
185
186#endif
187
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_ABI
Definition Compiler.h:213
static bool runOnFunction(Function &F, bool PostInlining)
This header defines various interfaces for pass management in LLVM.
#define F(x, y, z)
Definition MD5.cpp:54
FunctionAnalysisManager FAM
Value * RHS
Value * LHS
Represent the analysis usage information of a pass.
A cache of @llvm.assume calls within a function.
LLVM Basic Block Representation.
Definition BasicBlock.h:62
Predicate
This enumeration lists the possible predicates for CmpInst subclasses.
Definition InstrTypes.h:740
This class represents a range of values.
This is an important base class in LLVM.
Definition Constant.h:43
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:159
FunctionPass(char &pid)
Definition Pass.h:316
Analysis to compute lazy value information.
LLVM_ABI Result run(Function &F, FunctionAnalysisManager &FAM)
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
LazyValueInfoPrinterPass(raw_ostream &OS)
This pass computes, caches, and vends lazy value constraint information.
LazyValueInfo & operator=(LazyValueInfo &&Arg)
LLVM_ABI void eraseBlock(BasicBlock *BB)
Inform the analysis cache that we have erased a block.
LLVM_ABI ConstantRange getConstantRangeAtUse(const Use &U, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the value at a specific use-site.
LLVM_ABI ConstantRange getConstantRange(Value *V, Instruction *CxtI, bool UndefAllowed)
Return the ConstantRange constraint that is known to hold for the specified value at the specified in...
LazyValueInfo(LazyValueInfo &&Arg)
LLVM_ABI void threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc, BasicBlock *NewSucc)
Inform the analysis cache that we have threaded an edge from PredBB to OldSucc to be from PredBB to N...
LLVM_ABI Constant * getPredicateOnEdge(CmpInst::Predicate Pred, Value *V, Constant *C, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Determine whether the specified value comparison with a constant is known to be true or false on the ...
LLVM_ABI void releaseMemory()
LLVM_ABI Constant * getConstantOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Determine whether the specified value is known to be a constant on the specified edge.
LazyValueInfo(Function *F, AssumptionCache *AC)
LLVM_ABI ConstantRange getConstantRangeOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB, Instruction *CxtI=nullptr)
Return the ConstantRage constraint that is known to hold for the specified value on the specified edg...
LLVM_ABI Constant * getConstant(Value *V, Instruction *CxtI)
Determine whether the specified value is known to be a constant at the specified instruction.
LLVM_ABI void printLVI(Function &F, DominatorTree &DTree, raw_ostream &OS)
Print the \LazyValueInfo Analysis.
LLVM_ABI void forgetValue(Value *V)
Remove information related to this value from the cache.
LazyValueInfo()=default
friend class LazyValueInfoWrapperPass
LLVM_ABI void clear()
Complete flush all previously computed values.
LLVM_ABI Constant * getPredicateAt(CmpInst::Predicate Pred, Value *V, Constant *C, Instruction *CxtI, bool UseBlockValue)
Determine whether the specified value comparison with a constant is known to be true or false at the ...
LLVM_ABI bool invalidate(Function &F, const PreservedAnalyses &PA, FunctionAnalysisManager::Invalidator &Inv)
Handle invalidation events in the new pass manager.
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
LLVM Value Representation.
Definition Value.h:75
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition raw_ostream.h:53
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
This is an optimization pass for GlobalISel generic memory operations.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
A CRTP mix-in that provides informational APIs needed for analysis passes.
A special type used by analysis passes to provide an address that identifies that particular analysis...
Definition Analysis.h:29
A CRTP mix-in for passes that should not be skipped.