xref: /freebsd/contrib/llvm-project/llvm/include/llvm/Analysis/LazyValueInfo.h (revision 5f757f3ff9144b609b3c433dfd370cc6bdc191ad)
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/PassManager.h"
18 #include "llvm/Pass.h"
19 
20 namespace llvm {
21   class AssumptionCache;
22   class Constant;
23   class ConstantRange;
24   class DataLayout;
25   class DominatorTree;
26   class Instruction;
27   class TargetLibraryInfo;
28   class Value;
29   class LazyValueInfoImpl;
30   /// This pass computes, caches, and vends lazy value constraint information.
31   class LazyValueInfo {
32     friend class LazyValueInfoWrapperPass;
33     AssumptionCache *AC = nullptr;
34     const DataLayout *DL = nullptr;
35     class TargetLibraryInfo *TLI = nullptr;
36     LazyValueInfoImpl *PImpl = nullptr;
37     LazyValueInfo(const LazyValueInfo &) = delete;
38     void operator=(const LazyValueInfo &) = delete;
39 
40     LazyValueInfoImpl *getImpl();
41     LazyValueInfoImpl &getOrCreateImpl(const Module *M);
42 
43   public:
44     ~LazyValueInfo();
45     LazyValueInfo() = default;
46     LazyValueInfo(AssumptionCache *AC_, const DataLayout *DL_,
47                   TargetLibraryInfo *TLI_)
48         : AC(AC_), DL(DL_), TLI(TLI_) {}
49     LazyValueInfo(LazyValueInfo &&Arg)
50         : AC(Arg.AC), DL(Arg.DL), TLI(Arg.TLI), PImpl(Arg.PImpl) {
51       Arg.PImpl = nullptr;
52     }
53     LazyValueInfo &operator=(LazyValueInfo &&Arg) {
54       releaseMemory();
55       AC = Arg.AC;
56       DL = Arg.DL;
57       TLI = Arg.TLI;
58       PImpl = Arg.PImpl;
59       Arg.PImpl = nullptr;
60       return *this;
61     }
62 
63     /// This is used to return true/false/dunno results.
64     enum Tristate { Unknown = -1, False = 0, True = 1 };
65 
66     // Public query interface.
67 
68     /// Determine whether the specified value comparison with a constant is
69     /// known to be true or false on the specified CFG edge. Pred is a CmpInst
70     /// predicate.
71     Tristate getPredicateOnEdge(unsigned Pred, Value *V, Constant *C,
72                                 BasicBlock *FromBB, BasicBlock *ToBB,
73                                 Instruction *CxtI = nullptr);
74 
75     /// Determine whether the specified value comparison with a constant is
76     /// known to be true or false at the specified instruction. \p Pred is a
77     /// CmpInst predicate. If \p UseBlockValue is true, the block value is also
78     /// taken into account.
79     Tristate getPredicateAt(unsigned Pred, Value *V, Constant *C,
80                             Instruction *CxtI, bool UseBlockValue);
81 
82     /// Determine whether the specified value comparison is known to be true
83     /// or false at the specified instruction. While this takes two Value's,
84     /// it still requires that one of them is a constant.
85     /// \p Pred is a CmpInst predicate.
86     /// If \p UseBlockValue is true, the block value is also taken into account.
87     Tristate getPredicateAt(unsigned Pred, Value *LHS, Value *RHS,
88                             Instruction *CxtI, bool UseBlockValue);
89 
90     /// Determine whether the specified value is known to be a constant at the
91     /// specified instruction. Return null if not.
92     Constant *getConstant(Value *V, Instruction *CxtI);
93 
94     /// Return the ConstantRange constraint that is known to hold for the
95     /// specified value at the specified instruction. This may only be called
96     /// on integer-typed Values.
97     ConstantRange getConstantRange(Value *V, Instruction *CxtI,
98                                    bool UndefAllowed);
99 
100     /// Return the ConstantRange constraint that is known to hold for the value
101     /// at a specific use-site.
102     ConstantRange getConstantRangeAtUse(const Use &U, bool UndefAllowed);
103 
104     /// Determine whether the specified value is known to be a
105     /// constant on the specified edge.  Return null if not.
106     Constant *getConstantOnEdge(Value *V, BasicBlock *FromBB, BasicBlock *ToBB,
107                                 Instruction *CxtI = nullptr);
108 
109     /// Return the ConstantRage constraint that is known to hold for the
110     /// specified value on the specified edge. This may be only be called
111     /// on integer-typed Values.
112     ConstantRange getConstantRangeOnEdge(Value *V, BasicBlock *FromBB,
113                                          BasicBlock *ToBB,
114                                          Instruction *CxtI = nullptr);
115 
116     /// Inform the analysis cache that we have threaded an edge from
117     /// PredBB to OldSucc to be from PredBB to NewSucc instead.
118     void threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc,
119                     BasicBlock *NewSucc);
120 
121     /// Remove information related to this value from the cache.
122     void forgetValue(Value *V);
123 
124     /// Inform the analysis cache that we have erased a block.
125     void eraseBlock(BasicBlock *BB);
126 
127     /// Complete flush all previously computed values
128     void clear();
129 
130     /// Print the \LazyValueInfo Analysis.
131     /// We pass in the DTree that is required for identifying which basic blocks
132     /// we can solve/print for, in the LVIPrinter.
133     void printLVI(Function &F, DominatorTree &DTree, raw_ostream &OS);
134 
135     // For old PM pass. Delete once LazyValueInfoWrapperPass is gone.
136     void releaseMemory();
137 
138     /// Handle invalidation events in the new pass manager.
139     bool invalidate(Function &F, const PreservedAnalyses &PA,
140                     FunctionAnalysisManager::Invalidator &Inv);
141   };
142 
143 /// Analysis to compute lazy value information.
144 class LazyValueAnalysis : public AnalysisInfoMixin<LazyValueAnalysis> {
145 public:
146   typedef LazyValueInfo Result;
147   Result run(Function &F, FunctionAnalysisManager &FAM);
148 
149 private:
150   static AnalysisKey Key;
151   friend struct AnalysisInfoMixin<LazyValueAnalysis>;
152 };
153 
154 /// Printer pass for the LazyValueAnalysis results.
155 class LazyValueInfoPrinterPass
156     : public PassInfoMixin<LazyValueInfoPrinterPass> {
157   raw_ostream &OS;
158 
159 public:
160   explicit LazyValueInfoPrinterPass(raw_ostream &OS) : OS(OS) {}
161 
162   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
163 };
164 
165 /// Wrapper around LazyValueInfo.
166 class LazyValueInfoWrapperPass : public FunctionPass {
167   LazyValueInfoWrapperPass(const LazyValueInfoWrapperPass&) = delete;
168   void operator=(const LazyValueInfoWrapperPass&) = delete;
169 public:
170   static char ID;
171   LazyValueInfoWrapperPass();
172   ~LazyValueInfoWrapperPass() override {
173     assert(!Info.PImpl && "releaseMemory not called");
174   }
175 
176   LazyValueInfo &getLVI();
177 
178   void getAnalysisUsage(AnalysisUsage &AU) const override;
179   void releaseMemory() override;
180   bool runOnFunction(Function &F) override;
181 private:
182   LazyValueInfo Info;
183 };
184 
185 }  // end namespace llvm
186 
187 #endif
188 
189