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 SCEVPredicate;
32class StoreInst;
33
34/// These are the kinds of recurrences that we support.
35enum class RecurKind {
36 // clang-format off
37 None, ///< Not a recurrence.
38 Add, ///< Sum of integers.
39 Sub, ///< Subtraction of integers
40 AddChainWithSubs, ///< A chain of adds and subs
41 Mul, ///< Product of integers.
42 Or, ///< Bitwise or logical OR of integers.
43 And, ///< Bitwise or logical AND of integers.
44 Xor, ///< Bitwise or logical XOR of integers.
45 SMin, ///< Signed integer min implemented in terms of select(cmp()).
46 SMax, ///< Signed integer max implemented in terms of select(cmp()).
47 UMin, ///< Unsigned integer min implemented in terms of select(cmp()).
48 UMax, ///< Unsigned integer max implemented in terms of select(cmp()).
49 FAdd, ///< Sum of floats.
50 FAddChainWithSubs, ///< A chain of fadds and fsubs.
51 FSub, ///< Subtraction of floats.
52 FMul, ///< Product of floats.
53 FMin, ///< FP min implemented in terms of select(cmp()).
54 FMax, ///< FP max implemented in terms of select(cmp()).
55 FMinNum, ///< FP min with llvm.minnum semantics including NaNs.
56 FMaxNum, ///< FP max with llvm.maxnum semantics including NaNs.
57 FMinimum, ///< FP min with llvm.minimum semantics
58 FMaximum, ///< FP max with llvm.maximum semantics
59 FMinimumNum, ///< FP min with llvm.minimumnum semantics
60 FMaximumNum, ///< FP max with llvm.maximumnum semantics
61 FMulAdd, ///< Sum of float products with llvm.fmuladd(a * b + sum).
62 AnyOf, ///< AnyOf reduction with select(cmp(),x,y) where one of (x,y) is
63 ///< loop invariant, and both x and y are integer type.
64 FindIV, ///< FindIV reduction with select(icmp(),x,y) where one of (x,y) is
65 ///< a loop induction variable (increasing or decreasing), and both
66 ///< x and y are integer type. The signedness and direction are
67 ///< stored separately.
68 FindLast, ///< FindLast reduction with select(cmp(),x,y) where x and y
69 ///< are an integer type, one is the current recurrence value,
70 ///< and the other is an arbitrary value.
71 // clang-format on
72 // TODO: Any_of and FindLast reduction need not be restricted to integer type
73 // only.
74};
75
76/// The RecurrenceDescriptor is used to identify recurrences variables in a
77/// loop. Reduction is a special case of recurrence that has uses of the
78/// recurrence variable outside the loop. The method isReductionPHI identifies
79/// reductions that are basic recurrences.
80///
81/// Basic recurrences are defined as the summation, product, OR, AND, XOR, min,
82/// or max of a set of terms. For example: for(i=0; i<n; i++) { total +=
83/// array[i]; } is a summation of array elements. Basic recurrences are a
84/// special case of chains of recurrences (CR). See ScalarEvolution for CR
85/// references.
86
87/// This struct holds information about recurrence variables.
89public:
91
93 RecurKind K, FastMathFlags FMF, Instruction *ExactFP,
94 Type *RT, bool Signed, bool Ordered,
96 unsigned MinWidthCastToRecurTy,
97 bool PhiHasUsesOutsideReductionChain = false)
98 : IntermediateStore(Store), StartValue(Start), LoopExitInstr(Exit),
99 Kind(K), FMF(FMF), ExactFPMathInst(ExactFP), RecurrenceType(RT),
100 IsSigned(Signed), IsOrdered(Ordered),
101 PhiHasUsesOutsideReductionChain(PhiHasUsesOutsideReductionChain),
102 MinWidthCastToRecurrenceType(MinWidthCastToRecurTy) {
103 CastInsts.insert_range(CI);
104 assert(
105 (!PhiHasUsesOutsideReductionChain || isMinMaxRecurrenceKind(K)) &&
106 "Only min/max recurrences are allowed to have multiple uses currently");
107 }
108
109 /// Simpler constructor for min/max recurrences that don't track cast
110 /// instructions.
112 RecurKind K, FastMathFlags FMF, Instruction *ExactFP,
113 Type *RT, bool IsMultiUse = false)
114 : IntermediateStore(Store), StartValue(Start), LoopExitInstr(Exit),
115 Kind(K), FMF(FMF), ExactFPMathInst(ExactFP), RecurrenceType(RT),
116 PhiHasUsesOutsideReductionChain(IsMultiUse) {}
117
118 /// This POD struct holds information about a potential recurrence operation.
119 class InstDesc {
120 public:
121 InstDesc(bool IsRecur, Instruction *I, Instruction *ExactFP = nullptr)
122 : IsRecurrence(IsRecur), PatternLastInst(I),
123 RecKind(RecurKind::None), ExactFPMathInst(ExactFP) {}
124
125 InstDesc(Instruction *I, RecurKind K, Instruction *ExactFP = nullptr)
126 : IsRecurrence(true), PatternLastInst(I), RecKind(K),
127 ExactFPMathInst(ExactFP) {}
128
129 bool isRecurrence() const { return IsRecurrence; }
130
131 bool needsExactFPMath() const { return ExactFPMathInst != nullptr; }
132
133 Instruction *getExactFPMathInst() const { return ExactFPMathInst; }
134
135 RecurKind getRecKind() const { return RecKind; }
136
137 Instruction *getPatternInst() const { return PatternLastInst; }
138
139 private:
140 // Is this instruction a recurrence candidate.
141 bool IsRecurrence;
142 // The last instruction in a min/max pattern (select of the select(icmp())
143 // pattern), or the current recurrence instruction otherwise.
144 Instruction *PatternLastInst;
145 // If this is a min/max pattern.
146 RecurKind RecKind;
147 // Recurrence does not allow floating-point reassociation.
148 Instruction *ExactFPMathInst;
149 };
150
151 /// Returns a struct describing if the instruction 'I' can be a recurrence
152 /// variable of type 'Kind' for a Loop \p L and reduction PHI \p Phi.
153 /// If the recurrence is a min/max pattern of select(icmp()) this function
154 /// advances the instruction pointer 'I' from the compare instruction to the
155 /// select instruction and stores this pointer in 'PatternLastInst' member of
156 /// the returned struct.
157 LLVM_ABI static InstDesc isRecurrenceInstr(Loop *L, PHINode *Phi,
158 Instruction *I, RecurKind Kind,
159 InstDesc &Prev,
160 ScalarEvolution *SE);
161
162 /// Returns true if instruction I has multiple uses in Insts
165 unsigned MaxNumUses);
166
167 /// Returns true if all uses of the instruction I is within the Set.
168 LLVM_ABI static bool areAllUsesIn(Instruction *I,
170
171 /// Returns a struct describing whether the instruction is either a
172 /// Select(ICmp(A, B), X, Y), or
173 /// Select(FCmp(A, B), X, Y)
174 /// where one of (X, Y) is a loop invariant integer and the other is a PHI
175 /// value. \p Prev specifies the description of an already processed select
176 /// instruction, so its corresponding cmp can be matched to it.
177 LLVM_ABI static InstDesc isAnyOfPattern(Loop *Loop, PHINode *OrigPhi,
178 Instruction *I, InstDesc &Prev);
179
180 /// Returns a struct describing whether the instruction is either a
181 /// Select(ICmp(A, B), X, Y), or
182 /// Select(FCmp(A, B), X, Y)
183 /// where one of (X, Y) is an increasing (FindLastIV) or decreasing
184 /// (FindFirstIV) loop induction variable, or an arbitrary integer value
185 /// (FindLast), and the other is a PHI value.
186 LLVM_ABI static InstDesc isFindPattern(Loop *TheLoop, PHINode *OrigPhi,
188
189 /// Returns a struct describing if the instruction is a
190 /// Select(FCmp(X, Y), (Z = X op PHINode), PHINode) instruction pattern.
192
193 /// Returns the opcode corresponding to the RecurrenceKind.
194 LLVM_ABI static unsigned getOpcode(RecurKind Kind);
195
196 /// Returns true if Phi is a reduction of type Kind and adds it to the
197 /// RecurrenceDescriptor. If either \p DB is non-null or \p AC and \p DT are
198 /// non-null, the minimal bit width needed to compute the reduction will be
199 /// computed.
200 LLVM_ABI static bool
201 AddReductionVar(PHINode *Phi, RecurKind Kind, Loop *TheLoop,
202 RecurrenceDescriptor &RedDes, DemandedBits *DB = nullptr,
203 AssumptionCache *AC = nullptr, DominatorTree *DT = nullptr,
204 ScalarEvolution *SE = nullptr);
205
206 /// Returns true if Phi is a reduction in TheLoop. The RecurrenceDescriptor
207 /// is returned in RedDes. If either \p DB is non-null or \p AC and \p DT are
208 /// non-null, the minimal bit width needed to compute the reduction will be
209 /// computed. If \p SE is non-null, store instructions to loop invariant
210 /// addresses are processed.
211 LLVM_ABI static bool
212 isReductionPHI(PHINode *Phi, Loop *TheLoop, RecurrenceDescriptor &RedDes,
213 DemandedBits *DB = nullptr, AssumptionCache *AC = nullptr,
214 DominatorTree *DT = nullptr, ScalarEvolution *SE = nullptr);
215
216 /// Returns true if Phi is a fixed-order recurrence. A fixed-order recurrence
217 /// is a non-reduction recurrence relation in which the value of the
218 /// recurrence in the current loop iteration equals a value defined in a
219 /// previous iteration (e.g. if the value is defined in the previous
220 /// iteration, we refer to it as first-order recurrence, if it is defined in
221 /// the iteration before the previous, we refer to it as second-order
222 /// recurrence and so on). Note that this function optimistically assumes that
223 /// uses of the recurrence can be re-ordered if necessary and users need to
224 /// check and perform the re-ordering.
225 LLVM_ABI static bool isFixedOrderRecurrence(PHINode *Phi, Loop *TheLoop,
226 DominatorTree *DT);
227
228 RecurKind getRecurrenceKind() const { return Kind; }
229
230 unsigned getOpcode() const { return getOpcode(getRecurrenceKind()); }
231
232 FastMathFlags getFastMathFlags() const { return FMF; }
233
234 TrackingVH<Value> getRecurrenceStartValue() const { return StartValue; }
235
236 Instruction *getLoopExitInstr() const { return LoopExitInstr; }
237
238 /// Returns true if the recurrence has floating-point math that requires
239 /// precise (ordered) operations.
240 bool hasExactFPMath() const { return ExactFPMathInst != nullptr; }
241
242 /// Returns 1st non-reassociative FP instruction in the PHI node's use-chain.
243 Instruction *getExactFPMathInst() const { return ExactFPMathInst; }
244
245 /// Returns true if the recurrence kind is an integer kind.
247
248 /// Returns true if the recurrence kind is a floating point kind.
250
251 /// Returns true if the recurrence kind is for a sub operation.
252 LLVM_ABI static bool isSubRecurrenceKind(RecurKind Kind);
253
254 /// Returns true if the recurrence kind is an integer min/max kind.
256 return Kind == RecurKind::UMin || Kind == RecurKind::UMax ||
257 Kind == RecurKind::SMin || Kind == RecurKind::SMax;
258 }
259
260 /// Returns true if the recurrence kind is a floating-point minnum/maxnum
261 /// kind.
263 return Kind == RecurKind::FMinNum || Kind == RecurKind::FMaxNum;
264 }
265
266 /// Returns true if the recurrence kind is a floating-point min/max kind.
268 return Kind == RecurKind::FMin || Kind == RecurKind::FMax ||
269 Kind == RecurKind::FMinimum || Kind == RecurKind::FMaximum ||
272 }
273
274 /// Returns true if the recurrence kind is any min/max kind.
277 }
278
279 /// Returns true if the recurrence kind is of the form
280 /// select(cmp(),x,y) where one of (x,y) is loop invariant.
282 return Kind == RecurKind::AnyOf;
283 }
284
285 /// Returns true if the recurrence kind is of the form
286 /// select(cmp(),x,y) where one of (x,y) is a loop induction variable.
288 return Kind == RecurKind::FindIV;
289 }
290
291 /// Returns true if the recurrence kind is of the form
292 /// select(cmp(),x,y) where one of (x,y) is an arbitrary value and the
293 /// other is a recurrence.
295 return Kind == RecurKind::FindLast;
296 }
297
298 static bool isFindRecurrenceKind(RecurKind Kind) {
300 }
301
302 /// Returns the type of the recurrence. This type can be narrower than the
303 /// actual type of the Phi if the recurrence has been type-promoted.
304 Type *getRecurrenceType() const { return RecurrenceType; }
305
306 /// Returns a reference to the instructions used for type-promoting the
307 /// recurrence.
308 const SmallPtrSet<Instruction *, 8> &getCastInsts() const { return CastInsts; }
309
310 /// Returns the minimum width used by the recurrence in bits.
312 return MinWidthCastToRecurrenceType;
313 }
314
315 /// Returns true if all source operands of the recurrence are SExtInsts.
316 bool isSigned() const { return IsSigned; }
317
318 /// Expose an ordered FP reduction to the instance users.
319 bool isOrdered() const { return IsOrdered; }
320
321 /// Returns true if the reduction PHI has any uses outside the reduction
322 /// chain. This is relevant for min/max reductions that are part of a FindIV
323 /// pattern.
325 return PhiHasUsesOutsideReductionChain;
326 }
327
328 /// Attempts to find a chain of operations from Phi to LoopExitInst that can
329 /// be treated as a set of reductions instructions for in-loop reductions.
331 Loop *L) const;
332
333 /// Returns true if the instruction is a call to the llvm.fmuladd intrinsic.
335 return isa<IntrinsicInst>(I) &&
336 cast<IntrinsicInst>(I)->getIntrinsicID() == Intrinsic::fmuladd;
337 }
338
339 /// Reductions may store temporary or final result to an invariant address.
340 /// If there is such a store in the loop then, after successfull run of
341 /// AddReductionVar method, this field will be assigned the last met store.
343
344private:
345 // The starting value of the recurrence.
346 // It does not have to be zero!
347 TrackingVH<Value> StartValue;
348 // The instruction who's value is used outside the loop.
349 Instruction *LoopExitInstr = nullptr;
350 // The kind of the recurrence.
352 // The fast-math flags on the recurrent instructions. We propagate these
353 // fast-math flags into the vectorized FP instructions we generate.
354 FastMathFlags FMF;
355 // First instance of non-reassociative floating-point in the PHI's use-chain.
356 Instruction *ExactFPMathInst = nullptr;
357 // The type of the recurrence.
358 Type *RecurrenceType = nullptr;
359 // True if all source operands of the recurrence are SExtInsts.
360 bool IsSigned = false;
361 // True if this recurrence can be treated as an in-order reduction.
362 // Currently only a non-reassociative FAdd can be considered in-order,
363 // if it is also the only FAdd in the PHI's use chain.
364 bool IsOrdered = false;
365 // True if the reduction PHI has in-loop users outside the reduction chain.
366 // This is relevant for min/max reductions that are part of a FindIV pattern.
367 bool PhiHasUsesOutsideReductionChain = false;
368 // Instructions used for type-promoting the recurrence.
370 // The minimum width used by the recurrence.
371 unsigned MinWidthCastToRecurrenceType;
372};
373
374/// A struct for saving information about induction variables.
376public:
377 /// This enum represents the kinds of inductions that we support.
379 IK_NoInduction, ///< Not an induction variable.
380 IK_IntInduction, ///< Integer induction variable. Step = C.
381 IK_PtrInduction, ///< Pointer induction var. Step = C.
382 IK_FpInduction ///< Floating point induction variable.
383 };
384
385public:
386 /// Default constructor - creates an invalid induction.
388
389 /// Returns the canonical integer induction for type \p Ty with start = 0
390 /// and step = 1.
393
394 Value *getStartValue() const { return StartValue; }
395 InductionKind getKind() const { return IK; }
396 const SCEV *getStep() const { return Step; }
397 BinaryOperator *getInductionBinOp() const { return InductionBinOp; }
399
400 /// Returns true if \p Phi is an induction in the loop \p L. If \p Phi is an
401 /// induction, the induction descriptor \p D will contain the data describing
402 /// this induction. Since Induction Phis can only be present inside loop
403 /// headers, the function will assert if it is passed a Phi whose parent is
404 /// not the loop header. If by some other means the caller has a better SCEV
405 /// expression for \p Phi than the one returned by the ScalarEvolution
406 /// analysis, it can be passed through \p Expr. If the def-use chain
407 /// associated with the phi includes casts (that we know we can ignore
408 /// under proper runtime checks), they are passed through \p CastsToIgnore.
409 /// SCEV predicates checking potential overflow for \p Phi to be an induction,
410 /// if any, are passed via \p NoWrapPreds and recorded.
411 LLVM_ABI static bool
412 isInductionPHI(PHINode *Phi, const Loop *L, ScalarEvolution *SE,
414 ArrayRef<const SCEVPredicate *> NoWrapPreds = {},
415 const SCEV *Expr = nullptr,
416 SmallVectorImpl<Instruction *> *CastsToIgnore = nullptr);
417
418 /// Returns true if \p Phi is a floating point induction in the loop \p L.
419 /// If \p Phi is an induction, the induction descriptor \p D will contain
420 /// the data describing this induction.
421 LLVM_ABI static bool isFPInductionPHI(PHINode *Phi, const Loop *L,
422 ScalarEvolution *SE,
424
425 /// Returns true if \p Phi is a loop \p L induction, in the context associated
426 /// with the run-time predicate of PSE. If \p Assume is true, this can add
427 /// further SCEV predicates to \p PSE in order to prove that \p Phi is an
428 /// induction.
429 /// If \p Phi is an induction, \p D will contain the data describing this
430 /// induction.
431 LLVM_ABI static bool isInductionPHI(PHINode *Phi, const Loop *L,
432 PredicatedScalarEvolution &PSE,
434 bool Assume = false);
435
436 /// Returns floating-point induction operator that does not allow
437 /// reassociation (transforming the induction requires an override of normal
438 /// floating-point rules).
440 if (IK == IK_FpInduction && InductionBinOp &&
441 !InductionBinOp->hasAllowReassoc())
442 return InductionBinOp;
443 return nullptr;
444 }
445
446 /// Returns binary opcode of the induction operator.
448 return InductionBinOp ? InductionBinOp->getOpcode()
449 : Instruction::BinaryOpsEnd;
450 }
451
452 /// Returns an ArrayRef to the type cast instructions in the induction
453 /// update chain, that are redundant when guarded with a runtime
454 /// SCEV overflow check.
455 ArrayRef<Instruction *> getCastInsts() const { return RedundantCasts; }
456
457 /// Returns the SCEV predicates associated with this induction.
459 return NoWrapPredicates;
460 }
461
462private:
463 /// Private constructor - used by \c isInductionPHI and
464 /// \c getCanonicalIntInduction.
465 InductionDescriptor(Value *Start, InductionKind K, const SCEV *Step,
466 BinaryOperator *InductionBinOp = nullptr,
467 SmallVectorImpl<Instruction *> *Casts = nullptr,
468 ArrayRef<const SCEVPredicate *> NoWrapPreds = {});
469
470 /// Start value.
471 TrackingVH<Value> StartValue;
472 /// Induction kind.
473 InductionKind IK = IK_NoInduction;
474 /// Step value.
475 const SCEV *Step = nullptr;
476 // Instruction that advances induction variable.
477 BinaryOperator *InductionBinOp = nullptr;
478 // Instructions used for type-casts of the induction variable,
479 // that are redundant when guarded with a runtime SCEV overflow check.
480 SmallVector<Instruction *, 2> RedundantCasts;
481 // SCEV predicates checking overflow needed for this induction.
483};
484
485} // end namespace llvm
486
487#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.
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:155
Convenience struct for specifying and reasoning about fast-math flags.
Definition FMF.h:23
A struct for saving information about induction variables.
BinaryOperator * getInductionBinOp() const
InductionKind getKind() const
static LLVM_ABI InductionDescriptor getCanonicalIntInduction(Type *Ty, ScalarEvolution &SE)
Returns the canonical integer induction for type Ty with start = 0 and step = 1.
const SCEV * getStep() const
ArrayRef< const SCEVPredicate * > getNoWrapPredicates() const
Returns the SCEV predicates associated with this induction.
static LLVM_ABI bool isInductionPHI(PHINode *Phi, const Loop *L, ScalarEvolution *SE, InductionDescriptor &D, ArrayRef< const SCEVPredicate * > NoWrapPreds={}, const SCEV *Expr=nullptr, SmallVectorImpl< Instruction * > *CastsToIgnore=nullptr)
Returns true if Phi is an induction in the loop L.
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 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),...
static LLVM_ABI bool isSubRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is for a sub operation.
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 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 LLVM_ABI InstDesc isRecurrenceInstr(Loop *L, PHINode *Phi, Instruction *I, RecurKind Kind, InstDesc &Prev, ScalarEvolution *SE)
Returns a struct describing if the instruction 'I' can be a recurrence variable of type 'Kind' for a ...
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 bool AddReductionVar(PHINode *Phi, RecurKind Kind, Loop *TheLoop, 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 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 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 assumption made using SCEV expressions which can be checked at run-time.
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:46
LLVM Value Representation.
Definition Value.h:75
This is an optimization pass for GlobalISel generic memory operations.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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.
@ FSub
Subtraction of floats.
@ FAddChainWithSubs
A chain of fadds and fsubs.
@ 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.