LLVM 23.0.0git
IVDescriptors.h
Go to the documentation of this file.
1//===- llvm/Analysis/IVDescriptors.h - IndVar Descriptors -------*- 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 "describes" induction and recurrence variables.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_ANALYSIS_IVDESCRIPTORS_H
14#define LLVM_ANALYSIS_IVDESCRIPTORS_H
15
19#include "llvm/IR/ValueHandle.h"
21
22namespace llvm {
23
24class AssumptionCache;
25class DemandedBits;
26class DominatorTree;
27class Loop;
29class ScalarEvolution;
30class SCEV;
31class StoreInst;
32
33/// These are the kinds of recurrences that we support.
34enum class RecurKind {
35 // clang-format off
36 None, ///< Not a recurrence.
37 Add, ///< Sum of integers.
38 Sub, ///< Subtraction of integers
39 AddChainWithSubs, ///< A chain of adds and subs
40 Mul, ///< Product of integers.
41 Or, ///< Bitwise or logical OR of integers.
42 And, ///< Bitwise or logical AND of integers.
43 Xor, ///< Bitwise or logical XOR of integers.
44 SMin, ///< Signed integer min implemented in terms of select(cmp()).
45 SMax, ///< Signed integer max implemented in terms of select(cmp()).
46 UMin, ///< Unsigned integer min implemented in terms of select(cmp()).
47 UMax, ///< Unsigned integer max implemented in terms of select(cmp()).
48 FAdd, ///< Sum of floats.
49 FMul, ///< Product of floats.
50 FMin, ///< FP min implemented in terms of select(cmp()).
51 FMax, ///< FP max implemented in terms of select(cmp()).
52 FMinNum, ///< FP min with llvm.minnum semantics including NaNs.
53 FMaxNum, ///< FP max with llvm.maxnum semantics including NaNs.
54 FMinimum, ///< FP min with llvm.minimum semantics
55 FMaximum, ///< FP max with llvm.maximum semantics
56 FMinimumNum, ///< FP min with llvm.minimumnum semantics
57 FMaximumNum, ///< FP max with llvm.maximumnum semantics
58 FMulAdd, ///< Sum of float products with llvm.fmuladd(a * b + sum).
59 AnyOf, ///< AnyOf reduction with select(cmp(),x,y) where one of (x,y) is
60 ///< loop invariant, and both x and y are integer type.
61 FindIV, ///< FindIV reduction with select(icmp(),x,y) where one of (x,y) is
62 ///< a loop induction variable (increasing or decreasing), and both
63 ///< x and y are integer type. The signedness and direction are
64 ///< stored separately.
65 FindLast, ///< FindLast reduction with select(cmp(),x,y) where x and y
66 ///< are an integer type, one is the current recurrence value,
67 ///< and the other is an arbitrary value.
68 // clang-format on
69 // TODO: Any_of and FindLast reduction need not be restricted to integer type
70 // only.
71};
72
73/// The RecurrenceDescriptor is used to identify recurrences variables in a
74/// loop. Reduction is a special case of recurrence that has uses of the
75/// recurrence variable outside the loop. The method isReductionPHI identifies
76/// reductions that are basic recurrences.
77///
78/// Basic recurrences are defined as the summation, product, OR, AND, XOR, min,
79/// or max of a set of terms. For example: for(i=0; i<n; i++) { total +=
80/// array[i]; } is a summation of array elements. Basic recurrences are a
81/// special case of chains of recurrences (CR). See ScalarEvolution for CR
82/// references.
83
84/// This struct holds information about recurrence variables.
86public:
88
90 RecurKind K, FastMathFlags FMF, Instruction *ExactFP,
91 Type *RT, bool Signed, bool Ordered,
93 unsigned MinWidthCastToRecurTy,
94 bool PhiHasUsesOutsideReductionChain = false)
95 : IntermediateStore(Store), StartValue(Start), LoopExitInstr(Exit),
96 Kind(K), FMF(FMF), ExactFPMathInst(ExactFP), RecurrenceType(RT),
97 IsSigned(Signed), IsOrdered(Ordered),
98 PhiHasUsesOutsideReductionChain(PhiHasUsesOutsideReductionChain),
99 MinWidthCastToRecurrenceType(MinWidthCastToRecurTy) {
100 CastInsts.insert_range(CI);
101 assert(
102 (!PhiHasUsesOutsideReductionChain || isMinMaxRecurrenceKind(K)) &&
103 "Only min/max recurrences are allowed to have multiple uses currently");
104 }
105
106 /// Simpler constructor for min/max recurrences that don't track cast
107 /// instructions.
109 RecurKind K, FastMathFlags FMF, Instruction *ExactFP,
110 Type *RT, bool IsMultiUse = false)
111 : IntermediateStore(Store), StartValue(Start), LoopExitInstr(Exit),
112 Kind(K), FMF(FMF), ExactFPMathInst(ExactFP), RecurrenceType(RT),
113 PhiHasUsesOutsideReductionChain(IsMultiUse) {}
114
115 /// This POD struct holds information about a potential recurrence operation.
116 class InstDesc {
117 public:
118 InstDesc(bool IsRecur, Instruction *I, Instruction *ExactFP = nullptr)
119 : IsRecurrence(IsRecur), PatternLastInst(I),
120 RecKind(RecurKind::None), ExactFPMathInst(ExactFP) {}
121
122 InstDesc(Instruction *I, RecurKind K, Instruction *ExactFP = nullptr)
123 : IsRecurrence(true), PatternLastInst(I), RecKind(K),
124 ExactFPMathInst(ExactFP) {}
125
126 bool isRecurrence() const { return IsRecurrence; }
127
128 bool needsExactFPMath() const { return ExactFPMathInst != nullptr; }
129
130 Instruction *getExactFPMathInst() const { return ExactFPMathInst; }
131
132 RecurKind getRecKind() const { return RecKind; }
133
134 Instruction *getPatternInst() const { return PatternLastInst; }
135
136 private:
137 // Is this instruction a recurrence candidate.
138 bool IsRecurrence;
139 // The last instruction in a min/max pattern (select of the select(icmp())
140 // pattern), or the current recurrence instruction otherwise.
141 Instruction *PatternLastInst;
142 // If this is a min/max pattern.
143 RecurKind RecKind;
144 // Recurrence does not allow floating-point reassociation.
145 Instruction *ExactFPMathInst;
146 };
147
148 /// Returns a struct describing if the instruction 'I' can be a recurrence
149 /// variable of type 'Kind' for a Loop \p L and reduction PHI \p Phi.
150 /// If the recurrence is a min/max pattern of select(icmp()) this function
151 /// advances the instruction pointer 'I' from the compare instruction to the
152 /// select instruction and stores this pointer in 'PatternLastInst' member of
153 /// the returned struct.
154 LLVM_ABI static InstDesc
156 InstDesc &Prev, FastMathFlags FuncFMF, ScalarEvolution *SE);
157
158 /// Returns true if instruction I has multiple uses in Insts
161 unsigned MaxNumUses);
162
163 /// Returns true if all uses of the instruction I is within the Set.
164 LLVM_ABI static bool areAllUsesIn(Instruction *I,
166
167 /// Returns a struct describing whether the instruction is either a
168 /// Select(ICmp(A, B), X, Y), or
169 /// Select(FCmp(A, B), X, Y)
170 /// where one of (X, Y) is a loop invariant integer and the other is a PHI
171 /// value. \p Prev specifies the description of an already processed select
172 /// instruction, so its corresponding cmp can be matched to it.
173 LLVM_ABI static InstDesc isAnyOfPattern(Loop *Loop, PHINode *OrigPhi,
174 Instruction *I, InstDesc &Prev);
175
176 /// Returns a struct describing whether the instruction is either a
177 /// Select(ICmp(A, B), X, Y), or
178 /// Select(FCmp(A, B), X, Y)
179 /// where one of (X, Y) is an increasing (FindLastIV) or decreasing
180 /// (FindFirstIV) loop induction variable, or an arbitrary integer value
181 /// (FindLast), and the other is a PHI value.
182 LLVM_ABI static InstDesc isFindPattern(Loop *TheLoop, PHINode *OrigPhi,
184
185 /// Returns a struct describing if the instruction is a
186 /// Select(FCmp(X, Y), (Z = X op PHINode), PHINode) instruction pattern.
188
189 /// Returns the opcode corresponding to the RecurrenceKind.
190 LLVM_ABI static unsigned getOpcode(RecurKind Kind);
191
192 /// Returns true if Phi is a reduction of type Kind and adds it to the
193 /// RecurrenceDescriptor. If either \p DB is non-null or \p AC and \p DT are
194 /// non-null, the minimal bit width needed to compute the reduction will be
195 /// computed.
196 LLVM_ABI static bool
197 AddReductionVar(PHINode *Phi, RecurKind Kind, Loop *TheLoop,
198 FastMathFlags FuncFMF, RecurrenceDescriptor &RedDes,
199 DemandedBits *DB = nullptr, AssumptionCache *AC = nullptr,
200 DominatorTree *DT = nullptr, ScalarEvolution *SE = nullptr);
201
202 /// Returns true if Phi is a reduction in TheLoop. The RecurrenceDescriptor
203 /// is returned in RedDes. If either \p DB is non-null or \p AC and \p DT are
204 /// non-null, the minimal bit width needed to compute the reduction will be
205 /// computed. If \p SE is non-null, store instructions to loop invariant
206 /// addresses are processed.
207 LLVM_ABI static bool
208 isReductionPHI(PHINode *Phi, Loop *TheLoop, RecurrenceDescriptor &RedDes,
209 DemandedBits *DB = nullptr, AssumptionCache *AC = nullptr,
210 DominatorTree *DT = nullptr, ScalarEvolution *SE = nullptr);
211
212 /// Returns true if Phi is a fixed-order recurrence. A fixed-order recurrence
213 /// is a non-reduction recurrence relation in which the value of the
214 /// recurrence in the current loop iteration equals a value defined in a
215 /// previous iteration (e.g. if the value is defined in the previous
216 /// iteration, we refer to it as first-order recurrence, if it is defined in
217 /// the iteration before the previous, we refer to it as second-order
218 /// recurrence and so on). Note that this function optimistically assumes that
219 /// uses of the recurrence can be re-ordered if necessary and users need to
220 /// check and perform the re-ordering.
221 LLVM_ABI static bool isFixedOrderRecurrence(PHINode *Phi, Loop *TheLoop,
222 DominatorTree *DT);
223
224 RecurKind getRecurrenceKind() const { return Kind; }
225
226 unsigned getOpcode() const { return getOpcode(getRecurrenceKind()); }
227
228 FastMathFlags getFastMathFlags() const { return FMF; }
229
230 TrackingVH<Value> getRecurrenceStartValue() const { return StartValue; }
231
232 Instruction *getLoopExitInstr() const { return LoopExitInstr; }
233
234 /// Returns true if the recurrence has floating-point math that requires
235 /// precise (ordered) operations.
236 bool hasExactFPMath() const { return ExactFPMathInst != nullptr; }
237
238 /// Returns 1st non-reassociative FP instruction in the PHI node's use-chain.
239 Instruction *getExactFPMathInst() const { return ExactFPMathInst; }
240
241 /// Returns true if the recurrence kind is an integer kind.
243
244 /// Returns true if the recurrence kind is a floating point kind.
246
247 /// Returns true if the recurrence kind is an integer min/max kind.
249 return Kind == RecurKind::UMin || Kind == RecurKind::UMax ||
250 Kind == RecurKind::SMin || Kind == RecurKind::SMax;
251 }
252
253 /// Returns true if the recurrence kind is a floating-point minnum/maxnum
254 /// kind.
256 return Kind == RecurKind::FMinNum || Kind == RecurKind::FMaxNum;
257 }
258
259 /// Returns true if the recurrence kind is a floating-point min/max kind.
261 return Kind == RecurKind::FMin || Kind == RecurKind::FMax ||
262 Kind == RecurKind::FMinimum || Kind == RecurKind::FMaximum ||
265 }
266
267 /// Returns true if the recurrence kind is any min/max kind.
270 }
271
272 /// Returns true if the recurrence kind is of the form
273 /// select(cmp(),x,y) where one of (x,y) is loop invariant.
275 return Kind == RecurKind::AnyOf;
276 }
277
278 /// Returns true if the recurrence kind is of the form
279 /// select(cmp(),x,y) where one of (x,y) is a loop induction variable.
281 return Kind == RecurKind::FindIV;
282 }
283
284 /// Returns true if the recurrence kind is of the form
285 /// select(cmp(),x,y) where one of (x,y) is an arbitrary value and the
286 /// other is a recurrence.
288 return Kind == RecurKind::FindLast;
289 }
290
291 static bool isFindRecurrenceKind(RecurKind Kind) {
293 }
294
295 /// Returns the type of the recurrence. This type can be narrower than the
296 /// actual type of the Phi if the recurrence has been type-promoted.
297 Type *getRecurrenceType() const { return RecurrenceType; }
298
299 /// Returns a reference to the instructions used for type-promoting the
300 /// recurrence.
301 const SmallPtrSet<Instruction *, 8> &getCastInsts() const { return CastInsts; }
302
303 /// Returns the minimum width used by the recurrence in bits.
305 return MinWidthCastToRecurrenceType;
306 }
307
308 /// Returns true if all source operands of the recurrence are SExtInsts.
309 bool isSigned() const { return IsSigned; }
310
311 /// Expose an ordered FP reduction to the instance users.
312 bool isOrdered() const { return IsOrdered; }
313
314 /// Returns true if the reduction PHI has any uses outside the reduction
315 /// chain. This is relevant for min/max reductions that are part of a FindIV
316 /// pattern.
318 return PhiHasUsesOutsideReductionChain;
319 }
320
321 /// Attempts to find a chain of operations from Phi to LoopExitInst that can
322 /// be treated as a set of reductions instructions for in-loop reductions.
324 Loop *L) const;
325
326 /// Returns true if the instruction is a call to the llvm.fmuladd intrinsic.
328 return isa<IntrinsicInst>(I) &&
329 cast<IntrinsicInst>(I)->getIntrinsicID() == Intrinsic::fmuladd;
330 }
331
332 /// Reductions may store temporary or final result to an invariant address.
333 /// If there is such a store in the loop then, after successfull run of
334 /// AddReductionVar method, this field will be assigned the last met store.
336
337private:
338 // The starting value of the recurrence.
339 // It does not have to be zero!
340 TrackingVH<Value> StartValue;
341 // The instruction who's value is used outside the loop.
342 Instruction *LoopExitInstr = nullptr;
343 // The kind of the recurrence.
345 // The fast-math flags on the recurrent instructions. We propagate these
346 // fast-math flags into the vectorized FP instructions we generate.
347 FastMathFlags FMF;
348 // First instance of non-reassociative floating-point in the PHI's use-chain.
349 Instruction *ExactFPMathInst = nullptr;
350 // The type of the recurrence.
351 Type *RecurrenceType = nullptr;
352 // True if all source operands of the recurrence are SExtInsts.
353 bool IsSigned = false;
354 // True if this recurrence can be treated as an in-order reduction.
355 // Currently only a non-reassociative FAdd can be considered in-order,
356 // if it is also the only FAdd in the PHI's use chain.
357 bool IsOrdered = false;
358 // True if the reduction PHI has in-loop users outside the reduction chain.
359 // This is relevant for min/max reductions that are part of a FindIV pattern.
360 bool PhiHasUsesOutsideReductionChain = false;
361 // Instructions used for type-promoting the recurrence.
363 // The minimum width used by the recurrence.
364 unsigned MinWidthCastToRecurrenceType;
365};
366
367/// A struct for saving information about induction variables.
369public:
370 /// This enum represents the kinds of inductions that we support.
372 IK_NoInduction, ///< Not an induction variable.
373 IK_IntInduction, ///< Integer induction variable. Step = C.
374 IK_PtrInduction, ///< Pointer induction var. Step = C.
375 IK_FpInduction ///< Floating point induction variable.
376 };
377
378public:
379 /// Default constructor - creates an invalid induction.
381
382 Value *getStartValue() const { return StartValue; }
383 InductionKind getKind() const { return IK; }
384 const SCEV *getStep() const { return Step; }
385 BinaryOperator *getInductionBinOp() const { return InductionBinOp; }
387
388 /// Returns true if \p Phi is an induction in the loop \p L. If \p Phi is an
389 /// induction, the induction descriptor \p D will contain the data describing
390 /// this induction. Since Induction Phis can only be present inside loop
391 /// headers, the function will assert if it is passed a Phi whose parent is
392 /// not the loop header. If by some other means the caller has a better SCEV
393 /// expression for \p Phi than the one returned by the ScalarEvolution
394 /// analysis, it can be passed through \p Expr. If the def-use chain
395 /// associated with the phi includes casts (that we know we can ignore
396 /// under proper runtime checks), they are passed through \p CastsToIgnore.
397 LLVM_ABI static bool
398 isInductionPHI(PHINode *Phi, const Loop *L, ScalarEvolution *SE,
399 InductionDescriptor &D, const SCEV *Expr = nullptr,
400 SmallVectorImpl<Instruction *> *CastsToIgnore = nullptr);
401
402 /// Returns true if \p Phi is a floating point induction in the loop \p L.
403 /// If \p Phi is an induction, the induction descriptor \p D will contain
404 /// the data describing this induction.
405 LLVM_ABI static bool isFPInductionPHI(PHINode *Phi, const Loop *L,
406 ScalarEvolution *SE,
408
409 /// Returns true if \p Phi is a loop \p L induction, in the context associated
410 /// with the run-time predicate of PSE. If \p Assume is true, this can add
411 /// further SCEV predicates to \p PSE in order to prove that \p Phi is an
412 /// induction.
413 /// If \p Phi is an induction, \p D will contain the data describing this
414 /// induction.
415 LLVM_ABI static bool isInductionPHI(PHINode *Phi, const Loop *L,
418 bool Assume = false);
419
420 /// Returns floating-point induction operator that does not allow
421 /// reassociation (transforming the induction requires an override of normal
422 /// floating-point rules).
424 if (IK == IK_FpInduction && InductionBinOp &&
425 !InductionBinOp->hasAllowReassoc())
426 return InductionBinOp;
427 return nullptr;
428 }
429
430 /// Returns binary opcode of the induction operator.
432 return InductionBinOp ? InductionBinOp->getOpcode()
433 : Instruction::BinaryOpsEnd;
434 }
435
436 /// Returns an ArrayRef to the type cast instructions in the induction
437 /// update chain, that are redundant when guarded with a runtime
438 /// SCEV overflow check.
439 ArrayRef<Instruction *> getCastInsts() const { return RedundantCasts; }
440
441private:
442 /// Private constructor - used by \c isInductionPHI.
443 InductionDescriptor(Value *Start, InductionKind K, const SCEV *Step,
444 BinaryOperator *InductionBinOp = nullptr,
445 SmallVectorImpl<Instruction *> *Casts = nullptr);
446
447 /// Start value.
448 TrackingVH<Value> StartValue;
449 /// Induction kind.
450 InductionKind IK = IK_NoInduction;
451 /// Step value.
452 const SCEV *Step = nullptr;
453 // Instruction that advances induction variable.
454 BinaryOperator *InductionBinOp = nullptr;
455 // Instructions used for type-casts of the induction variable,
456 // that are redundant when guarded with a runtime SCEV overflow check.
457 SmallVector<Instruction *, 2> RedundantCasts;
458};
459
460} // end namespace llvm
461
462#endif // LLVM_ANALYSIS_IVDESCRIPTORS_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
#define LLVM_ABI
Definition Compiler.h:213
#define I(x, y, z)
Definition MD5.cpp:57
This file defines the SmallPtrSet class.
This file defines the SmallVector class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
A cache of @llvm.assume calls within a function.
This is the shared class of boolean and integer constants.
Definition Constants.h:87
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:164
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:22
A struct for saving information about induction variables.
BinaryOperator * getInductionBinOp() const
InductionKind getKind() const
const SCEV * getStep() const
ArrayRef< Instruction * > getCastInsts() const
Returns an ArrayRef to the type cast instructions in the induction update chain, that are redundant w...
InductionKind
This enum represents the kinds of inductions that we support.
@ IK_NoInduction
Not an induction variable.
@ IK_FpInduction
Floating point induction variable.
@ IK_PtrInduction
Pointer induction var. Step = C.
@ IK_IntInduction
Integer induction variable. Step = C.
static LLVM_ABI bool isInductionPHI(PHINode *Phi, const Loop *L, ScalarEvolution *SE, InductionDescriptor &D, const SCEV *Expr=nullptr, SmallVectorImpl< Instruction * > *CastsToIgnore=nullptr)
Returns true if Phi is an induction in the loop L.
static LLVM_ABI bool isFPInductionPHI(PHINode *Phi, const Loop *L, ScalarEvolution *SE, InductionDescriptor &D)
Returns true if Phi is a floating point induction in the loop L.
Instruction::BinaryOps getInductionOpcode() const
Returns binary opcode of the induction operator.
Value * getStartValue() const
Instruction * getExactFPMathInst()
Returns floating-point induction operator that does not allow reassociation (transforming the inducti...
InductionDescriptor()=default
Default constructor - creates an invalid induction.
LLVM_ABI ConstantInt * getConstIntStepValue() const
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
An interface layer with SCEV used to manage how we see SCEV expressions for values in the context of ...
InstDesc(bool IsRecur, Instruction *I, Instruction *ExactFP=nullptr)
InstDesc(Instruction *I, RecurKind K, Instruction *ExactFP=nullptr)
Instruction * getExactFPMathInst() const
The RecurrenceDescriptor is used to identify recurrences variables in a loop.
static bool isFPMinMaxRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is a floating-point min/max kind.
Instruction * getExactFPMathInst() const
Returns 1st non-reassociative FP instruction in the PHI node's use-chain.
static bool isFMulAddIntrinsic(Instruction *I)
Returns true if the instruction is a call to the llvm.fmuladd intrinsic.
FastMathFlags getFastMathFlags() const
static bool isFPMinMaxNumRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is a floating-point minnum/maxnum kind.
static LLVM_ABI bool isFixedOrderRecurrence(PHINode *Phi, Loop *TheLoop, DominatorTree *DT)
Returns true if Phi is a fixed-order recurrence.
bool hasExactFPMath() const
Returns true if the recurrence has floating-point math that requires precise (ordered) operations.
Instruction * getLoopExitInstr() const
static LLVM_ABI InstDesc isConditionalRdxPattern(Instruction *I)
Returns a struct describing if the instruction is a Select(FCmp(X, Y), (Z = X op PHINode),...
static LLVM_ABI bool hasMultipleUsesOf(Instruction *I, SmallPtrSetImpl< Instruction * > &Insts, unsigned MaxNumUses)
Returns true if instruction I has multiple uses in Insts.
static LLVM_ABI bool isReductionPHI(PHINode *Phi, Loop *TheLoop, RecurrenceDescriptor &RedDes, DemandedBits *DB=nullptr, AssumptionCache *AC=nullptr, DominatorTree *DT=nullptr, ScalarEvolution *SE=nullptr)
Returns true if Phi is a reduction in TheLoop.
Type * getRecurrenceType() const
Returns the type of the recurrence.
bool hasUsesOutsideReductionChain() const
Returns true if the reduction PHI has any uses outside the reduction chain.
const SmallPtrSet< Instruction *, 8 > & getCastInsts() const
Returns a reference to the instructions used for type-promoting the recurrence.
static LLVM_ABI bool areAllUsesIn(Instruction *I, SmallPtrSetImpl< Instruction * > &Set)
Returns true if all uses of the instruction I is within the Set.
static bool isFindLastRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
unsigned getMinWidthCastToRecurrenceTypeInBits() const
Returns the minimum width used by the recurrence in bits.
TrackingVH< Value > getRecurrenceStartValue() const
LLVM_ABI SmallVector< Instruction *, 4 > getReductionOpChain(PHINode *Phi, Loop *L) const
Attempts to find a chain of operations from Phi to LoopExitInst that can be treated as a set of reduc...
static bool isAnyOfRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
static LLVM_ABI InstDesc isAnyOfPattern(Loop *Loop, PHINode *OrigPhi, Instruction *I, InstDesc &Prev)
Returns a struct describing whether the instruction is either a Select(ICmp(A, B),...
bool isSigned() const
Returns true if all source operands of the recurrence are SExtInsts.
RecurKind getRecurrenceKind() const
bool isOrdered() const
Expose an ordered FP reduction to the instance users.
StoreInst * IntermediateStore
Reductions may store temporary or final result to an invariant address.
static LLVM_ABI InstDesc isRecurrenceInstr(Loop *L, PHINode *Phi, Instruction *I, RecurKind Kind, InstDesc &Prev, FastMathFlags FuncFMF, ScalarEvolution *SE)
Returns a struct describing if the instruction 'I' can be a recurrence variable of type 'Kind' for a ...
static bool isFindRecurrenceKind(RecurKind Kind)
RecurrenceDescriptor(Value *Start, Instruction *Exit, StoreInst *Store, RecurKind K, FastMathFlags FMF, Instruction *ExactFP, Type *RT, bool IsMultiUse=false)
Simpler constructor for min/max recurrences that don't track cast instructions.
static LLVM_ABI bool isFloatingPointRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is a floating point kind.
static bool isFindIVRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
static LLVM_ABI InstDesc isFindPattern(Loop *TheLoop, PHINode *OrigPhi, Instruction *I, ScalarEvolution &SE)
Returns a struct describing whether the instruction is either a Select(ICmp(A, B),...
static LLVM_ABI bool AddReductionVar(PHINode *Phi, RecurKind Kind, Loop *TheLoop, FastMathFlags FuncFMF, RecurrenceDescriptor &RedDes, DemandedBits *DB=nullptr, AssumptionCache *AC=nullptr, DominatorTree *DT=nullptr, ScalarEvolution *SE=nullptr)
Returns true if Phi is a reduction of type Kind and adds it to the RecurrenceDescriptor.
static LLVM_ABI bool isIntegerRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is an integer kind.
RecurrenceDescriptor(Value *Start, Instruction *Exit, StoreInst *Store, RecurKind K, FastMathFlags FMF, Instruction *ExactFP, Type *RT, bool Signed, bool Ordered, SmallPtrSetImpl< Instruction * > &CI, unsigned MinWidthCastToRecurTy, bool PhiHasUsesOutsideReductionChain=false)
static bool isIntMinMaxRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is an integer min/max kind.
static bool isMinMaxRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is any min/max kind.
This class represents an analyzed expression in the program.
The main scalar evolution driver.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
An instruction for storing to memory.
Value handle that tracks a Value across RAUW.
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM Value Representation.
Definition Value.h:75
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
RecurKind
These are the kinds of recurrences that we support.
@ UMin
Unsigned integer min implemented in terms of select(cmp()).
@ FMinimumNum
FP min with llvm.minimumnum semantics.
@ FindIV
FindIV reduction with select(icmp(),x,y) where one of (x,y) is a loop induction variable (increasing ...
@ FMinimum
FP min with llvm.minimum semantics.
@ FMaxNum
FP max with llvm.maxnum semantics including NaNs.
@ Mul
Product of integers.
@ None
Not a recurrence.
@ AnyOf
AnyOf reduction with select(cmp(),x,y) where one of (x,y) is loop invariant, and both x and y are int...
@ Xor
Bitwise or logical XOR of integers.
@ FindLast
FindLast reduction with select(cmp(),x,y) where x and y.
@ FMax
FP max implemented in terms of select(cmp()).
@ FMaximum
FP max with llvm.maximum semantics.
@ FMulAdd
Sum of float products with llvm.fmuladd(a * b + sum).
@ FMul
Product of floats.
@ SMax
Signed integer max implemented in terms of select(cmp()).
@ SMin
Signed integer min implemented in terms of select(cmp()).
@ FMin
FP min implemented in terms of select(cmp()).
@ FMinNum
FP min with llvm.minnum semantics including NaNs.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
@ AddChainWithSubs
A chain of adds and subs.
@ FAdd
Sum of floats.
@ FMaximumNum
FP max with llvm.maximumnum semantics.
@ UMax
Unsigned integer max implemented in terms of select(cmp()).
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
Matching combinators.