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