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