32 #ifndef LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
33 #define LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
40 class AssumptionCache;
45 class TargetLibraryInfo;
52 const TargetLibraryInfo *TLI =
nullptr,
53 const DominatorTree *DT =
nullptr,
54 AssumptionCache *AC =
nullptr,
55 const Instruction *CxtI =
nullptr);
60 const TargetLibraryInfo *TLI =
nullptr,
61 const DominatorTree *DT =
nullptr,
62 AssumptionCache *AC =
nullptr,
63 const Instruction *CxtI =
nullptr);
68 const TargetLibraryInfo *TLI =
nullptr,
69 const DominatorTree *DT =
nullptr,
70 AssumptionCache *AC =
nullptr,
71 const Instruction *CxtI =
nullptr);
76 const TargetLibraryInfo *TLI =
nullptr,
77 const DominatorTree *DT =
nullptr,
78 AssumptionCache *AC =
nullptr,
79 const Instruction *CxtI =
nullptr);
84 const TargetLibraryInfo *TLI =
nullptr,
85 const DominatorTree *DT =
nullptr,
86 AssumptionCache *AC =
nullptr,
87 const Instruction *CxtI =
nullptr);
91 const TargetLibraryInfo *TLI =
nullptr,
92 const DominatorTree *DT =
nullptr,
93 AssumptionCache *AC =
nullptr,
94 const Instruction *CxtI =
nullptr);
98 const TargetLibraryInfo *TLI =
nullptr,
99 const DominatorTree *DT =
nullptr,
100 AssumptionCache *AC =
nullptr,
101 const Instruction *CxtI =
nullptr);
105 const TargetLibraryInfo *TLI =
nullptr,
106 const DominatorTree *DT =
nullptr,
107 AssumptionCache *AC =
nullptr,
108 const Instruction *CxtI =
nullptr);
112 const DataLayout &DL,
113 const TargetLibraryInfo *TLI =
nullptr,
114 const DominatorTree *DT =
nullptr,
115 AssumptionCache *AC =
nullptr,
116 const Instruction *CxtI =
nullptr);
120 const TargetLibraryInfo *TLI =
nullptr,
121 const DominatorTree *DT =
nullptr,
122 AssumptionCache *AC =
nullptr,
123 const Instruction *CxtI =
nullptr);
127 const TargetLibraryInfo *TLI =
nullptr,
128 const DominatorTree *DT =
nullptr,
129 AssumptionCache *AC =
nullptr,
130 const Instruction *CxtI =
nullptr);
134 const DataLayout &DL,
135 const TargetLibraryInfo *TLI =
nullptr,
136 const DominatorTree *DT =
nullptr,
137 AssumptionCache *AC =
nullptr,
138 const Instruction *CxtI =
nullptr);
142 const DataLayout &DL,
143 const TargetLibraryInfo *TLI =
nullptr,
144 const DominatorTree *DT =
nullptr,
145 AssumptionCache *AC =
nullptr,
146 const Instruction *CxtI =
nullptr);
150 const DataLayout &DL,
151 const TargetLibraryInfo *TLI =
nullptr,
152 const DominatorTree *DT =
nullptr,
153 AssumptionCache *AC =
nullptr,
154 const Instruction *CxtI =
nullptr);
158 const DataLayout &DL,
159 const TargetLibraryInfo *TLI =
nullptr,
160 const DominatorTree *DT =
nullptr,
161 AssumptionCache *AC =
nullptr,
162 const Instruction *CxtI =
nullptr);
166 const TargetLibraryInfo *TLI =
nullptr,
167 const DominatorTree *DT =
nullptr,
168 AssumptionCache *AC =
nullptr,
169 const Instruction *CxtI =
nullptr);
172 Value *
SimplifyOrInst(Value *LHS, Value *RHS,
const DataLayout &DL,
173 const TargetLibraryInfo *TLI =
nullptr,
174 const DominatorTree *DT =
nullptr,
175 AssumptionCache *AC =
nullptr,
176 const Instruction *CxtI =
nullptr);
180 const TargetLibraryInfo *TLI =
nullptr,
181 const DominatorTree *DT =
nullptr,
182 AssumptionCache *AC =
nullptr,
183 const Instruction *CxtI =
nullptr);
187 const DataLayout &DL,
188 const TargetLibraryInfo *TLI =
nullptr,
189 const DominatorTree *DT =
nullptr,
190 AssumptionCache *AC =
nullptr,
191 const Instruction *CxtI =
nullptr);
195 FastMathFlags FMF,
const DataLayout &DL,
196 const TargetLibraryInfo *TLI =
nullptr,
197 const DominatorTree *DT =
nullptr,
198 AssumptionCache *AC =
nullptr,
199 const Instruction *CxtI =
nullptr);
203 const DataLayout &DL,
204 const TargetLibraryInfo *TLI =
nullptr,
205 const DominatorTree *DT =
nullptr,
206 AssumptionCache *AC =
nullptr,
207 const Instruction *CxtI =
nullptr);
211 const DataLayout &DL,
212 const TargetLibraryInfo *TLI =
nullptr,
213 const DominatorTree *DT =
nullptr,
214 AssumptionCache *AC =
nullptr,
215 const Instruction *CxtI =
nullptr);
219 ArrayRef<unsigned> Idxs,
const DataLayout &DL,
220 const TargetLibraryInfo *TLI =
nullptr,
221 const DominatorTree *DT =
nullptr,
222 AssumptionCache *AC =
nullptr,
223 const Instruction *CxtI =
nullptr);
227 const DataLayout &DL,
228 const TargetLibraryInfo *TLI =
nullptr,
229 const DominatorTree *DT =
nullptr,
230 AssumptionCache *AC =
nullptr,
231 const Instruction *CxtI =
nullptr);
235 const DataLayout &DL,
236 const TargetLibraryInfo *TLI =
nullptr,
237 const DominatorTree *DT =
nullptr,
238 AssumptionCache *AC =
nullptr,
239 const Instruction *CxtI =
nullptr);
243 const DataLayout &DL,
244 const TargetLibraryInfo *TLI =
nullptr,
245 const DominatorTree *DT =
nullptr,
246 AssumptionCache *AC =
nullptr,
247 const Instruction *CxtI =
nullptr);
254 const DataLayout &DL,
255 const TargetLibraryInfo *TLI =
nullptr,
256 const DominatorTree *DT =
nullptr,
257 AssumptionCache *AC =
nullptr,
258 const Instruction *CxtI =
nullptr);
261 Value *
SimplifyBinOp(
unsigned Opcode, Value *LHS, Value *RHS,
262 const DataLayout &DL,
263 const TargetLibraryInfo *TLI =
nullptr,
264 const DominatorTree *DT =
nullptr,
265 AssumptionCache *AC =
nullptr,
266 const Instruction *CxtI =
nullptr);
272 const FastMathFlags &FMF,
const DataLayout &DL,
273 const TargetLibraryInfo *TLI =
nullptr,
274 const DominatorTree *DT =
nullptr,
275 AssumptionCache *AC =
nullptr,
276 const Instruction *CxtI =
nullptr);
282 const TargetLibraryInfo *TLI =
nullptr,
283 const DominatorTree *DT =
nullptr,
284 AssumptionCache *AC =
nullptr,
285 const Instruction *CxtI =
nullptr);
289 const TargetLibraryInfo *TLI =
nullptr,
290 const DominatorTree *DT =
nullptr,
291 AssumptionCache *AC =
nullptr,
292 const Instruction *CxtI =
nullptr);
297 const TargetLibraryInfo *TLI =
nullptr,
298 const DominatorTree *DT =
nullptr,
299 AssumptionCache *AC =
nullptr);
309 const TargetLibraryInfo *TLI =
nullptr,
310 const DominatorTree *DT =
nullptr,
311 AssumptionCache *AC =
nullptr);
320 const TargetLibraryInfo *TLI =
nullptr,
321 const DominatorTree *DT =
nullptr,
322 AssumptionCache *AC =
nullptr);
Value * SimplifyCall(Value *V, User::op_iterator ArgBegin, User::op_iterator ArgEnd, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given a function and iterators over arguments, fold the result or return null.
Value * SimplifySDivInst(Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an SDiv, fold the result or return null.
Value * SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS, FastMathFlags FMF, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an FCmpInst, fold the result or return null.
Value * SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an Add, fold the result or return null.
Value * SimplifyFSubInst(Value *LHS, Value *RHS, FastMathFlags FMF, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an FSub, fold the result or return null.
Value * SimplifyFAddInst(Value *LHS, Value *RHS, FastMathFlags FMF, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an FAdd, fold the result or return null.
Value * SimplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a CastInst, fold the result or return null.
Value * SimplifyFMulInst(Value *LHS, Value *RHS, FastMathFlags FMF, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an FMul, fold the result or return null.
Value * SimplifyOrInst(Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an Or, fold the result or return null.
Value * SimplifyShlInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a Shl, fold the result or return null.
Value * SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value *RHS, const FastMathFlags &FMF, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an FP BinaryOperator, fold the result or return null.
Value * SimplifySRemInst(Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an SRem, fold the result or return null.
Value * SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a SelectInst, fold the result or return null.
bool recursivelySimplifyInstruction(Instruction *I, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr)
Recursively attempt to simplify an instruction.
Value * SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a CmpInst, fold the result or return null.
Value * SimplifyInsertValueInst(Value *Agg, Value *Val, ArrayRef< unsigned > Idxs, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an InsertValueInst, fold the result or return null.
Value * SimplifyExtractElementInst(Value *Vec, Value *Idx, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an ExtractElementInst, fold the result or return null.
Value * SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a BinaryOperator, fold the result or return null.
Value * SimplifySubInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a Sub, fold the result or return null.
Value * SimplifyGEPInst(Type *SrcTy, ArrayRef< Value * > Ops, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a GetElementPtrInst, fold the result or return null.
Value * SimplifyAndInst(Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an And, fold the result or return null.
Value * SimplifyURemInst(Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a URem, fold the result or return null.
Value * SimplifyMulInst(Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a Mul, fold the result or return null.
Value * SimplifyExtractValueInst(Value *Agg, ArrayRef< unsigned > Idxs, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an ExtractValueInst, fold the result or return null.
Value * SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a LShr, fold the result or return null.
Value * SimplifyUDivInst(Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a UDiv, fold the result or return null.
Value * SimplifyXorInst(Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an Xor, fold the result or return null.
Value * SimplifyFRemInst(Value *LHS, Value *RHS, FastMathFlags FMF, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an FRem, fold the result or return null.
Value * SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a AShr, fold the result or return nulll.
Value * SimplifyInstruction(Instruction *I, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr)
See if we can compute a simplified version of this instruction.
bool replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr)
Replace all uses of 'I' with 'SimpleV' and simplify the uses recursively.
Value * SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an ICmpInst, fold the result or return null.
Value * SimplifyFDivInst(Value *LHS, Value *RHS, FastMathFlags FMF, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an FDiv, fold the result or return null.