LLVM 22.0.0git
ScalarEvolutionExpander.h
Go to the documentation of this file.
1//===---- llvm/Analysis/ScalarEvolutionExpander.h - SCEV Exprs --*- 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 defines the classes used to generate code from scalar expressions.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_TRANSFORMS_UTILS_SCALAREVOLUTIONEXPANDER_H
14#define LLVM_TRANSFORMS_UTILS_SCALAREVOLUTIONEXPANDER_H
15
16#include "llvm/ADT/DenseMap.h"
17#include "llvm/ADT/DenseSet.h"
23#include "llvm/IR/IRBuilder.h"
24#include "llvm/IR/ValueHandle.h"
28
29namespace llvm {
31
32/// struct for holding enough information to help calculate the cost of the
33/// given SCEV when expanded into IR.
35 explicit SCEVOperand(unsigned Opc, int Idx, const SCEV *S) :
37 /// LLVM instruction opcode that uses the operand.
38 unsigned ParentOpcode;
39 /// The use index of an expanded instruction.
41 /// The SCEV operand to be costed.
42 const SCEV* S;
43};
44
46 unsigned NUW : 1;
47 unsigned NSW : 1;
48 unsigned Exact : 1;
49 unsigned Disjoint : 1;
50 unsigned NNeg : 1;
51 unsigned SameSign : 1;
53
56};
57
58/// This class uses information about analyze scalars to rewrite expressions
59/// in canonical form.
60///
61/// Clients should create an instance of this class when rewriting is needed,
62/// and destroy it when finished to allow the release of the associated
63/// memory.
64class SCEVExpander : public SCEVVisitor<SCEVExpander, Value *> {
65 friend class SCEVExpanderCleaner;
66
68 const DataLayout &DL;
69
70 // New instructions receive a name to identify them with the current pass.
71 const char *IVName;
72
73 /// Indicates whether LCSSA phis should be created for inserted values.
74 bool PreserveLCSSA;
75
76 // InsertedExpressions caches Values for reuse, so must track RAUW.
78 InsertedExpressions;
79
80 // InsertedValues only flags inserted instructions so needs no RAUW.
81 DenseSet<AssertingVH<Value>> InsertedValues;
82 DenseSet<AssertingVH<Value>> InsertedPostIncValues;
83
84 /// Keep track of the existing IR values re-used during expansion.
85 /// FIXME: Ideally re-used instructions would not be added to
86 /// InsertedValues/InsertedPostIncValues.
87 SmallPtrSet<Value *, 16> ReusedValues;
88
89 /// Original flags of instructions for which they were modified. Used
90 /// by SCEVExpanderCleaner to undo changes.
92
93 // The induction variables generated.
94 SmallVector<WeakVH, 2> InsertedIVs;
95
96 /// A memoization of the "relevant" loop for a given SCEV.
98
99 /// Addrecs referring to any of the given loops are expanded in post-inc
100 /// mode. For example, expanding {1,+,1}<L> in post-inc mode returns the add
101 /// instruction that adds one to the phi for {0,+,1}<L>, as opposed to a new
102 /// phi starting at 1. This is only supported in non-canonical mode.
103 PostIncLoopSet PostIncLoops;
104
105 /// When this is non-null, addrecs expanded in the loop it indicates should
106 /// be inserted with increments at IVIncInsertPos.
107 const Loop *IVIncInsertLoop;
108
109 /// When expanding addrecs in the IVIncInsertLoop loop, insert the IV
110 /// increment at this position.
111 Instruction *IVIncInsertPos;
112
113 /// Phis that complete an IV chain. Reuse
115
116 /// When true, SCEVExpander tries to expand expressions in "canonical" form.
117 /// When false, expressions are expanded in a more literal form.
118 ///
119 /// In "canonical" form addrecs are expanded as arithmetic based on a
120 /// canonical induction variable. Note that CanonicalMode doesn't guarantee
121 /// that all expressions are expanded in "canonical" form. For some
122 /// expressions literal mode can be preferred.
123 bool CanonicalMode;
124
125 /// When invoked from LSR, the expander is in "strength reduction" mode. The
126 /// only difference is that phi's are only reused if they are already in
127 /// "expanded" form.
128 bool LSRMode;
129
130 /// When true, rewrite any divisors of UDiv expressions that may be 0 to
131 /// umax(Divisor, 1) to avoid introducing UB. If the divisor may be poison,
132 /// freeze it first.
133 bool SafeUDivMode = false;
134
136 BuilderType Builder;
137
138 // RAII object that stores the current insertion point and restores it when
139 // the object is destroyed. This includes the debug location. Duplicated
140 // from InsertPointGuard to add SetInsertPoint() which is used to updated
141 // InsertPointGuards stack when insert points are moved during SCEV
142 // expansion.
143 class SCEVInsertPointGuard {
144 IRBuilderBase &Builder;
147 DebugLoc DbgLoc;
148 SCEVExpander *SE;
149
150 SCEVInsertPointGuard(const SCEVInsertPointGuard &) = delete;
151 SCEVInsertPointGuard &operator=(const SCEVInsertPointGuard &) = delete;
152
153 public:
154 SCEVInsertPointGuard(IRBuilderBase &B, SCEVExpander *SE)
155 : Builder(B), Block(B.GetInsertBlock()), Point(B.GetInsertPoint()),
156 DbgLoc(B.getCurrentDebugLocation()), SE(SE) {
157 SE->InsertPointGuards.push_back(this);
158 }
159
160 ~SCEVInsertPointGuard() {
161 // These guards should always created/destroyed in FIFO order since they
162 // are used to guard lexically scoped blocks of code in
163 // ScalarEvolutionExpander.
164 assert(SE->InsertPointGuards.back() == this);
165 SE->InsertPointGuards.pop_back();
166 Builder.restoreIP(IRBuilderBase::InsertPoint(Block, Point));
167 Builder.SetCurrentDebugLocation(DbgLoc);
168 }
169
170 BasicBlock::iterator GetInsertPoint() const { return Point; }
171 void SetInsertPoint(BasicBlock::iterator I) { Point = I; }
172 };
173
174 /// Stack of pointers to saved insert points, used to keep insert points
175 /// consistent when instructions are moved.
177
178#if LLVM_ENABLE_ABI_BREAKING_CHECKS
179 const char *DebugType;
180#endif
181
182 friend struct SCEVVisitor<SCEVExpander, Value *>;
183
184public:
185 /// Construct a SCEVExpander in "canonical" mode.
187 const char *name, bool PreserveLCSSA = true)
188 : SE(se), DL(DL), IVName(name), PreserveLCSSA(PreserveLCSSA),
189 IVIncInsertLoop(nullptr), IVIncInsertPos(nullptr), CanonicalMode(true),
190 LSRMode(false),
191 Builder(se.getContext(), InstSimplifyFolder(DL),
193 [this](Instruction *I) { rememberInstruction(I); })) {
194#if LLVM_ENABLE_ABI_BREAKING_CHECKS
195 DebugType = "";
196#endif
197 }
198
200 // Make sure the insert point guard stack is consistent.
201 assert(InsertPointGuards.empty());
202 }
203
204#if LLVM_ENABLE_ABI_BREAKING_CHECKS
205 void setDebugType(const char *s) { DebugType = s; }
206#endif
207
208 /// Erase the contents of the InsertedExpressions map so that users trying
209 /// to expand the same expression into multiple BasicBlocks or different
210 /// places within the same BasicBlock can do so.
211 void clear() {
212 InsertedExpressions.clear();
213 InsertedValues.clear();
214 InsertedPostIncValues.clear();
215 ReusedValues.clear();
216 OrigFlags.clear();
217 ChainedPhis.clear();
218 InsertedIVs.clear();
219 }
220
221 ScalarEvolution *getSE() { return &SE; }
222 const SmallVectorImpl<WeakVH> &getInsertedIVs() const { return InsertedIVs; }
223
224 /// Return a vector containing all instructions inserted during expansion.
227 for (const auto &VH : InsertedValues) {
228 Value *V = VH;
229 if (ReusedValues.contains(V))
230 continue;
231 if (auto *Inst = dyn_cast<Instruction>(V))
232 Result.push_back(Inst);
233 }
234 for (const auto &VH : InsertedPostIncValues) {
235 Value *V = VH;
236 if (ReusedValues.contains(V))
237 continue;
238 if (auto *Inst = dyn_cast<Instruction>(V))
239 Result.push_back(Inst);
240 }
241
242 return Result;
243 }
244
245 /// Return true for expressions that can't be evaluated at runtime
246 /// within given \b Budget.
247 ///
248 /// \p At is a parameter which specifies point in code where user is going to
249 /// expand these expressions. Sometimes this knowledge can lead to
250 /// a less pessimistic cost estimation.
252 unsigned Budget, const TargetTransformInfo *TTI,
253 const Instruction *At) {
254 assert(TTI && "This function requires TTI to be provided.");
255 assert(At && "This function requires At instruction to be provided.");
256 if (!TTI) // In assert-less builds, avoid crashing
257 return true; // by always claiming to be high-cost.
261 unsigned ScaledBudget = Budget * TargetTransformInfo::TCC_Basic;
262 for (auto *Expr : Exprs)
263 Worklist.emplace_back(-1, -1, Expr);
264 while (!Worklist.empty()) {
265 const SCEVOperand WorkItem = Worklist.pop_back_val();
266 if (isHighCostExpansionHelper(WorkItem, L, *At, Cost, ScaledBudget, *TTI,
267 Processed, Worklist))
268 return true;
269 }
270 assert(Cost <= ScaledBudget && "Should have returned from inner loop.");
271 return false;
272 }
273
274 /// Return the induction variable increment's IV operand.
276 getIVIncOperand(Instruction *IncV, Instruction *InsertPos, bool allowScale);
277
278 /// Utility for hoisting \p IncV (with all subexpressions requried for its
279 /// computation) before \p InsertPos. If \p RecomputePoisonFlags is set, drops
280 /// all poison-generating flags from instructions being hoisted and tries to
281 /// re-infer them in the new location. It should be used when we are going to
282 /// introduce a new use in the new position that didn't exist before, and may
283 /// trigger new UB in case of poison.
284 LLVM_ABI bool hoistIVInc(Instruction *IncV, Instruction *InsertPos,
285 bool RecomputePoisonFlags = false);
286
287 /// Return true if both increments directly increment the corresponding IV PHI
288 /// nodes and have the same opcode. It is not safe to re-use the flags from
289 /// the original increment, if it is more complex and SCEV expansion may have
290 /// yielded a more simplified wider increment.
292 PHINode *WidePhi,
293 Instruction *OrigInc,
294 Instruction *WideInc);
295
296 /// replace congruent phis with their most canonical representative. Return
297 /// the number of phis eliminated.
298 LLVM_ABI unsigned
301 const TargetTransformInfo *TTI = nullptr);
302
303 /// Return true if the given expression is safe to expand in the sense that
304 /// all materialized values are safe to speculate anywhere their operands are
305 /// defined, and the expander is capable of expanding the expression.
306 LLVM_ABI bool isSafeToExpand(const SCEV *S) const;
307
308 /// Return true if the given expression is safe to expand in the sense that
309 /// all materialized values are defined and safe to speculate at the specified
310 /// location and their operands are defined at this location.
311 LLVM_ABI bool isSafeToExpandAt(const SCEV *S,
312 const Instruction *InsertionPoint) const;
313
314 /// Insert code to directly compute the specified SCEV expression into the
315 /// program. The code is inserted into the specified block.
316 LLVM_ABI Value *expandCodeFor(const SCEV *SH, Type *Ty,
319 return expandCodeFor(SH, Ty, I->getIterator());
320 }
321
322 /// Insert code to directly compute the specified SCEV expression into the
323 /// program. The code is inserted into the SCEVExpander's current
324 /// insertion point. If a type is specified, the result will be expanded to
325 /// have that type, with a cast if necessary.
326 LLVM_ABI Value *expandCodeFor(const SCEV *SH, Type *Ty = nullptr);
327
328 /// Generates a code sequence that evaluates this predicate. The inserted
329 /// instructions will be at position \p Loc. The result will be of type i1
330 /// and will have a value of 0 when the predicate is false and 1 otherwise.
332 Instruction *Loc);
333
334 /// A specialized variant of expandCodeForPredicate, handling the case when
335 /// we are expanding code for a SCEVComparePredicate.
337 Instruction *Loc);
338
339 /// Generates code that evaluates if the \p AR expression will overflow.
341 Instruction *Loc, bool Signed);
342
343 /// A specialized variant of expandCodeForPredicate, handling the case when
344 /// we are expanding code for a SCEVWrapPredicate.
346 Instruction *Loc);
347
348 /// A specialized variant of expandCodeForPredicate, handling the case when
349 /// we are expanding code for a SCEVUnionPredicate.
351 Instruction *Loc);
352
353 /// Set the current IV increment loop and position.
354 void setIVIncInsertPos(const Loop *L, Instruction *Pos) {
355 assert(!CanonicalMode &&
356 "IV increment positions are not supported in CanonicalMode");
357 IVIncInsertLoop = L;
358 IVIncInsertPos = Pos;
359 }
360
361 /// Enable post-inc expansion for addrecs referring to the given
362 /// loops. Post-inc expansion is only supported in non-canonical mode.
363 void setPostInc(const PostIncLoopSet &L) {
364 assert(!CanonicalMode &&
365 "Post-inc expansion is not supported in CanonicalMode");
366 PostIncLoops = L;
367 }
368
369 /// Disable all post-inc expansion.
371 PostIncLoops.clear();
372
373 // When we change the post-inc loop set, cached expansions may no
374 // longer be valid.
375 InsertedPostIncValues.clear();
376 }
377
378 /// Disable the behavior of expanding expressions in canonical form rather
379 /// than in a more literal form. Non-canonical mode is useful for late
380 /// optimization passes.
381 void disableCanonicalMode() { CanonicalMode = false; }
382
383 void enableLSRMode() { LSRMode = true; }
384
385 /// Set the current insertion point. This is useful if multiple calls to
386 /// expandCodeFor() are going to be made with the same insert point and the
387 /// insert point may be moved during one of the expansions (e.g. if the
388 /// insert point is not a block terminator).
390 assert(IP);
391 Builder.SetInsertPoint(IP);
392 }
393
395 Builder.SetInsertPoint(IP->getParent(), IP);
396 }
397
398 /// Clear the current insertion point. This is useful if the instruction
399 /// that had been serving as the insertion point may have been deleted.
401
402 /// Set location information used by debugging information.
404 Builder.SetCurrentDebugLocation(std::move(L));
405 }
406
407 /// Get location information used by debugging information.
409 return Builder.getCurrentDebugLocation();
410 }
411
412 /// Return true if the specified instruction was inserted by the code
413 /// rewriter. If so, the client should not modify the instruction. Note that
414 /// this also includes instructions re-used during expansion.
416 return InsertedValues.count(I) || InsertedPostIncValues.count(I);
417 }
418
419 void setChainedPhi(PHINode *PN) { ChainedPhis.insert(PN); }
420
421 /// Determine whether there is an existing expansion of S that can be reused.
422 /// This is used to check whether S can be expanded cheaply.
423 ///
424 /// L is a hint which tells in which loop to look for the suitable value.
425 ///
426 /// Note that this function does not perform an exhaustive search. I.e if it
427 /// didn't find any value it does not mean that there is no such value.
429 const Instruction *At, Loop *L);
430
431 /// Returns a suitable insert point after \p I, that dominates \p
432 /// MustDominate. Skips instructions inserted by the expander.
434 findInsertPointAfter(Instruction *I, Instruction *MustDominate) const;
435
436private:
437 LLVMContext &getContext() const { return SE.getContext(); }
438
439 /// Recursive helper function for isHighCostExpansion.
440 LLVM_ABI bool
441 isHighCostExpansionHelper(const SCEVOperand &WorkItem, Loop *L,
442 const Instruction &At, InstructionCost &Cost,
443 unsigned Budget, const TargetTransformInfo &TTI,
444 SmallPtrSetImpl<const SCEV *> &Processed,
445 SmallVectorImpl<SCEVOperand> &Worklist);
446
447 /// Insert the specified binary operator, doing a small amount of work to
448 /// avoid inserting an obviously redundant operation, and hoisting to an
449 /// outer loop when the opportunity is there and it is safe.
450 Value *InsertBinop(Instruction::BinaryOps Opcode, Value *LHS, Value *RHS,
451 SCEV::NoWrapFlags Flags, bool IsSafeToHoist);
452
453 /// We want to cast \p V. What would be the best place for such a cast?
454 BasicBlock::iterator GetOptimalInsertionPointForCastOf(Value *V) const;
455
456 /// Arrange for there to be a cast of V to Ty at IP, reusing an existing
457 /// cast if a suitable one exists, moving an existing cast if a suitable one
458 /// exists but isn't in the right place, or creating a new one.
459 Value *ReuseOrCreateCast(Value *V, Type *Ty, Instruction::CastOps Op,
461
462 /// Insert a cast of V to the specified type, which must be possible with a
463 /// noop cast, doing what we can to share the casts.
464 Value *InsertNoopCastOfTo(Value *V, Type *Ty);
465
466 /// Expand a SCEVAddExpr with a pointer type into a GEP instead of using
467 /// ptrtoint+arithmetic+inttoptr.
468 Value *expandAddToGEP(const SCEV *Op, Value *V, SCEV::NoWrapFlags Flags);
469
470 /// Find a previous Value in ExprValueMap for expand.
471 /// DropPoisonGeneratingInsts is populated with instructions for which
472 /// poison-generating flags must be dropped if the value is reused.
473 Value *FindValueInExprValueMap(
474 const SCEV *S, const Instruction *InsertPt,
475 SmallVectorImpl<Instruction *> &DropPoisonGeneratingInsts);
476
477 LLVM_ABI Value *expand(const SCEV *S);
478 Value *expand(const SCEV *S, BasicBlock::iterator I) {
480 return expand(S);
481 }
482 Value *expand(const SCEV *S, Instruction *I) {
484 return expand(S);
485 }
486
487 /// Determine the most "relevant" loop for the given SCEV.
488 const Loop *getRelevantLoop(const SCEV *);
489
490 Value *expandMinMaxExpr(const SCEVNAryExpr *S, Intrinsic::ID IntrinID,
491 Twine Name, bool IsSequential = false);
492
493 Value *visitConstant(const SCEVConstant *S) { return S->getValue(); }
494
495 Value *visitVScale(const SCEVVScale *S);
496
497 Value *visitPtrToIntExpr(const SCEVPtrToIntExpr *S);
498
499 Value *visitTruncateExpr(const SCEVTruncateExpr *S);
500
501 Value *visitZeroExtendExpr(const SCEVZeroExtendExpr *S);
502
503 Value *visitSignExtendExpr(const SCEVSignExtendExpr *S);
504
505 Value *visitAddExpr(const SCEVAddExpr *S);
506
507 Value *visitMulExpr(const SCEVMulExpr *S);
508
509 Value *visitUDivExpr(const SCEVUDivExpr *S);
510
511 Value *visitAddRecExpr(const SCEVAddRecExpr *S);
512
513 Value *visitSMaxExpr(const SCEVSMaxExpr *S);
514
515 Value *visitUMaxExpr(const SCEVUMaxExpr *S);
516
517 Value *visitSMinExpr(const SCEVSMinExpr *S);
518
519 Value *visitUMinExpr(const SCEVUMinExpr *S);
520
521 Value *visitSequentialUMinExpr(const SCEVSequentialUMinExpr *S);
522
523 Value *visitUnknown(const SCEVUnknown *S) { return S->getValue(); }
524
525 LLVM_ABI void rememberInstruction(Value *I);
526
527 void rememberFlags(Instruction *I);
528
529 bool isNormalAddRecExprPHI(PHINode *PN, Instruction *IncV, const Loop *L);
530
531 bool isExpandedAddRecExprPHI(PHINode *PN, Instruction *IncV, const Loop *L);
532
533 Value *tryToReuseLCSSAPhi(const SCEVAddRecExpr *S);
534 Value *expandAddRecExprLiterally(const SCEVAddRecExpr *);
535 PHINode *getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
536 const Loop *L, Type *&TruncTy,
537 bool &InvertStep);
538 Value *expandIVInc(PHINode *PN, Value *StepV, const Loop *L,
539 bool useSubtract);
540
541 void fixupInsertPoints(Instruction *I);
542
543 /// Create LCSSA PHIs for \p V, if it is required for uses at the Builder's
544 /// current insertion point.
545 Value *fixupLCSSAFormFor(Value *V);
546
547 /// Replace congruent phi increments with their most canonical representative.
548 /// May swap \p Phi and \p OrigPhi, if \p Phi is more canonical, due to its
549 /// increment.
550 void replaceCongruentIVInc(PHINode *&Phi, PHINode *&OrigPhi, Loop *L,
551 const DominatorTree *DT,
552 SmallVectorImpl<WeakTrackingVH> &DeadInsts);
553};
554
555/// Helper to remove instructions inserted during SCEV expansion, unless they
556/// are marked as used.
558 SCEVExpander &Expander;
559
560 /// Indicates whether the result of the expansion is used. If false, the
561 /// instructions added during expansion are removed.
562 bool ResultUsed;
563
564public:
566 : Expander(Expander), ResultUsed(false) {}
567
569
570 /// Indicate that the result of the expansion is used.
571 void markResultUsed() { ResultUsed = true; }
572
573 LLVM_ABI void cleanup();
574};
575} // namespace llvm
576
577#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
RelocType Type
Definition: COFFYAML.cpp:410
#define LLVM_ABI
Definition: Compiler.h:213
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
std::string Name
static Expected< BitVector > expand(StringRef S, StringRef Original)
Definition: GlobPattern.cpp:21
This file defines an InstructionCost class that is used when calculating the cost of an instruction,...
#define I(x, y, z)
Definition: MD5.cpp:58
#define P(N)
static const char * name
Definition: SMEABIPass.cpp:52
This file defines the SmallVector class.
This pass exposes codegen information to IR-level passes.
Value * RHS
Value * LHS
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Value handle that asserts if the Value is deleted.
Definition: ValueHandle.h:265
InstListType::iterator iterator
Instruction iterators...
Definition: BasicBlock.h:170
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
A debug info location.
Definition: DebugLoc.h:124
Implements a dense probed hash-table based set.
Definition: DenseSet.h:263
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:165
Represents flags for the getelementptr instruction/expression.
InsertPoint - A saved insertion point.
Definition: IRBuilder.h:291
Common base class shared among various IRBuilders.
Definition: IRBuilder.h:114
void SetCurrentDebugLocation(DebugLoc L)
Set location information used by debugging information.
Definition: IRBuilder.h:247
LLVM_ABI DebugLoc getCurrentDebugLocation() const
Get location information used by debugging information.
Definition: IRBuilder.cpp:63
void ClearInsertionPoint()
Clear the insertion point: created instructions will not be inserted into a block.
Definition: IRBuilder.h:196
void restoreIP(InsertPoint IP)
Sets the current insert point to a previously-saved location.
Definition: IRBuilder.h:323
void SetInsertPoint(BasicBlock *TheBB)
This specifies that created instructions should be appended to the end of the specified block.
Definition: IRBuilder.h:207
Provides an 'InsertHelper' that calls a user-provided callback after performing the default insertion...
Definition: IRBuilder.h:75
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition: IRBuilder.h:2780
InstSimplifyFolder - Use InstructionSimplify to fold operations to existing values.
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:68
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:40
This node represents a polynomial recurrence on the trip count of the specified loop.
This class represents an assumption that the expression LHS Pred RHS evaluates to true,...
Helper to remove instructions inserted during SCEV expansion, unless they are marked as used.
SCEVExpanderCleaner(SCEVExpander &Expander)
void markResultUsed()
Indicate that the result of the expansion is used.
This class uses information about analyze scalars to rewrite expressions in canonical form.
LLVM_ABI Value * generateOverflowCheck(const SCEVAddRecExpr *AR, Instruction *Loc, bool Signed)
Generates code that evaluates if the AR expression will overflow.
LLVM_ABI bool hasRelatedExistingExpansion(const SCEV *S, const Instruction *At, Loop *L)
Determine whether there is an existing expansion of S that can be reused.
SmallVector< Instruction *, 32 > getAllInsertedInstructions() const
Return a vector containing all instructions inserted during expansion.
void setChainedPhi(PHINode *PN)
LLVM_ABI bool isSafeToExpand(const SCEV *S) const
Return true if the given expression is safe to expand in the sense that all materialized values are s...
void setInsertPoint(BasicBlock::iterator IP)
bool isHighCostExpansion(ArrayRef< const SCEV * > Exprs, Loop *L, unsigned Budget, const TargetTransformInfo *TTI, const Instruction *At)
Return true for expressions that can't be evaluated at runtime within given Budget.
LLVM_ABI bool isSafeToExpandAt(const SCEV *S, const Instruction *InsertionPoint) const
Return true if the given expression is safe to expand in the sense that all materialized values are d...
ScalarEvolution * getSE()
LLVM_ABI unsigned replaceCongruentIVs(Loop *L, const DominatorTree *DT, SmallVectorImpl< WeakTrackingVH > &DeadInsts, const TargetTransformInfo *TTI=nullptr)
replace congruent phis with their most canonical representative.
void clearInsertPoint()
Clear the current insertion point.
void clearPostInc()
Disable all post-inc expansion.
SCEVExpander(ScalarEvolution &se, const DataLayout &DL, const char *name, bool PreserveLCSSA=true)
Construct a SCEVExpander in "canonical" mode.
LLVM_ABI Value * expandUnionPredicate(const SCEVUnionPredicate *Pred, Instruction *Loc)
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a S...
LLVM_ABI bool hoistIVInc(Instruction *IncV, Instruction *InsertPos, bool RecomputePoisonFlags=false)
Utility for hoisting IncV (with all subexpressions requried for its computation) before InsertPos.
void clear()
Erase the contents of the InsertedExpressions map so that users trying to expand the same expression ...
bool isInsertedInstruction(Instruction *I) const
Return true if the specified instruction was inserted by the code rewriter.
LLVM_ABI Value * expandCodeForPredicate(const SCEVPredicate *Pred, Instruction *Loc)
Generates a code sequence that evaluates this predicate.
void setPostInc(const PostIncLoopSet &L)
Enable post-inc expansion for addrecs referring to the given loops.
static LLVM_ABI bool canReuseFlagsFromOriginalIVInc(PHINode *OrigPhi, PHINode *WidePhi, Instruction *OrigInc, Instruction *WideInc)
Return true if both increments directly increment the corresponding IV PHI nodes and have the same op...
DebugLoc getCurrentDebugLocation() const
Get location information used by debugging information.
void SetCurrentDebugLocation(DebugLoc L)
Set location information used by debugging information.
LLVM_ABI Value * expandComparePredicate(const SCEVComparePredicate *Pred, Instruction *Loc)
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a S...
void setIVIncInsertPos(const Loop *L, Instruction *Pos)
Set the current IV increment loop and position.
const SmallVectorImpl< WeakVH > & getInsertedIVs() const
LLVM_ABI Value * expandCodeFor(const SCEV *SH, Type *Ty, BasicBlock::iterator I)
Insert code to directly compute the specified SCEV expression into the program.
void disableCanonicalMode()
Disable the behavior of expanding expressions in canonical form rather than in a more literal form.
LLVM_ABI Value * expandWrapPredicate(const SCEVWrapPredicate *P, Instruction *Loc)
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a S...
Value * expandCodeFor(const SCEV *SH, Type *Ty, Instruction *I)
LLVM_ABI Instruction * getIVIncOperand(Instruction *IncV, Instruction *InsertPos, bool allowScale)
Return the induction variable increment's IV operand.
LLVM_ABI BasicBlock::iterator findInsertPointAfter(Instruction *I, Instruction *MustDominate) const
Returns a suitable insert point after I, that dominates MustDominate.
void setInsertPoint(Instruction *IP)
Set the current insertion point.
This class represents an assumption made using SCEV expressions which can be checked at run-time.
This class represents a composition of other SCEV predicates, and is the class that most clients will...
This class represents an assumption made on an AddRec expression.
This class represents an analyzed expression in the program.
NoWrapFlags
NoWrapFlags are bitfield indices into SubclassData.
The main scalar evolution driver.
bool contains(ConstPtrType Ptr) const
Definition: SmallPtrSet.h:476
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
Definition: SmallPtrSet.h:541
bool empty() const
Definition: SmallVector.h:82
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: SmallVector.h:574
reference emplace_back(ArgTypes &&... Args)
Definition: SmallVector.h:938
void push_back(const T &Elt)
Definition: SmallVector.h:414
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
This pass provides access to the codegen interfaces that are needed for IR-level transformations.
@ TCC_Basic
The cost of a typical 'add' instruction.
Value handle that tracks a Value across RAUW.
Definition: ValueHandle.h:332
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
std::pair< iterator, bool > insert(const ValueT &V)
Definition: DenseSet.h:194
size_type count(const_arg_type_t< ValueT > V) const
Return 1 if the specified key is in the set, 0 otherwise.
Definition: DenseSet.h:174
template class LLVM_TEMPLATE_ABI opt< unsigned >
Definition: CommandLine.cpp:82
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
LLVM_ABI cl::opt< unsigned > SCEVCheapExpansionBudget
TargetTransformInfo TTI
DWARFExpression::Operation Op
InstructionCost Cost
LLVM_ABI void apply(Instruction *I)
struct for holding enough information to help calculate the cost of the given SCEV when expanded into...
const SCEV * S
The SCEV operand to be costed.
unsigned ParentOpcode
LLVM instruction opcode that uses the operand.
SCEVOperand(unsigned Opc, int Idx, const SCEV *S)
int OperandIdx
The use index of an expanded instruction.
This class defines a simple visitor class that may be used for various SCEV analysis purposes.