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