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