LLVM 22.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 FindFirstIVSMin, /// FindFirst reduction with select(icmp(),x,y) where one of
62 ///< (x,y) is a decreasing loop induction, and both x and y
63 ///< are integer type, producing a SMin reduction.
64 FindFirstIVUMin, /// FindFirst reduction with select(icmp(),x,y) where one of
65 ///< (x,y) is a decreasing loop induction, and both x and y
66 ///< are integer type, producing a UMin reduction.
67 FindLastIVSMax, ///< FindLast reduction with select(cmp(),x,y) where one of
68 ///< (x,y) is increasing loop induction, and both x and y
69 ///< are integer type, producing a SMax reduction.
70 FindLastIVUMax, ///< FindLast reduction with select(cmp(),x,y) where one of
71 ///< (x,y) is increasing loop induction, and both x and y
72 ///< are integer type, producing a UMax reduction.
73 // clang-format on
74 // TODO: Any_of and FindLast reduction need not be restricted to integer type
75 // only.
76};
77
78/// The RecurrenceDescriptor is used to identify recurrences variables in a
79/// loop. Reduction is a special case of recurrence that has uses of the
80/// recurrence variable outside the loop. The method isReductionPHI identifies
81/// reductions that are basic recurrences.
82///
83/// Basic recurrences are defined as the summation, product, OR, AND, XOR, min,
84/// or max of a set of terms. For example: for(i=0; i<n; i++) { total +=
85/// array[i]; } is a summation of array elements. Basic recurrences are a
86/// special case of chains of recurrences (CR). See ScalarEvolution for CR
87/// references.
88
89/// This struct holds information about recurrence variables.
91public:
93
95 RecurKind K, FastMathFlags FMF, Instruction *ExactFP,
96 Type *RT, bool Signed, bool Ordered,
98 unsigned MinWidthCastToRecurTy,
99 bool PhiHasUsesOutsideReductionChain = false)
100 : IntermediateStore(Store), StartValue(Start), LoopExitInstr(Exit),
101 Kind(K), FMF(FMF), ExactFPMathInst(ExactFP), RecurrenceType(RT),
102 IsSigned(Signed), IsOrdered(Ordered),
103 PhiHasUsesOutsideReductionChain(PhiHasUsesOutsideReductionChain),
104 MinWidthCastToRecurrenceType(MinWidthCastToRecurTy) {
105 CastInsts.insert_range(CI);
106 assert(
107 (!PhiHasUsesOutsideReductionChain || isMinMaxRecurrenceKind(K)) &&
108 "Only min/max recurrences are allowed to have multiple uses currently");
109 }
110
111 /// This POD struct holds information about a potential recurrence operation.
112 class InstDesc {
113 public:
114 InstDesc(bool IsRecur, Instruction *I, Instruction *ExactFP = nullptr)
115 : IsRecurrence(IsRecur), PatternLastInst(I),
116 RecKind(RecurKind::None), ExactFPMathInst(ExactFP) {}
117
118 InstDesc(Instruction *I, RecurKind K, Instruction *ExactFP = nullptr)
119 : IsRecurrence(true), PatternLastInst(I), RecKind(K),
120 ExactFPMathInst(ExactFP) {}
121
122 bool isRecurrence() const { return IsRecurrence; }
123
124 bool needsExactFPMath() const { return ExactFPMathInst != nullptr; }
125
126 Instruction *getExactFPMathInst() const { return ExactFPMathInst; }
127
128 RecurKind getRecKind() const { return RecKind; }
129
130 Instruction *getPatternInst() const { return PatternLastInst; }
131
132 private:
133 // Is this instruction a recurrence candidate.
134 bool IsRecurrence;
135 // The last instruction in a min/max pattern (select of the select(icmp())
136 // pattern), or the current recurrence instruction otherwise.
137 Instruction *PatternLastInst;
138 // If this is a min/max pattern.
139 RecurKind RecKind;
140 // Recurrence does not allow floating-point reassociation.
141 Instruction *ExactFPMathInst;
142 };
143
144 /// Returns a struct describing if the instruction 'I' can be a recurrence
145 /// variable of type 'Kind' for a Loop \p L and reduction PHI \p Phi.
146 /// If the recurrence is a min/max pattern of select(icmp()) this function
147 /// advances the instruction pointer 'I' from the compare instruction to the
148 /// select instruction and stores this pointer in 'PatternLastInst' member of
149 /// the returned struct.
150 LLVM_ABI static InstDesc
152 InstDesc &Prev, FastMathFlags FuncFMF, ScalarEvolution *SE);
153
154 /// Returns true if instruction I has multiple uses in Insts
157 unsigned MaxNumUses);
158
159 /// Returns true if all uses of the instruction I is within the Set.
160 LLVM_ABI static bool areAllUsesIn(Instruction *I,
162
163 /// Returns a struct describing if the instruction is a llvm.(s/u)(min/max),
164 /// llvm.minnum/maxnum or a Select(ICmp(X, Y), X, Y) pair of instructions
165 /// corresponding to a min(X, Y) or max(X, Y), matching the recurrence kind \p
166 /// Kind. \p Prev specifies the description of an already processed select
167 /// instruction, so its corresponding cmp can be matched to it.
168 LLVM_ABI static InstDesc isMinMaxPattern(Instruction *I, RecurKind Kind,
169 const InstDesc &Prev);
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 (FindLast) or decreasing (FindFirst)
184 /// loop induction variable, and the other is a PHI value.
185 // TODO: Support non-monotonic variable. FindLast does not need be restricted
186 // to increasing loop induction variables.
187 LLVM_ABI static InstDesc isFindIVPattern(RecurKind Kind, Loop *TheLoop,
188 PHINode *OrigPhi, Instruction *I,
189 ScalarEvolution &SE);
190
191 /// Returns a struct describing if the instruction is a
192 /// Select(FCmp(X, Y), (Z = X op PHINode), PHINode) instruction pattern.
194
195 /// Returns the opcode corresponding to the RecurrenceKind.
196 LLVM_ABI static unsigned getOpcode(RecurKind Kind);
197
198 /// Returns true if Phi is a reduction of type Kind and adds it to the
199 /// RecurrenceDescriptor. If either \p DB is non-null or \p AC and \p DT are
200 /// non-null, the minimal bit width needed to compute the reduction will be
201 /// computed.
202 LLVM_ABI static bool
203 AddReductionVar(PHINode *Phi, RecurKind Kind, Loop *TheLoop,
204 FastMathFlags FuncFMF, RecurrenceDescriptor &RedDes,
205 DemandedBits *DB = nullptr, AssumptionCache *AC = nullptr,
206 DominatorTree *DT = nullptr, ScalarEvolution *SE = nullptr);
207
208 /// Returns true if Phi is a reduction in TheLoop. The RecurrenceDescriptor
209 /// is returned in RedDes. If either \p DB is non-null or \p AC and \p DT are
210 /// non-null, the minimal bit width needed to compute the reduction will be
211 /// computed. If \p SE is non-null, store instructions to loop invariant
212 /// addresses are processed.
213 LLVM_ABI static bool
214 isReductionPHI(PHINode *Phi, Loop *TheLoop, RecurrenceDescriptor &RedDes,
215 DemandedBits *DB = nullptr, AssumptionCache *AC = nullptr,
216 DominatorTree *DT = nullptr, ScalarEvolution *SE = nullptr);
217
218 /// Returns true if Phi is a fixed-order recurrence. A fixed-order recurrence
219 /// is a non-reduction recurrence relation in which the value of the
220 /// recurrence in the current loop iteration equals a value defined in a
221 /// previous iteration (e.g. if the value is defined in the previous
222 /// iteration, we refer to it as first-order recurrence, if it is defined in
223 /// the iteration before the previous, we refer to it as second-order
224 /// recurrence and so on). Note that this function optimistically assumes that
225 /// uses of the recurrence can be re-ordered if necessary and users need to
226 /// check and perform the re-ordering.
227 LLVM_ABI static bool isFixedOrderRecurrence(PHINode *Phi, Loop *TheLoop,
228 DominatorTree *DT);
229
230 RecurKind getRecurrenceKind() const { return Kind; }
231
232 unsigned getOpcode() const { return getOpcode(getRecurrenceKind()); }
233
234 FastMathFlags getFastMathFlags() const { return FMF; }
235
236 TrackingVH<Value> getRecurrenceStartValue() const { return StartValue; }
237
238 Instruction *getLoopExitInstr() const { return LoopExitInstr; }
239
240 /// Returns true if the recurrence has floating-point math that requires
241 /// precise (ordered) operations.
242 bool hasExactFPMath() const { return ExactFPMathInst != nullptr; }
243
244 /// Returns 1st non-reassociative FP instruction in the PHI node's use-chain.
245 Instruction *getExactFPMathInst() const { return ExactFPMathInst; }
246
247 /// Returns true if the recurrence kind is an integer kind.
249
250 /// Returns true if the recurrence kind is a floating point kind.
252
253 /// Returns true if the recurrence kind is an integer min/max kind.
255 return Kind == RecurKind::UMin || Kind == RecurKind::UMax ||
256 Kind == RecurKind::SMin || Kind == RecurKind::SMax;
257 }
258
259 /// Returns true if the recurrence kind is a floating-point minnum/maxnum
260 /// kind.
262 return Kind == RecurKind::FMinNum || Kind == RecurKind::FMaxNum;
263 }
264
265 /// Returns true if the recurrence kind is a floating-point min/max kind.
267 return Kind == RecurKind::FMin || Kind == RecurKind::FMax ||
268 Kind == RecurKind::FMinimum || Kind == RecurKind::FMaximum ||
271 }
272
273 /// Returns true if the recurrence kind is any min/max kind.
276 }
277
278 /// Returns true if the recurrence kind is of the form
279 /// select(cmp(),x,y) where one of (x,y) is loop invariant.
281 return Kind == RecurKind::AnyOf;
282 }
283
284 /// Returns true if the recurrence kind is of the form
285 /// select(cmp(),x,y) where one of (x,y) is decreasing loop induction.
287 return Kind == RecurKind::FindFirstIVSMin ||
289 }
290
291 /// Returns true if the recurrence kind is of the form
292 /// select(cmp(),x,y) where one of (x,y) is increasing loop induction.
294 return Kind == RecurKind::FindLastIVSMax ||
296 }
297
298 /// Returns true if recurrece kind is a signed redux kind.
300 return Kind == RecurKind::SMax || Kind == RecurKind::SMin ||
303 }
304
305 /// Returns true if the recurrence kind is of the form
306 /// select(cmp(),x,y) where one of (x,y) is an increasing or decreasing loop
307 /// induction.
309 return isFindFirstIVRecurrenceKind(Kind) ||
311 }
312
313 /// Returns the type of the recurrence. This type can be narrower than the
314 /// actual type of the Phi if the recurrence has been type-promoted.
315 Type *getRecurrenceType() const { return RecurrenceType; }
316
317 /// Returns the sentinel value for FindFirstIV & FindLastIV recurrences to
318 /// replace the start value.
320 Type *Ty = StartValue->getType();
321 unsigned BW = Ty->getIntegerBitWidth();
322 if (isFindLastIVRecurrenceKind(Kind)) {
323 return ConstantInt::get(Ty, isSignedRecurrenceKind(Kind)
325 : APInt::getMinValue(BW));
326 }
327 return ConstantInt::get(Ty, isSignedRecurrenceKind(Kind)
329 : APInt::getMaxValue(BW));
330 }
331
332 /// Returns a reference to the instructions used for type-promoting the
333 /// recurrence.
334 const SmallPtrSet<Instruction *, 8> &getCastInsts() const { return CastInsts; }
335
336 /// Returns the minimum width used by the recurrence in bits.
338 return MinWidthCastToRecurrenceType;
339 }
340
341 /// Returns true if all source operands of the recurrence are SExtInsts.
342 bool isSigned() const { return IsSigned; }
343
344 /// Expose an ordered FP reduction to the instance users.
345 bool isOrdered() const { return IsOrdered; }
346
347 /// Returns true if the reduction PHI has any uses outside the reduction
348 /// chain. This is relevant for min/max reductions that are part of a
349 /// FindLastIV pattern.
351 return PhiHasUsesOutsideReductionChain;
352 }
353
354 /// Attempts to find a chain of operations from Phi to LoopExitInst that can
355 /// be treated as a set of reductions instructions for in-loop reductions.
357 Loop *L) const;
358
359 /// Returns true if the instruction is a call to the llvm.fmuladd intrinsic.
361 return isa<IntrinsicInst>(I) &&
362 cast<IntrinsicInst>(I)->getIntrinsicID() == Intrinsic::fmuladd;
363 }
364
365 /// Reductions may store temporary or final result to an invariant address.
366 /// If there is such a store in the loop then, after successfull run of
367 /// AddReductionVar method, this field will be assigned the last met store.
369
370private:
371 // The starting value of the recurrence.
372 // It does not have to be zero!
373 TrackingVH<Value> StartValue;
374 // The instruction who's value is used outside the loop.
375 Instruction *LoopExitInstr = nullptr;
376 // The kind of the recurrence.
378 // The fast-math flags on the recurrent instructions. We propagate these
379 // fast-math flags into the vectorized FP instructions we generate.
380 FastMathFlags FMF;
381 // First instance of non-reassociative floating-point in the PHI's use-chain.
382 Instruction *ExactFPMathInst = nullptr;
383 // The type of the recurrence.
384 Type *RecurrenceType = nullptr;
385 // True if all source operands of the recurrence are SExtInsts.
386 bool IsSigned = false;
387 // True if this recurrence can be treated as an in-order reduction.
388 // Currently only a non-reassociative FAdd can be considered in-order,
389 // if it is also the only FAdd in the PHI's use chain.
390 bool IsOrdered = false;
391 // True if the reduction PHI has in-loop users outside the reduction chain.
392 // This is relevant for min/max reductions that are part of a FindLastIV
393 // pattern.
394 bool PhiHasUsesOutsideReductionChain = false;
395 // Instructions used for type-promoting the recurrence.
397 // The minimum width used by the recurrence.
398 unsigned MinWidthCastToRecurrenceType;
399};
400
401/// A struct for saving information about induction variables.
403public:
404 /// This enum represents the kinds of inductions that we support.
406 IK_NoInduction, ///< Not an induction variable.
407 IK_IntInduction, ///< Integer induction variable. Step = C.
408 IK_PtrInduction, ///< Pointer induction var. Step = C.
409 IK_FpInduction ///< Floating point induction variable.
410 };
411
412public:
413 /// Default constructor - creates an invalid induction.
415
416 Value *getStartValue() const { return StartValue; }
417 InductionKind getKind() const { return IK; }
418 const SCEV *getStep() const { return Step; }
419 BinaryOperator *getInductionBinOp() const { return InductionBinOp; }
421
422 /// Returns true if \p Phi is an induction in the loop \p L. If \p Phi is an
423 /// induction, the induction descriptor \p D will contain the data describing
424 /// this induction. Since Induction Phis can only be present inside loop
425 /// headers, the function will assert if it is passed a Phi whose parent is
426 /// not the loop header. If by some other means the caller has a better SCEV
427 /// expression for \p Phi than the one returned by the ScalarEvolution
428 /// analysis, it can be passed through \p Expr. If the def-use chain
429 /// associated with the phi includes casts (that we know we can ignore
430 /// under proper runtime checks), they are passed through \p CastsToIgnore.
431 LLVM_ABI static bool
432 isInductionPHI(PHINode *Phi, const Loop *L, ScalarEvolution *SE,
433 InductionDescriptor &D, const SCEV *Expr = nullptr,
434 SmallVectorImpl<Instruction *> *CastsToIgnore = nullptr);
435
436 /// Returns true if \p Phi is a floating point induction in the loop \p L.
437 /// If \p Phi is an induction, the induction descriptor \p D will contain
438 /// the data describing this induction.
439 LLVM_ABI static bool isFPInductionPHI(PHINode *Phi, const Loop *L,
440 ScalarEvolution *SE,
442
443 /// Returns true if \p Phi is a loop \p L induction, in the context associated
444 /// with the run-time predicate of PSE. If \p Assume is true, this can add
445 /// further SCEV predicates to \p PSE in order to prove that \p Phi is an
446 /// induction.
447 /// If \p Phi is an induction, \p D will contain the data describing this
448 /// induction.
449 LLVM_ABI static bool isInductionPHI(PHINode *Phi, const Loop *L,
452 bool Assume = false);
453
454 /// Returns floating-point induction operator that does not allow
455 /// reassociation (transforming the induction requires an override of normal
456 /// floating-point rules).
458 if (IK == IK_FpInduction && InductionBinOp &&
459 !InductionBinOp->hasAllowReassoc())
460 return InductionBinOp;
461 return nullptr;
462 }
463
464 /// Returns binary opcode of the induction operator.
466 return InductionBinOp ? InductionBinOp->getOpcode()
467 : Instruction::BinaryOpsEnd;
468 }
469
470 /// Returns an ArrayRef to the type cast instructions in the induction
471 /// update chain, that are redundant when guarded with a runtime
472 /// SCEV overflow check.
473 ArrayRef<Instruction *> getCastInsts() const { return RedundantCasts; }
474
475private:
476 /// Private constructor - used by \c isInductionPHI.
477 InductionDescriptor(Value *Start, InductionKind K, const SCEV *Step,
478 BinaryOperator *InductionBinOp = nullptr,
479 SmallVectorImpl<Instruction *> *Casts = nullptr);
480
481 /// Start value.
482 TrackingVH<Value> StartValue;
483 /// Induction kind.
484 InductionKind IK = IK_NoInduction;
485 /// Step value.
486 const SCEV *Step = nullptr;
487 // Instruction that advances induction variable.
488 BinaryOperator *InductionBinOp = nullptr;
489 // Instructions used for type-casts of the induction variable,
490 // that are redundant when guarded with a runtime SCEV overflow check.
491 SmallVector<Instruction *, 2> RedundantCasts;
492};
493
494} // end namespace llvm
495
496#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.
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:207
static APInt getSignedMaxValue(unsigned numBits)
Gets maximum signed value of APInt for a specific bit width.
Definition APInt.h:210
static APInt getMinValue(unsigned numBits)
Gets minimum unsigned value of APInt for a specific bit width.
Definition APInt.h:217
static APInt getSignedMinValue(unsigned numBits)
Gets minimum signed value of APInt for a specific bit width.
Definition APInt.h:220
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 isFindFirstIVRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
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.
static bool isSignedRecurrenceKind(RecurKind Kind)
Returns true if recurrece kind is a signed redux kind.
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.
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 bool isFindLastIVRecurrenceKind(RecurKind Kind)
Returns true if the recurrence kind is of the form select(cmp(),x,y) where one of (x,...
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 LLVM_ABI InstDesc isFindIVPattern(RecurKind Kind, 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 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 isMinMaxPattern(Instruction *I, RecurKind Kind, const InstDesc &Prev)
Returns a struct describing if the instruction is a llvm.
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.
Value * getSentinelValue() const
Returns the sentinel value for FindFirstIV & FindLastIV recurrences to replace the start value.
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_ABI unsigned getIntegerBitWidth() const
LLVM Value Representation.
Definition Value.h:75
This is an optimization pass for GlobalISel generic memory operations.
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.
@ FindLastIVUMax
FindLast reduction with select(cmp(),x,y) where one of (x,y) is increasing loop induction,...
@ FindFirstIVUMin
FindFirst reduction with select(icmp(),x,y) where one of (x,y) is a decreasing loop induction,...
@ FMinimum
FP min with llvm.minimum semantics.
@ FMaxNum
FP max with llvm.maxnum semantics including NaNs.
@ FindLastIVSMax
FindFirst reduction with select(icmp(),x,y) where one of (x,y) is a decreasing loop induction,...
@ 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.
@ 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.