blob: 6662e91037e1a2d43e584c848af4fd9a5d27927f [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//===-- InstructionSimplify.h - Fold instrs into simpler forms --*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file declares routines for folding instructions into simpler forms
11// that do not require creating new instructions. This does constant folding
12// ("add i32 1, 1" -> "2") but can also handle non-constant operands, either
13// returning a constant ("and i32 %x, 0" -> "0") or an already existing value
14// ("and i32 %x, %x" -> "%x"). If the simplification is also an instruction
15// then it dominates the original instruction.
16//
17// These routines implicitly resolve undef uses. The easiest way to be safe when
18// using these routines to obtain simplified values for existing instructions is
19// to always replace all uses of the instructions with the resulting simplified
20// values. This will prevent other code from seeing the same undef uses and
21// resolving them to different values.
22//
23// These routines are designed to tolerate moderately incomplete IR, such as
24// instructions that are not connected to basic blocks yet. However, they do
25// require that all the IR that they encounter be valid. In particular, they
26// require that all non-constant values be defined in the same function, and the
27// same call context of that function (and not split between caller and callee
28// contexts of a directly recursive call, for example).
29//
30//===----------------------------------------------------------------------===//
31
32#ifndef LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
33#define LLVM_ANALYSIS_INSTRUCTIONSIMPLIFY_H
34
Andrew Scull0372a572018-11-16 15:47:06 +000035#include "llvm/IR/Instruction.h"
36#include "llvm/IR/Operator.h"
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010037#include "llvm/IR/User.h"
38
39namespace llvm {
40class Function;
41template <typename T, typename... TArgs> class AnalysisManager;
42template <class T> class ArrayRef;
43class AssumptionCache;
44class DominatorTree;
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010045class ImmutableCallSite;
46class DataLayout;
47class FastMathFlags;
48struct LoopStandardAnalysisResults;
49class OptimizationRemarkEmitter;
50class Pass;
51class TargetLibraryInfo;
52class Type;
53class Value;
Andrew Scull0372a572018-11-16 15:47:06 +000054class MDNode;
55class BinaryOperator;
56
57/// InstrInfoQuery provides an interface to query additional information for
58/// instructions like metadata or keywords like nsw, which provides conservative
59/// results if the users specified it is safe to use.
60struct InstrInfoQuery {
61 InstrInfoQuery(bool UMD) : UseInstrInfo(UMD) {}
62 InstrInfoQuery() : UseInstrInfo(true) {}
63 bool UseInstrInfo = true;
64
65 MDNode *getMetadata(const Instruction *I, unsigned KindID) const {
66 if (UseInstrInfo)
67 return I->getMetadata(KindID);
68 return nullptr;
69 }
70
71 template <class InstT> bool hasNoUnsignedWrap(const InstT *Op) const {
72 if (UseInstrInfo)
73 return Op->hasNoUnsignedWrap();
74 return false;
75 }
76
77 template <class InstT> bool hasNoSignedWrap(const InstT *Op) const {
78 if (UseInstrInfo)
79 return Op->hasNoSignedWrap();
80 return false;
81 }
82
83 bool isExact(const BinaryOperator *Op) const {
84 if (UseInstrInfo && isa<PossiblyExactOperator>(Op))
85 return cast<PossiblyExactOperator>(Op)->isExact();
86 return false;
87 }
88};
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010089
90struct SimplifyQuery {
91 const DataLayout &DL;
92 const TargetLibraryInfo *TLI = nullptr;
93 const DominatorTree *DT = nullptr;
94 AssumptionCache *AC = nullptr;
95 const Instruction *CxtI = nullptr;
96
Andrew Scull0372a572018-11-16 15:47:06 +000097 // Wrapper to query additional information for instructions like metadata or
98 // keywords like nsw, which provides conservative results if those cannot
99 // be safely used.
100 const InstrInfoQuery IIQ;
101
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100102 SimplifyQuery(const DataLayout &DL, const Instruction *CXTI = nullptr)
103 : DL(DL), CxtI(CXTI) {}
104
105 SimplifyQuery(const DataLayout &DL, const TargetLibraryInfo *TLI,
106 const DominatorTree *DT = nullptr,
107 AssumptionCache *AC = nullptr,
Andrew Scull0372a572018-11-16 15:47:06 +0000108 const Instruction *CXTI = nullptr, bool UseInstrInfo = true)
109 : DL(DL), TLI(TLI), DT(DT), AC(AC), CxtI(CXTI), IIQ(UseInstrInfo) {}
Andrew Scull5e1ddfa2018-08-14 10:06:54 +0100110 SimplifyQuery getWithInstruction(Instruction *I) const {
111 SimplifyQuery Copy(*this);
112 Copy.CxtI = I;
113 return Copy;
114 }
115};
116
117// NOTE: the explicit multiple argument versions of these functions are
118// deprecated.
119// Please use the SimplifyQuery versions in new code.
120
121/// Given operands for an Add, fold the result or return null.
122Value *SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
123 const SimplifyQuery &Q);
124
125/// Given operands for a Sub, fold the result or return null.
126Value *SimplifySubInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
127 const SimplifyQuery &Q);
128
129/// Given operands for an FAdd, fold the result or return null.
130Value *SimplifyFAddInst(Value *LHS, Value *RHS, FastMathFlags FMF,
131 const SimplifyQuery &Q);
132
133/// Given operands for an FSub, fold the result or return null.
134Value *SimplifyFSubInst(Value *LHS, Value *RHS, FastMathFlags FMF,
135 const SimplifyQuery &Q);
136
137/// Given operands for an FMul, fold the result or return null.
138Value *SimplifyFMulInst(Value *LHS, Value *RHS, FastMathFlags FMF,
139 const SimplifyQuery &Q);
140
141/// Given operands for a Mul, fold the result or return null.
142Value *SimplifyMulInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
143
144/// Given operands for an SDiv, fold the result or return null.
145Value *SimplifySDivInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
146
147/// Given operands for a UDiv, fold the result or return null.
148Value *SimplifyUDivInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
149
150/// Given operands for an FDiv, fold the result or return null.
151Value *SimplifyFDivInst(Value *LHS, Value *RHS, FastMathFlags FMF,
152 const SimplifyQuery &Q);
153
154/// Given operands for an SRem, fold the result or return null.
155Value *SimplifySRemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
156
157/// Given operands for a URem, fold the result or return null.
158Value *SimplifyURemInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
159
160/// Given operands for an FRem, fold the result or return null.
161Value *SimplifyFRemInst(Value *LHS, Value *RHS, FastMathFlags FMF,
162 const SimplifyQuery &Q);
163
164/// Given operands for a Shl, fold the result or return null.
165Value *SimplifyShlInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
166 const SimplifyQuery &Q);
167
168/// Given operands for a LShr, fold the result or return null.
169Value *SimplifyLShrInst(Value *Op0, Value *Op1, bool isExact,
170 const SimplifyQuery &Q);
171
172/// Given operands for a AShr, fold the result or return nulll.
173Value *SimplifyAShrInst(Value *Op0, Value *Op1, bool isExact,
174 const SimplifyQuery &Q);
175
176/// Given operands for an And, fold the result or return null.
177Value *SimplifyAndInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
178
179/// Given operands for an Or, fold the result or return null.
180Value *SimplifyOrInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
181
182/// Given operands for an Xor, fold the result or return null.
183Value *SimplifyXorInst(Value *LHS, Value *RHS, const SimplifyQuery &Q);
184
185/// Given operands for an ICmpInst, fold the result or return null.
186Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
187 const SimplifyQuery &Q);
188
189/// Given operands for an FCmpInst, fold the result or return null.
190Value *SimplifyFCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
191 FastMathFlags FMF, const SimplifyQuery &Q);
192
193/// Given operands for a SelectInst, fold the result or return null.
194Value *SimplifySelectInst(Value *Cond, Value *TrueVal, Value *FalseVal,
195 const SimplifyQuery &Q);
196
197/// Given operands for a GetElementPtrInst, fold the result or return null.
198Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops,
199 const SimplifyQuery &Q);
200
201/// Given operands for an InsertValueInst, fold the result or return null.
202Value *SimplifyInsertValueInst(Value *Agg, Value *Val, ArrayRef<unsigned> Idxs,
203 const SimplifyQuery &Q);
204
205/// Given operands for an InsertElement, fold the result or return null.
206Value *SimplifyInsertElementInst(Value *Vec, Value *Elt, Value *Idx,
207 const SimplifyQuery &Q);
208
209/// Given operands for an ExtractValueInst, fold the result or return null.
210Value *SimplifyExtractValueInst(Value *Agg, ArrayRef<unsigned> Idxs,
211 const SimplifyQuery &Q);
212
213/// Given operands for an ExtractElementInst, fold the result or return null.
214Value *SimplifyExtractElementInst(Value *Vec, Value *Idx,
215 const SimplifyQuery &Q);
216
217/// Given operands for a CastInst, fold the result or return null.
218Value *SimplifyCastInst(unsigned CastOpc, Value *Op, Type *Ty,
219 const SimplifyQuery &Q);
220
221/// Given operands for a ShuffleVectorInst, fold the result or return null.
222Value *SimplifyShuffleVectorInst(Value *Op0, Value *Op1, Constant *Mask,
223 Type *RetTy, const SimplifyQuery &Q);
224
225//=== Helper functions for higher up the class hierarchy.
226
227/// Given operands for a CmpInst, fold the result or return null.
228Value *SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
229 const SimplifyQuery &Q);
230
231/// Given operands for a BinaryOperator, fold the result or return null.
232Value *SimplifyBinOp(unsigned Opcode, Value *LHS, Value *RHS,
233 const SimplifyQuery &Q);
234
235/// Given operands for an FP BinaryOperator, fold the result or return null.
236/// In contrast to SimplifyBinOp, try to use FastMathFlag when folding the
237/// result. In case we don't need FastMathFlags, simply fall to SimplifyBinOp.
238Value *SimplifyFPBinOp(unsigned Opcode, Value *LHS, Value *RHS,
239 FastMathFlags FMF, const SimplifyQuery &Q);
240
241/// Given a callsite, fold the result or return null.
242Value *SimplifyCall(ImmutableCallSite CS, const SimplifyQuery &Q);
243
244/// Given a function and iterators over arguments, fold the result or return
245/// null.
246Value *SimplifyCall(ImmutableCallSite CS, Value *V, User::op_iterator ArgBegin,
247 User::op_iterator ArgEnd, const SimplifyQuery &Q);
248
249/// Given a function and set of arguments, fold the result or return null.
250Value *SimplifyCall(ImmutableCallSite CS, Value *V, ArrayRef<Value *> Args,
251 const SimplifyQuery &Q);
252
253/// See if we can compute a simplified version of this instruction. If not,
254/// return null.
255Value *SimplifyInstruction(Instruction *I, const SimplifyQuery &Q,
256 OptimizationRemarkEmitter *ORE = nullptr);
257
258/// Replace all uses of 'I' with 'SimpleV' and simplify the uses recursively.
259///
260/// This first performs a normal RAUW of I with SimpleV. It then recursively
261/// attempts to simplify those users updated by the operation. The 'I'
262/// instruction must not be equal to the simplified value 'SimpleV'.
263///
264/// The function returns true if any simplifications were performed.
265bool replaceAndRecursivelySimplify(Instruction *I, Value *SimpleV,
266 const TargetLibraryInfo *TLI = nullptr,
267 const DominatorTree *DT = nullptr,
268 AssumptionCache *AC = nullptr);
269
270/// Recursively attempt to simplify an instruction.
271///
272/// This routine uses SimplifyInstruction to simplify 'I', and if successful
273/// replaces uses of 'I' with the simplified value. It then recurses on each
274/// of the users impacted. It returns true if any simplifications were
275/// performed.
276bool recursivelySimplifyInstruction(Instruction *I,
277 const TargetLibraryInfo *TLI = nullptr,
278 const DominatorTree *DT = nullptr,
279 AssumptionCache *AC = nullptr);
280
281// These helper functions return a SimplifyQuery structure that contains as
282// many of the optional analysis we use as are currently valid. This is the
283// strongly preferred way of constructing SimplifyQuery in passes.
284const SimplifyQuery getBestSimplifyQuery(Pass &, Function &);
285template <class T, class... TArgs>
286const SimplifyQuery getBestSimplifyQuery(AnalysisManager<T, TArgs...> &,
287 Function &);
288const SimplifyQuery getBestSimplifyQuery(LoopStandardAnalysisResults &,
289 const DataLayout &);
290} // end namespace llvm
291
292#endif
293