LLVM 24.0.0git
ScalarEvolutionExpander.cpp
Go to the documentation of this file.
1//===- ScalarEvolutionExpander.cpp - Scalar Evolution Analysis ------------===//
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 contains the implementation of the scalar evolution expander,
10// which is used to generate the code corresponding to a given scalar evolution
11// expression.
12//
13//===----------------------------------------------------------------------===//
14
16#include "llvm/ADT/STLExtras.h"
17#include "llvm/ADT/ScopeExit.h"
23#include "llvm/IR/DataLayout.h"
24#include "llvm/IR/Dominators.h"
32
33#if LLVM_ENABLE_ABI_BREAKING_CHECKS
34#define SCEV_DEBUG_WITH_TYPE(TYPE, X) DEBUG_WITH_TYPE(TYPE, X)
35#else
36#define SCEV_DEBUG_WITH_TYPE(TYPE, X)
37#endif
38
39using namespace llvm;
40
42 "scev-cheap-expansion-budget", cl::Hidden, cl::init(4),
43 cl::desc("When performing SCEV expansion only if it is cheap to do, this "
44 "controls the budget that is considered cheap (default = 4)"));
45
46using namespace PatternMatch;
47using namespace SCEVPatternMatch;
48
50 NUW = false;
51 NSW = false;
52 Exact = false;
53 Disjoint = false;
54 NNeg = false;
55 SameSign = false;
57 if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(I)) {
58 NUW = OBO->hasNoUnsignedWrap();
59 NSW = OBO->hasNoSignedWrap();
60 }
61 if (auto *PEO = dyn_cast<PossiblyExactOperator>(I))
62 Exact = PEO->isExact();
63 if (auto *PDI = dyn_cast<PossiblyDisjointInst>(I))
64 Disjoint = PDI->isDisjoint();
65 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(I))
66 NNeg = PNI->hasNonNeg();
67 if (auto *TI = dyn_cast<TruncInst>(I)) {
68 NUW = TI->hasNoUnsignedWrap();
69 NSW = TI->hasNoSignedWrap();
70 }
72 GEPNW = GEP->getNoWrapFlags();
73 if (auto *ICmp = dyn_cast<ICmpInst>(I))
74 SameSign = ICmp->hasSameSign();
75}
76
79 I->setHasNoUnsignedWrap(NUW);
80 I->setHasNoSignedWrap(NSW);
81 }
83 I->setIsExact(Exact);
84 if (auto *PDI = dyn_cast<PossiblyDisjointInst>(I))
85 PDI->setIsDisjoint(Disjoint);
86 if (auto *PNI = dyn_cast<PossiblyNonNegInst>(I))
87 PNI->setNonNeg(NNeg);
88 if (isa<TruncInst>(I)) {
89 I->setHasNoUnsignedWrap(NUW);
90 I->setHasNoSignedWrap(NSW);
91 }
93 GEP->setNoWrapFlags(GEPNW);
94 if (auto *ICmp = dyn_cast<ICmpInst>(I))
95 ICmp->setSameSign(SameSign);
96}
97
98/// ReuseOrCreateCast - Arrange for there to be a cast of V to Ty at IP,
99/// reusing an existing cast if a suitable one (= dominating IP) exists, or
100/// creating a new one.
101Value *SCEVExpander::ReuseOrCreateCast(Value *V, Type *Ty,
104 // This function must be called with the builder having a valid insertion
105 // point. It doesn't need to be the actual IP where the uses of the returned
106 // cast will be added, but it must dominate such IP.
107 // We use this precondition to produce a cast that will dominate all its
108 // uses. In particular, this is crucial for the case where the builder's
109 // insertion point *is* the point where we were asked to put the cast.
110 // Since we don't know the builder's insertion point is actually
111 // where the uses will be added (only that it dominates it), we are
112 // not allowed to move it.
113 BasicBlock::iterator BIP = Builder.GetInsertPoint();
114
115 Value *Ret = nullptr;
116
117 if (!isa<Constant>(V)) {
118 // Check to see if there is already a cast!
119 for (User *U : V->users()) {
120 if (U->getType() != Ty)
121 continue;
123 if (!CI || CI->getOpcode() != Op)
124 continue;
125
126 // Found a suitable cast that is at IP or comes before IP. Use it. Note
127 // that the cast must also properly dominate the Builder's insertion
128 // point.
129 if (IP->getParent() == CI->getParent() && &*BIP != CI &&
130 (&*IP == CI || CI->comesBefore(&*IP))) {
131 Ret = CI;
132 break;
133 }
134 }
135 }
136
137 // Create a new cast.
138 if (!Ret) {
139 SCEVInsertPointGuard Guard(Builder, this);
140 Builder.SetInsertPoint(&*IP);
141 Ret = Builder.CreateCast(Op, V, Ty, V->getName());
142 }
143
144 // We assert at the end of the function since IP might point to an
145 // instruction with different dominance properties than a cast
146 // (an invoke for example) and not dominate BIP (but the cast does).
147 assert(!isa<Instruction>(Ret) ||
148 SE.DT.dominates(cast<Instruction>(Ret), &*BIP));
149
150 return Ret;
151}
152
155 Instruction *MustDominate) const {
157 if (auto MaybeIP = I->getInsertionPointAfterDef()) {
158 IP = *MaybeIP;
159 } else {
160 assert(SE.DT.dominates(I, MustDominate) &&
161 "instruction must dominate the insertion point");
162 IP = MustDominate->getIterator();
163 }
164
165 // Adjust insert point to be after instructions inserted by the expander, so
166 // we can re-use already inserted instructions. Avoid skipping past the
167 // original \p MustDominate, in case it is an inserted instruction.
168 while (isInsertedInstruction(&*IP) && &*IP != MustDominate)
169 ++IP;
170
171 return IP;
172}
173
175 SmallVector<Value *> WorkList;
176 SmallPtrSet<Value *, 8> DeletedValues;
178 while (!WorkList.empty()) {
179 Value *V = WorkList.pop_back_val();
180 if (DeletedValues.contains(V))
181 continue;
182 auto *I = dyn_cast<Instruction>(V);
183 if (!I || I == Root || !isInsertedInstruction(I) ||
185 continue;
186 append_range(WorkList, I->operands());
187 InsertedValues.erase(I);
188 InsertedPostIncValues.erase(I);
189 DeletedValues.insert(I);
190 I->eraseFromParent();
191 }
192}
193
195SCEVExpander::GetOptimalInsertionPointForCastOf(Value *V) const {
196 // Cast the argument at the beginning of the entry block, after
197 // any bitcasts of other arguments.
198 if (Argument *A = dyn_cast<Argument>(V)) {
199 BasicBlock::iterator IP = A->getParent()->getEntryBlock().begin();
200 while ((isa<BitCastInst>(IP) &&
201 isa<Argument>(cast<BitCastInst>(IP)->getOperand(0)) &&
202 cast<BitCastInst>(IP)->getOperand(0) != A))
203 ++IP;
204 return IP;
205 }
206
207 // Cast the instruction immediately after the instruction.
209 return findInsertPointAfter(I, &*Builder.GetInsertPoint());
210
211 // Otherwise, this must be some kind of a constant,
212 // so let's plop this cast into the function's entry block.
214 "Expected the cast argument to be a global/constant");
215 return Builder.GetInsertBlock()
216 ->getParent()
217 ->getEntryBlock()
218 .getFirstInsertionPt();
219}
220
221/// InsertNoopCastOfTo - Insert a cast of V to the specified type,
222/// which must be possible with a noop cast, doing what we can to share
223/// the casts.
224Value *SCEVExpander::InsertNoopCastOfTo(Value *V, Type *Ty) {
225 Instruction::CastOps Op = CastInst::getCastOpcode(V, false, Ty, false);
226 assert((Op == Instruction::BitCast ||
227 Op == Instruction::PtrToInt ||
228 Op == Instruction::IntToPtr) &&
229 "InsertNoopCastOfTo cannot perform non-noop casts!");
230 assert(SE.getTypeSizeInBits(V->getType()) == SE.getTypeSizeInBits(Ty) &&
231 "InsertNoopCastOfTo cannot change sizes!");
232
233 // inttoptr only works for integral pointers. For non-integral pointers, we
234 // can create a GEP on null with the integral value as index. Note that
235 // it is safe to use GEP of null instead of inttoptr here, because only
236 // expressions already based on a GEP of null should be converted to pointers
237 // during expansion.
238 if (Op == Instruction::IntToPtr) {
239 auto *PtrTy = cast<PointerType>(Ty);
240 if (DL.isNonIntegralPointerType(PtrTy))
241 return Builder.CreatePtrAdd(Constant::getNullValue(PtrTy), V, "scevgep");
242 }
243 // Short-circuit unnecessary bitcasts.
244 if (Op == Instruction::BitCast) {
245 if (V->getType() == Ty)
246 return V;
247 if (CastInst *CI = dyn_cast<CastInst>(V)) {
248 if (CI->getOperand(0)->getType() == Ty)
249 return CI->getOperand(0);
250 }
251 }
252 // Short-circuit unnecessary inttoptr<->ptrtoint casts.
253 if ((Op == Instruction::PtrToInt || Op == Instruction::IntToPtr) &&
254 SE.getTypeSizeInBits(Ty) == SE.getTypeSizeInBits(V->getType())) {
255 if (CastInst *CI = dyn_cast<CastInst>(V))
256 if ((CI->getOpcode() == Instruction::PtrToInt ||
257 CI->getOpcode() == Instruction::IntToPtr) &&
258 SE.getTypeSizeInBits(CI->getType()) ==
259 SE.getTypeSizeInBits(CI->getOperand(0)->getType()))
260 return CI->getOperand(0);
261 if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V))
262 if ((CE->getOpcode() == Instruction::PtrToInt ||
263 CE->getOpcode() == Instruction::IntToPtr) &&
264 SE.getTypeSizeInBits(CE->getType()) ==
265 SE.getTypeSizeInBits(CE->getOperand(0)->getType()))
266 return CE->getOperand(0);
267 }
268
269 // Fold a cast of a constant.
270 if (Constant *C = dyn_cast<Constant>(V))
271 return ConstantExpr::getCast(Op, C, Ty);
272
273 // Try to reuse existing cast, or insert one.
274 return ReuseOrCreateCast(V, Ty, Op, GetOptimalInsertionPointForCastOf(V));
275}
276
277/// InsertBinop - Insert the specified binary operator, doing a small amount
278/// of work to avoid inserting an obviously redundant operation, and hoisting
279/// to an outer loop when the opportunity is there and it is safe.
280Value *SCEVExpander::InsertBinop(Instruction::BinaryOps Opcode, Value *LHS,
281 Value *RHS, SCEVFlags Flags,
282 bool IsSafeToHoist) {
283 // Fold a binop with constant operands.
284 if (Constant *CLHS = dyn_cast<Constant>(LHS))
285 if (Constant *CRHS = dyn_cast<Constant>(RHS))
286 if (Constant *Res = ConstantFoldBinaryOpOperands(Opcode, CLHS, CRHS, DL))
287 return Res;
288
289 // Do a quick scan to see if we have this binop nearby. If so, reuse it.
290 unsigned ScanLimit = 6;
291 BasicBlock::iterator BlockBegin = Builder.GetInsertBlock()->begin();
292 // Scanning starts from the last instruction before the insertion point.
293 BasicBlock::iterator IP = Builder.GetInsertPoint();
294 if (IP != BlockBegin) {
295 --IP;
296 for (; ScanLimit; --IP, --ScanLimit) {
297 auto canGenerateIncompatiblePoison = [&Flags](Instruction *I) {
298 // Ensure that no-wrap flags match.
300 if (I->hasNoSignedWrap() != any(Flags & SCEV::FlagNSW))
301 return true;
302 if (I->hasNoUnsignedWrap() != any(Flags & SCEV::FlagNUW))
303 return true;
304 }
305 // Conservatively, do not use any instruction which has any of exact
306 // flags installed.
307 if (isa<PossiblyExactOperator>(I) && I->isExact())
308 return true;
309 return false;
310 };
311 if (IP->getOpcode() == (unsigned)Opcode && IP->getOperand(0) == LHS &&
312 IP->getOperand(1) == RHS && !canGenerateIncompatiblePoison(&*IP))
313 return &*IP;
314 if (IP == BlockBegin) break;
315 }
316 }
317
318 // Save the original insertion point so we can restore it when we're done.
319 DebugLoc Loc = Builder.GetInsertPoint()->getDebugLoc();
320 SCEVInsertPointGuard Guard(Builder, this);
321
322 if (IsSafeToHoist) {
323 // Move the insertion point out of as many loops as we can.
324 while (const Loop *L = SE.LI.getLoopFor(Builder.GetInsertBlock())) {
325 if (!L->isLoopInvariant(LHS) || !L->isLoopInvariant(RHS)) break;
326 BasicBlock *Preheader = L->getLoopPreheader();
327 if (!Preheader) break;
328
329 // Ok, move up a level.
330 Builder.SetInsertPoint(Preheader->getTerminator());
331 }
332 }
333
334 // If we haven't found this binop, insert it.
335 Builder.SetCurrentDebugLocation(Loc);
336 bool IsNUW = any(Flags & SCEV::FlagNUW);
337 bool IsNSW = any(Flags & SCEV::FlagNSW);
338 // Don't use folder when expanding post-inc rewrites in LSRMode to preserve
339 // the rewrites.
340 if (LSRMode && !PostIncLoops.empty() &&
341 all_of(PostIncLoops, [&](const Loop *L) {
342 return !L->contains(Builder.GetInsertBlock());
343 })) {
344 auto *BO = BinaryOperator::Create(Opcode, LHS, RHS);
345 if (IsNUW)
346 BO->setHasNoUnsignedWrap();
347 if (IsNSW)
348 BO->setHasNoSignedWrap();
349 return Builder.Insert(BO);
350 }
351 return Builder.CreateNoWrapBinOp(Opcode, LHS, RHS, IsNUW, IsNSW);
352}
353
354/// expandAddToGEP - Expand an addition expression with a pointer type into
355/// a GEP instead of using ptrtoint+arithmetic+inttoptr. This helps
356/// BasicAliasAnalysis and other passes analyze the result. See the rules
357/// for getelementptr vs. inttoptr in
358/// http://llvm.org/docs/LangRef.html#pointeraliasing
359/// for details.
360///
361/// Design note: The correctness of using getelementptr here depends on
362/// ScalarEvolution not recognizing inttoptr and ptrtoint operators, as
363/// they may introduce pointer arithmetic which may not be safely converted
364/// into getelementptr.
365///
366/// Design note: It might seem desirable for this function to be more
367/// loop-aware. If some of the indices are loop-invariant while others
368/// aren't, it might seem desirable to emit multiple GEPs, keeping the
369/// loop-invariant portions of the overall computation outside the loop.
370/// However, there are a few reasons this is not done here. Hoisting simple
371/// arithmetic is a low-level optimization that often isn't very
372/// important until late in the optimization process. In fact, passes
373/// like InstructionCombining will combine GEPs, even if it means
374/// pushing loop-invariant computation down into loops, so even if the
375/// GEPs were split here, the work would quickly be undone. The
376/// LoopStrengthReduction pass, which is usually run quite late (and
377/// after the last InstructionCombining pass), takes care of hoisting
378/// loop-invariant portions of expressions, after considering what
379/// can be folded using target addressing modes.
380///
381Value *SCEVExpander::expandAddToGEP(SCEVUse Offset, Value *V, SCEVFlags Flags) {
383 SE.DT.dominates(cast<Instruction>(V), &*Builder.GetInsertPoint()));
384
385 Value *Idx = expand(Offset);
386 GEPNoWrapFlags NW = any(Flags & SCEV::FlagNUW)
388 : GEPNoWrapFlags::none();
389
390 // Fold a GEP with constant operands.
391 if (Constant *CLHS = dyn_cast<Constant>(V))
392 if (Constant *CRHS = dyn_cast<Constant>(Idx))
393 return Builder.CreatePtrAdd(CLHS, CRHS, "", NW);
394
395 // Do a quick scan to see if we have this GEP nearby. If so, reuse it.
396 unsigned ScanLimit = 6;
397 BasicBlock::iterator BlockBegin = Builder.GetInsertBlock()->begin();
398 // Scanning starts from the last instruction before the insertion point.
399 BasicBlock::iterator IP = Builder.GetInsertPoint();
400 if (IP != BlockBegin) {
401 --IP;
402 for (; ScanLimit; --IP, --ScanLimit) {
403 if (auto *GEP = dyn_cast<GetElementPtrInst>(IP)) {
404 if (GEP->getPointerOperand() == V &&
405 GEP->getSourceElementType() == Builder.getInt8Ty() &&
406 GEP->getOperand(1) == Idx) {
407 rememberFlags(GEP);
408 GEP->setNoWrapFlags(GEP->getNoWrapFlags() & NW);
409 return &*IP;
410 }
411 }
412 if (IP == BlockBegin) break;
413 }
414 }
415
416 // Save the original insertion point so we can restore it when we're done.
417 SCEVInsertPointGuard Guard(Builder, this);
418
419 // Move the insertion point out of as many loops as we can.
420 while (const Loop *L = SE.LI.getLoopFor(Builder.GetInsertBlock())) {
421 if (!L->isLoopInvariant(V) || !L->isLoopInvariant(Idx)) break;
422 BasicBlock *Preheader = L->getLoopPreheader();
423 if (!Preheader) break;
424
425 // Ok, move up a level.
426 Builder.SetInsertPoint(Preheader->getTerminator());
427 }
428
429 // Emit a GEP.
430 return Builder.CreatePtrAdd(V, Idx, "scevgep", NW);
431}
432
433/// PickMostRelevantLoop - Given two loops pick the one that's most relevant for
434/// SCEV expansion. If they are nested, this is the most nested. If they are
435/// neighboring, pick the later.
436static const Loop *PickMostRelevantLoop(const Loop *A, const Loop *B,
437 DominatorTree &DT) {
438 if (!A) return B;
439 if (!B) return A;
440 if (A->contains(B)) return B;
441 if (B->contains(A)) return A;
442 if (DT.dominates(A->getHeader(), B->getHeader())) return B;
443 if (DT.dominates(B->getHeader(), A->getHeader())) return A;
444 return A; // Arbitrarily break the tie.
445}
446
447/// getRelevantLoop - Get the most relevant loop associated with the given
448/// expression, according to PickMostRelevantLoop.
449const Loop *SCEVExpander::getRelevantLoop(const SCEV *S) {
450 // Test whether we've already computed the most relevant loop for this SCEV.
451 auto Pair = RelevantLoops.try_emplace(S);
452 if (!Pair.second)
453 return Pair.first->second;
454
455 switch (S->getSCEVType()) {
456 case scConstant:
457 case scVScale:
458 return nullptr; // A constant has no relevant loops.
459 case scTruncate:
460 case scZeroExtend:
461 case scSignExtend:
462 case scPtrToAddr:
463 case scAddExpr:
464 case scMulExpr:
465 case scUDivExpr:
466 case scAddRecExpr:
467 case scUMaxExpr:
468 case scSMaxExpr:
469 case scUMinExpr:
470 case scSMinExpr:
472 const Loop *L = nullptr;
473 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S))
474 L = AR->getLoop();
475 for (const SCEV *Op : S->operands())
476 L = PickMostRelevantLoop(L, getRelevantLoop(Op), SE.DT);
477 return RelevantLoops[S] = L;
478 }
479 case scUnknown: {
480 const SCEVUnknown *U = cast<SCEVUnknown>(S);
481 if (const Instruction *I = dyn_cast<Instruction>(U->getValue()))
482 return Pair.first->second = SE.LI.getLoopFor(I->getParent());
483 // A non-instruction has no relevant loops.
484 return nullptr;
485 }
487 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
488 }
489 llvm_unreachable("Unexpected SCEV type!");
490}
491
492namespace {
493
494/// LoopCompare - Compare loops by PickMostRelevantLoop.
495class LoopCompare {
496 DominatorTree &DT;
497public:
498 explicit LoopCompare(DominatorTree &dt) : DT(dt) {}
499
500 bool operator()(std::pair<const Loop *, SCEVUse> LHS,
501 std::pair<const Loop *, SCEVUse> RHS) const {
502 // Keep pointer operands sorted at the end.
503 if (LHS.second->getType()->isPointerTy() !=
504 RHS.second->getType()->isPointerTy())
505 return LHS.second->getType()->isPointerTy();
506
507 // Compare loops with PickMostRelevantLoop.
508 if (LHS.first != RHS.first)
509 return PickMostRelevantLoop(LHS.first, RHS.first, DT) != LHS.first;
510
511 // If one operand is a non-constant negative and the other is not,
512 // put the non-constant negative on the right so that a sub can
513 // be used instead of a negate and add.
514 if (LHS.second->isNonConstantNegative()) {
515 if (!RHS.second->isNonConstantNegative())
516 return false;
517 } else if (RHS.second->isNonConstantNegative())
518 return true;
519
520 // Otherwise they are equivalent according to this comparison.
521 return false;
522 }
523};
524
525}
526
527Value *SCEVExpander::visitAddExpr(SCEVUseT<const SCEVAddExpr *> S) {
528 // Recognize the canonical representation of an unsimplifed urem.
529 const SCEV *URemLHS = nullptr;
530 const SCEV *URemRHS = nullptr;
531 if (match(S, m_scev_URem(m_SCEV(URemLHS), m_SCEV(URemRHS), SE))) {
532 Value *LHS = expand(URemLHS);
533 Value *RHS = expand(URemRHS);
534 return InsertBinop(Instruction::URem, LHS, RHS, SCEV::FlagNone,
535 /*IsSafeToHoist*/ false);
536 }
537
538 // -C + umax(C, X) --> usub.sat(X, C)
539 const SCEV *UMaxRHS = nullptr;
540 const SCEVConstant *C1, *C2;
542 m_scev_UMax(m_SCEVConstant(C2), m_SCEV(UMaxRHS)))) &&
543 C1->getAPInt() == -C2->getAPInt()) {
544 Value *LHS = expand(UMaxRHS);
545 Value *RHS = C2->getValue();
546 return Builder.CreateIntrinsic(Intrinsic::usub_sat, {S->getType()},
547 {LHS, RHS});
548 }
549
550 // Collect all the add operands in a loop, along with their associated loops.
551 // Iterate in reverse so that constants are emitted last, all else equal, and
552 // so that pointer operands are inserted first, which the code below relies on
553 // to form more involved GEPs.
555 for (SCEVUse Op : reverse(S->operands()))
556 OpsAndLoops.push_back(std::make_pair(getRelevantLoop(Op), Op));
557
558 // Sort by loop. Use a stable sort so that constants follow non-constants and
559 // pointer operands precede non-pointer operands.
560 llvm::stable_sort(OpsAndLoops, LoopCompare(SE.DT));
561
562 // Emit instructions to add all the operands. Hoist as much as possible
563 // out of loops, and form meaningful getelementptrs where possible.
564 Value *Sum = nullptr;
565 for (auto I = OpsAndLoops.begin(), E = OpsAndLoops.end(); I != E;) {
566 const Loop *CurLoop = I->first;
567 SCEVUse Op = I->second;
568 if (!Sum) {
569 // This is the first operand. Just expand it.
570 Sum = expand(Op);
571 ++I;
572 continue;
573 }
574
575 assert(!Op->getType()->isPointerTy() && "Only first op can be pointer");
576 if (isa<PointerType>(Sum->getType())) {
577 // The running sum expression is a pointer. Try to form a getelementptr
578 // at this level with that as the base.
580 for (; I != E && I->first == CurLoop; ++I) {
581 // If the operand is SCEVUnknown and not instructions, peek through
582 // it, to enable more of it to be folded into the GEP.
583 SCEVUse X = I->second;
584 if (const SCEVUnknown *U = dyn_cast<SCEVUnknown>(X))
585 if (!isa<Instruction>(U->getValue()))
586 X = SE.getSCEV(U->getValue());
587 NewOps.push_back(X);
588 }
589 Sum = expandAddToGEP(SE.getAddExpr(NewOps), Sum, S.getNoWrapFlags());
590 } else if (Op->isNonConstantNegative()) {
591 // Instead of doing a negate and add, just do a subtract.
592 Value *W = expand(SE.getNegativeSCEV(Op));
593 Sum = InsertBinop(Instruction::Sub, Sum, W, SCEV::FlagNone,
594 /*IsSafeToHoist*/ true);
595 ++I;
596 } else {
597 // A simple add.
598 Value *W = expand(Op);
599 // Canonicalize a constant to the RHS.
600 if (isa<Constant>(Sum))
601 std::swap(Sum, W);
602 Sum = InsertBinop(Instruction::Add, Sum, W, S.getNoWrapFlags(),
603 /*IsSafeToHoist*/ true);
604 ++I;
605 }
606 }
607
608 return Sum;
609}
610
611Value *SCEVExpander::visitMulExpr(SCEVUseT<const SCEVMulExpr *> S) {
612 Type *Ty = S->getType();
613
614 const SCEVConstant *C1, *C2;
615 const SCEV *Val;
616 // mul(PowerOf2C, (udiv X, PowerOf2C)) == (X >> C) << C
617 // -> X & (-1 << C)
619 m_scev_UDiv(m_SCEV(Val), m_SCEVConstant(C2)))) &&
620 C1 == C2 && C1->getAPInt().isPowerOf2()) {
621 Value *LHS = expand(Val);
622 unsigned ShAmtC = C1->getAPInt().logBase2();
623 unsigned BitWidth = Ty->getScalarSizeInBits();
624 APInt Mask(APInt::getBitsSetFrom(BitWidth, ShAmtC));
625 Value *Res = InsertBinop(Instruction::And, LHS, ConstantInt::get(Ty, Mask),
626 SCEV::FlagNone, /*IsSafeToHoist*/ true);
627 return Res;
628 }
629
630 // Collect all the mul operands in a loop, along with their associated loops.
631 // Iterate in reverse so that constants are emitted last, all else equal.
633 for (const SCEV *Op : reverse(S->operands()))
634 OpsAndLoops.push_back(std::make_pair(getRelevantLoop(Op), Op));
635
636 // Sort by loop. Use a stable sort so that constants follow non-constants.
637 llvm::stable_sort(OpsAndLoops, LoopCompare(SE.DT));
638
639 // Emit instructions to mul all the operands. Hoist as much as possible
640 // out of loops.
641 Value *Prod = nullptr;
642 auto I = OpsAndLoops.begin();
643
644 // Expand the calculation of X pow N in the following manner:
645 // Let N = P1 + P2 + ... + PK, where all P are powers of 2. Then:
646 // X pow N = (X pow P1) * (X pow P2) * ... * (X pow PK).
647 const auto ExpandOpBinPowN = [this, &I, &OpsAndLoops]() {
648 auto E = I;
649 // Calculate how many times the same operand from the same loop is included
650 // into this power.
651 uint64_t Exponent = 0;
652 const uint64_t MaxExponent = UINT64_MAX >> 1;
653 // No one sane will ever try to calculate such huge exponents, but if we
654 // need this, we stop on UINT64_MAX / 2 because we need to exit the loop
655 // below when the power of 2 exceeds our Exponent, and we want it to be
656 // 1u << 31 at most to not deal with unsigned overflow.
657 while (E != OpsAndLoops.end() && *I == *E && Exponent != MaxExponent) {
658 ++Exponent;
659 ++E;
660 }
661 assert(Exponent > 0 && "Trying to calculate a zeroth exponent of operand?");
662
663 // Calculate powers with exponents 1, 2, 4, 8 etc. and include those of them
664 // that are needed into the result.
665 Value *P = expand(I->second);
666 Value *Result = nullptr;
667 if (Exponent & 1)
668 Result = P;
669 for (uint64_t BinExp = 2; BinExp <= Exponent; BinExp <<= 1) {
670 P = InsertBinop(Instruction::Mul, P, P, SCEV::FlagNone,
671 /*IsSafeToHoist*/ true);
672 if (Exponent & BinExp)
673 Result = Result
674 ? InsertBinop(Instruction::Mul, Result, P, SCEV::FlagNone,
675 /*IsSafeToHoist*/ true)
676 : P;
677 }
678
679 I = E;
680 assert(Result && "Nothing was expanded?");
681 return Result;
682 };
683
684 while (I != OpsAndLoops.end()) {
685 if (!Prod) {
686 // This is the first operand. Just expand it.
687 Prod = ExpandOpBinPowN();
688 } else if (I->second->isAllOnesValue()) {
689 // Instead of doing a multiply by negative one, just do a negate.
690 Prod = InsertBinop(Instruction::Sub, Constant::getNullValue(Ty), Prod,
691 SCEV::FlagNone, /*IsSafeToHoist*/ true);
692 ++I;
693 } else {
694 // A simple mul.
695 Value *W = ExpandOpBinPowN();
696 // Canonicalize a constant to the RHS.
697 if (isa<Constant>(Prod)) std::swap(Prod, W);
698 const APInt *RHS;
699 if (match(W, m_Power2(RHS))) {
700 // Canonicalize Prod*(1<<C) to Prod<<C.
701 assert(!Ty->isVectorTy() && "vector types are not SCEVable");
702 auto NWFlags = S.getNoWrapFlags();
703 // clear nsw flag if shl will produce poison value.
704 if (RHS->logBase2() == RHS->getBitWidth() - 1)
705 NWFlags = ScalarEvolution::clearFlags(NWFlags, SCEV::FlagNSW);
706 Prod = InsertBinop(Instruction::Shl, Prod,
707 ConstantInt::get(Ty, RHS->logBase2()), NWFlags,
708 /*IsSafeToHoist*/ true);
709 } else {
710 Prod = InsertBinop(Instruction::Mul, Prod, W, S.getNoWrapFlags(),
711 /*IsSafeToHoist*/ true);
712 }
713 }
714 }
715
716 return Prod;
717}
718
719Value *SCEVExpander::visitUDivExpr(SCEVUseT<const SCEVUDivExpr *> S) {
720 Value *LHS = expand(S->getLHS());
721 if (const SCEVConstant *SC = dyn_cast<SCEVConstant>(S->getRHS())) {
722 const APInt &RHS = SC->getAPInt();
723 if (RHS.isPowerOf2())
724 return InsertBinop(Instruction::LShr, LHS,
725 ConstantInt::get(SC->getType(), RHS.logBase2()),
726 SCEV::FlagNone, /*IsSafeToHoist*/ true);
727 }
728
729 const SCEV *RHSExpr = S->getRHS();
730 Value *RHS = expand(RHSExpr);
731 if (SafeUDivMode) {
732 bool GuaranteedNotPoison =
734 if (!GuaranteedNotPoison)
735 RHS = Builder.CreateFreeze(RHS);
736
737 // We need an umax if either RHSExpr is not known to be zero, or if it is
738 // not guaranteed to be non-poison. In the later case, the frozen poison may
739 // be 0.
740 if (!SE.isKnownNonZero(RHSExpr) || !GuaranteedNotPoison)
741 RHS = Builder.CreateIntrinsic(RHS->getType(), Intrinsic::umax,
742 {RHS, ConstantInt::get(RHS->getType(), 1)});
743 }
744 return InsertBinop(Instruction::UDiv, LHS, RHS, SCEV::FlagNone,
745 /*IsSafeToHoist*/ SE.isKnownNonZero(S->getRHS()));
746}
747
748/// Determine if this is a well-behaved chain of instructions leading back to
749/// the PHI. If so, it may be reused by expanded expressions.
750bool SCEVExpander::isNormalAddRecExprPHI(PHINode *PN, Instruction *IncV,
751 const Loop *L) {
752 if (IncV->getNumOperands() == 0 || isa<PHINode>(IncV) ||
753 (isa<CastInst>(IncV) && !isa<BitCastInst>(IncV)))
754 return false;
755 // If any of the operands don't dominate the insert position, bail.
756 // Addrec operands are always loop-invariant, so this can only happen
757 // if there are instructions which haven't been hoisted.
758 if (L == IVIncInsertLoop) {
759 for (Use &Op : llvm::drop_begin(IncV->operands()))
760 if (Instruction *OInst = dyn_cast<Instruction>(Op))
761 if (!SE.DT.dominates(OInst, IVIncInsertPos))
762 return false;
763 }
764 // Advance to the next instruction.
765 IncV = dyn_cast<Instruction>(IncV->getOperand(0));
766 if (!IncV)
767 return false;
768
769 if (IncV->mayHaveSideEffects())
770 return false;
771
772 if (IncV == PN)
773 return true;
774
775 return isNormalAddRecExprPHI(PN, IncV, L);
776}
777
778/// getIVIncOperand returns an induction variable increment's induction
779/// variable operand.
780///
781/// If allowScale is set, any type of GEP is allowed as long as the nonIV
782/// operands dominate InsertPos.
783///
784/// If allowScale is not set, ensure that a GEP increment conforms to one of the
785/// simple patterns generated by getAddRecExprPHILiterally and
786/// expandAddtoGEP. If the pattern isn't recognized, return NULL.
788 Instruction *InsertPos,
789 bool allowScale) {
790 if (IncV == InsertPos)
791 return nullptr;
792
793 switch (IncV->getOpcode()) {
794 default:
795 return nullptr;
796 // Check for a simple Add/Sub or GEP of a loop invariant step.
797 case Instruction::Add:
798 case Instruction::Sub: {
800 if (!OInst || SE.DT.dominates(OInst, InsertPos))
801 return dyn_cast<Instruction>(IncV->getOperand(0));
802 return nullptr;
803 }
804 case Instruction::BitCast:
805 return dyn_cast<Instruction>(IncV->getOperand(0));
806 case Instruction::GetElementPtr:
807 for (Use &U : llvm::drop_begin(IncV->operands())) {
808 if (isa<Constant>(U))
809 continue;
810 if (Instruction *OInst = dyn_cast<Instruction>(U)) {
811 if (!SE.DT.dominates(OInst, InsertPos))
812 return nullptr;
813 }
814 if (allowScale) {
815 // allow any kind of GEP as long as it can be hoisted.
816 continue;
817 }
818 // GEPs produced by SCEVExpander use i8 element type.
819 if (!cast<GEPOperator>(IncV)->getSourceElementType()->isIntegerTy(8))
820 return nullptr;
821 break;
822 }
823 return dyn_cast<Instruction>(IncV->getOperand(0));
824 }
825}
826
827/// If the insert point of the current builder or any of the builders on the
828/// stack of saved builders has 'I' as its insert point, update it to point to
829/// the instruction after 'I'. This is intended to be used when the instruction
830/// 'I' is being moved. If this fixup is not done and 'I' is moved to a
831/// different block, the inconsistent insert point (with a mismatched
832/// Instruction and Block) can lead to an instruction being inserted in a block
833/// other than its parent.
834void SCEVExpander::fixupInsertPoints(Instruction *I) {
836 BasicBlock::iterator NewInsertPt = std::next(It);
837 if (Builder.GetInsertPoint() == It)
838 Builder.SetInsertPoint(&*NewInsertPt);
839 for (auto *InsertPtGuard : InsertPointGuards)
840 if (InsertPtGuard->GetInsertPoint() == It)
841 InsertPtGuard->SetInsertPoint(NewInsertPt);
842}
843
844/// hoistStep - Attempt to hoist a simple IV increment above InsertPos to make
845/// it available to other uses in this loop. Recursively hoist any operands,
846/// until we reach a value that dominates InsertPos.
848 bool RecomputePoisonFlags) {
849 auto FixupPoisonFlags = [this](Instruction *I) {
850 // Drop flags that are potentially inferred from old context and infer flags
851 // in new context.
852 rememberFlags(I);
853 I->dropPoisonGeneratingFlags();
854 if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(I))
855 if (auto Flags = SE.getStrengthenedNoWrapFlagsFromBinOp(OBO)) {
856 auto *BO = cast<BinaryOperator>(I);
857 BO->setHasNoUnsignedWrap(
859 BO->setHasNoSignedWrap(
861 }
862 };
863
864 if (SE.DT.dominates(IncV, InsertPos)) {
865 if (RecomputePoisonFlags)
866 FixupPoisonFlags(IncV);
867 return true;
868 }
869
870 // InsertPos must itself dominate IncV so that IncV's new position satisfies
871 // its existing users.
872 if (isa<PHINode>(InsertPos) ||
873 !SE.DT.dominates(InsertPos->getParent(), IncV->getParent()))
874 return false;
875
876 if (!SE.LI.movementPreservesLCSSAForm(IncV, InsertPos))
877 return false;
878
879 // Check that the chain of IV operands leading back to Phi can be hoisted.
881 for(;;) {
882 Instruction *Oper = getIVIncOperand(IncV, InsertPos, /*allowScale*/true);
883 if (!Oper)
884 return false;
885 // IncV is safe to hoist.
886 IVIncs.push_back(IncV);
887 IncV = Oper;
888 if (SE.DT.dominates(IncV, InsertPos))
889 break;
890 }
891 for (Instruction *I : llvm::reverse(IVIncs)) {
892 fixupInsertPoints(I);
893 I->moveBefore(InsertPos->getIterator());
894 if (RecomputePoisonFlags)
895 FixupPoisonFlags(I);
896 }
897 return true;
898}
899
901 PHINode *WidePhi,
902 Instruction *OrigInc,
903 Instruction *WideInc) {
904 return match(OrigInc, m_c_BinOp(m_Specific(OrigPhi), m_Value())) &&
905 match(WideInc, m_c_BinOp(m_Specific(WidePhi), m_Value())) &&
906 OrigInc->getOpcode() == WideInc->getOpcode();
907}
908
909/// Determine if this cyclic phi is in a form that would have been generated by
910/// LSR. We don't care if the phi was actually expanded in this pass, as long
911/// as it is in a low-cost form, for example, no implied multiplication. This
912/// should match any patterns generated by getAddRecExprPHILiterally and
913/// expandAddtoGEP.
914bool SCEVExpander::isExpandedAddRecExprPHI(PHINode *PN, Instruction *IncV,
915 const Loop *L) {
916 for(Instruction *IVOper = IncV;
917 (IVOper = getIVIncOperand(IVOper, L->getLoopPreheader()->getTerminator(),
918 /*allowScale=*/false));) {
919 if (IVOper == PN)
920 return true;
921 }
922 return false;
923}
924
925/// expandIVInc - Expand an IV increment at Builder's current InsertPos.
926/// Typically this is the LatchBlock terminator or IVIncInsertPos, but we may
927/// need to materialize IV increments elsewhere to handle difficult situations.
928Value *SCEVExpander::expandIVInc(PHINode *PN, Value *StepV, const Loop *L,
929 bool useSubtract) {
930 Value *IncV;
931 // If the PHI is a pointer, use a GEP, otherwise use an add or sub.
932 if (PN->getType()->isPointerTy()) {
933 // TODO: Change name to IVName.iv.next.
934 IncV = Builder.CreatePtrAdd(PN, StepV, "scevgep");
935 } else {
936 IncV = useSubtract ?
937 Builder.CreateSub(PN, StepV, Twine(IVName) + ".iv.next") :
938 Builder.CreateAdd(PN, StepV, Twine(IVName) + ".iv.next");
939 }
940 return IncV;
941}
942
943/// Check whether we can cheaply express the requested SCEV in terms of
944/// the available PHI SCEV by truncation and/or inversion of the step.
946 const SCEVAddRecExpr *Phi,
947 const SCEVAddRecExpr *Requested,
948 bool &InvertStep) {
949 // We can't transform to match a pointer PHI.
950 Type *PhiTy = Phi->getType();
951 Type *RequestedTy = Requested->getType();
952 if (PhiTy->isPointerTy() || RequestedTy->isPointerTy())
953 return false;
954
955 if (RequestedTy->getIntegerBitWidth() > PhiTy->getIntegerBitWidth())
956 return false;
957
958 // Try truncate it if necessary.
959 Phi = dyn_cast<SCEVAddRecExpr>(SE.getTruncateOrNoop(Phi, RequestedTy));
960 if (!Phi)
961 return false;
962
963 // Check whether truncation will help.
964 if (Phi == Requested) {
965 InvertStep = false;
966 return true;
967 }
968
969 // Check whether inverting will help: {R,+,-1} == R - {0,+,1}.
970 if (SE.getMinusSCEV(Requested->getStart(), Requested) == Phi) {
971 InvertStep = true;
972 return true;
973 }
974
975 return false;
976}
977
978/// getAddRecExprPHILiterally - Helper for expandAddRecExprLiterally. Expand
979/// the base addrec, which is the addrec without any non-loop-dominating
980/// values, and return the PHI.
981PHINode *
982SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
983 const Loop *L, Type *&TruncTy,
984 bool &InvertStep) {
985 assert((!IVIncInsertLoop || IVIncInsertPos) &&
986 "Uninitialized insert position");
987
988 // Reuse a previously-inserted PHI, if present.
989 BasicBlock *LatchBlock = L->getLoopLatch();
990 if (LatchBlock) {
991 PHINode *AddRecPhiMatch = nullptr;
992 Instruction *IncV = nullptr;
993 TruncTy = nullptr;
994 InvertStep = false;
995
996 // Only try partially matching scevs that need truncation and/or
997 // step-inversion if we know this loop is outside the current loop.
998 bool TryNonMatchingSCEV =
999 IVIncInsertLoop &&
1000 SE.DT.properlyDominates(LatchBlock, IVIncInsertLoop->getHeader());
1001
1002 for (PHINode &PN : L->getHeader()->phis()) {
1003 if (!SE.isSCEVable(PN.getType()))
1004 continue;
1005
1006 // We should not look for a incomplete PHI. Getting SCEV for a incomplete
1007 // PHI has no meaning at all.
1008 if (!PN.isComplete()) {
1010 DebugType, dbgs() << "One incomplete PHI is found: " << PN << "\n");
1011 continue;
1012 }
1013
1014 const SCEVAddRecExpr *PhiSCEV = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(&PN));
1015 if (!PhiSCEV)
1016 continue;
1017
1018 bool IsMatchingSCEV = PhiSCEV == Normalized;
1019 // We only handle truncation and inversion of phi recurrences for the
1020 // expanded expression if the expanded expression's loop dominates the
1021 // loop we insert to. Check now, so we can bail out early.
1022 if (!IsMatchingSCEV && !TryNonMatchingSCEV)
1023 continue;
1024
1025 // TODO: this possibly can be reworked to avoid this cast at all.
1026 Instruction *TempIncV =
1028 if (!TempIncV)
1029 continue;
1030
1031 // Check whether we can reuse this PHI node.
1032 if (LSRMode) {
1033 if (!isExpandedAddRecExprPHI(&PN, TempIncV, L))
1034 continue;
1035 } else {
1036 if (!isNormalAddRecExprPHI(&PN, TempIncV, L))
1037 continue;
1038 }
1039
1040 // Stop if we have found an exact match SCEV.
1041 if (IsMatchingSCEV) {
1042 IncV = TempIncV;
1043 TruncTy = nullptr;
1044 InvertStep = false;
1045 AddRecPhiMatch = &PN;
1046 break;
1047 }
1048
1049 // Try whether the phi can be translated into the requested form
1050 // (truncated and/or offset by a constant).
1051 if ((!TruncTy || InvertStep) &&
1052 canBeCheaplyTransformed(SE, PhiSCEV, Normalized, InvertStep)) {
1053 // Record the phi node. But don't stop we might find an exact match
1054 // later.
1055 AddRecPhiMatch = &PN;
1056 IncV = TempIncV;
1057 TruncTy = Normalized->getType();
1058 }
1059 }
1060
1061 if (AddRecPhiMatch) {
1062 // Ok, the add recurrence looks usable.
1063 // Remember this PHI, even in post-inc mode.
1064 InsertedValues.insert(AddRecPhiMatch);
1065 // Remember the increment.
1066 rememberInstruction(IncV);
1067 // Those values were not actually inserted but re-used.
1068 ReusedValues.insert(AddRecPhiMatch);
1069 ReusedValues.insert(IncV);
1070 return AddRecPhiMatch;
1071 }
1072 }
1073
1074 // Save the original insertion point so we can restore it when we're done.
1075 SCEVInsertPointGuard Guard(Builder, this);
1076
1077 // Another AddRec may need to be recursively expanded below. For example, if
1078 // this AddRec is quadratic, the StepV may itself be an AddRec in this
1079 // loop. Remove this loop from the PostIncLoops set before expanding such
1080 // AddRecs. Otherwise, we cannot find a valid position for the step
1081 // (i.e. StepV can never dominate its loop header). Ideally, we could do
1082 // SavedIncLoops.swap(PostIncLoops), but we generally have a single element,
1083 // so it's not worth implementing SmallPtrSet::swap.
1084 PostIncLoopSet SavedPostIncLoops = PostIncLoops;
1085 PostIncLoops.clear();
1086
1087 // Expand code for the start value into the loop preheader.
1088 assert(L->getLoopPreheader() &&
1089 "Can't expand add recurrences without a loop preheader!");
1090 Value *StartV =
1091 expand(Normalized->getStart(), L->getLoopPreheader()->getTerminator());
1092
1093 // StartV must have been be inserted into L's preheader to dominate the new
1094 // phi.
1095 assert(!isa<Instruction>(StartV) ||
1096 SE.DT.properlyDominates(cast<Instruction>(StartV)->getParent(),
1097 L->getHeader()));
1098
1099 // Expand code for the step value. Do this before creating the PHI so that PHI
1100 // reuse code doesn't see an incomplete PHI.
1101 const SCEV *Step = Normalized->getStepRecurrence(SE);
1102 Type *ExpandTy = Normalized->getType();
1103 // If the stride is negative, insert a sub instead of an add for the increment
1104 // (unless it's a constant, because subtracts of constants are canonicalized
1105 // to adds).
1106 bool useSubtract = !ExpandTy->isPointerTy() && Step->isNonConstantNegative();
1107 if (useSubtract)
1108 Step = SE.getNegativeSCEV(Step);
1109 // Expand the step somewhere that dominates the loop header.
1110 Value *StepV = expand(Step, L->getHeader()->getFirstInsertionPt());
1111
1112 // The no-wrap behavior proved here is only applicable if we actually do emit
1113 // an addition. It does not apply if we emit a subtraction.
1114 bool CanHaveNoWrap = !useSubtract && ExpandTy->isIntegerTy();
1115 bool IncrementIsNUW =
1116 CanHaveNoWrap &&
1117 SE.willNotOverflow(Instruction::Add, /*Signed=*/false, Normalized, Step);
1118 bool IncrementIsNSW =
1119 CanHaveNoWrap &&
1120 SE.willNotOverflow(Instruction::Add, /*Signed=*/true, Normalized, Step);
1121
1122 // Create the PHI.
1123 BasicBlock *Header = L->getHeader();
1124 Builder.SetInsertPoint(Header->begin());
1125 PHINode *PN =
1126 Builder.CreatePHI(ExpandTy, pred_size(Header), Twine(IVName) + ".iv");
1127
1128 // Create the step instructions and populate the PHI.
1129 for (BasicBlock *Pred : predecessors(Header)) {
1130 // Add a start value.
1131 if (!L->contains(Pred)) {
1132 PN->addIncoming(StartV, Pred);
1133 continue;
1134 }
1135
1136 // Create a step value and add it to the PHI.
1137 // If IVIncInsertLoop is non-null and equal to the addrec's loop, insert the
1138 // instructions at IVIncInsertPos.
1139 Instruction *InsertPos = L == IVIncInsertLoop ?
1140 IVIncInsertPos : Pred->getTerminator();
1141 Builder.SetInsertPoint(InsertPos);
1142 Value *IncV = expandIVInc(PN, StepV, L, useSubtract);
1143
1145 if (IncrementIsNUW)
1146 cast<BinaryOperator>(IncV)->setHasNoUnsignedWrap();
1147 if (IncrementIsNSW)
1148 cast<BinaryOperator>(IncV)->setHasNoSignedWrap();
1149 }
1150 PN->addIncoming(IncV, Pred);
1151 }
1152
1153 // After expanding subexpressions, restore the PostIncLoops set so the caller
1154 // can ensure that IVIncrement dominates the current uses.
1155 PostIncLoops = SavedPostIncLoops;
1156
1157 // Remember this PHI, even in post-inc mode. LSR SCEV-based salvaging is most
1158 // effective when we are able to use an IV inserted here, so record it.
1159 InsertedValues.insert(PN);
1160 InsertedIVs.push_back(PN);
1161 return PN;
1162}
1163
1164Value *
1165SCEVExpander::expandAddRecExprLiterally(SCEVUseT<const SCEVAddRecExpr *> S) {
1166 const Loop *L = S->getLoop();
1167
1168 // Determine a normalized form of this expression, which is the expression
1169 // before any post-inc adjustment is made.
1170 const SCEVAddRecExpr *Normalized = S;
1171 if (PostIncLoops.count(L)) {
1173 Loops.insert(L);
1174 Normalized = cast<SCEVAddRecExpr>(
1175 normalizeForPostIncUse(S, Loops, SE, /*CheckInvertible=*/false));
1176 }
1177
1178 [[maybe_unused]] const SCEV *Start = Normalized->getStart();
1179 const SCEV *Step = Normalized->getStepRecurrence(SE);
1180 assert(SE.properlyDominates(Start, L->getHeader()) &&
1181 "Start does not properly dominate loop header");
1182 assert(SE.dominates(Step, L->getHeader()) && "Step not dominate loop header");
1183
1184 // In some cases, we decide to reuse an existing phi node but need to truncate
1185 // it and/or invert the step.
1186 Type *TruncTy = nullptr;
1187 bool InvertStep = false;
1188 PHINode *PN = getAddRecExprPHILiterally(Normalized, L, TruncTy, InvertStep);
1189
1190 // Accommodate post-inc mode, if necessary.
1191 Value *Result;
1192 if (!PostIncLoops.count(L))
1193 Result = PN;
1194 else {
1195 // In PostInc mode, use the post-incremented value.
1196 BasicBlock *LatchBlock = L->getLoopLatch();
1197 assert(LatchBlock && "PostInc mode requires a unique loop latch!");
1198 Result = PN->getIncomingValueForBlock(LatchBlock);
1199
1200 // We might be introducing a new use of the post-inc IV that is not poison
1201 // safe, in which case we should drop poison generating flags. Only keep
1202 // those flags for which SCEV has proven that they always hold.
1203 if (isa<OverflowingBinaryOperator>(Result)) {
1204 auto *I = cast<Instruction>(Result);
1205 if (!S->hasNoUnsignedWrap())
1206 I->setHasNoUnsignedWrap(false);
1207 if (!S->hasNoSignedWrap())
1208 I->setHasNoSignedWrap(false);
1209 }
1210
1211 // For an expansion to use the postinc form, the client must call
1212 // expandCodeFor with an InsertPoint that is either outside the PostIncLoop
1213 // or dominated by IVIncInsertPos.
1214 if (isa<Instruction>(Result) &&
1215 !SE.DT.dominates(cast<Instruction>(Result),
1216 &*Builder.GetInsertPoint())) {
1217 // The induction variable's postinc expansion does not dominate this use.
1218 // IVUsers tries to prevent this case, so it is rare. However, it can
1219 // happen when an IVUser outside the loop is not dominated by the latch
1220 // block. Adjusting IVIncInsertPos before expansion begins cannot handle
1221 // all cases. Consider a phi outside whose operand is replaced during
1222 // expansion with the value of the postinc user. Without fundamentally
1223 // changing the way postinc users are tracked, the only remedy is
1224 // inserting an extra IV increment. StepV might fold into PostLoopOffset,
1225 // but hopefully expandCodeFor handles that.
1226 bool useSubtract =
1227 !S->getType()->isPointerTy() && Step->isNonConstantNegative();
1228 if (useSubtract)
1229 Step = SE.getNegativeSCEV(Step);
1230 Value *StepV;
1231 {
1232 // Expand the step somewhere that dominates the loop header.
1233 SCEVInsertPointGuard Guard(Builder, this);
1234 StepV = expand(Step, L->getHeader()->getFirstInsertionPt());
1235 }
1236 Result = expandIVInc(PN, StepV, L, useSubtract);
1237 }
1238 }
1239
1240 // We have decided to reuse an induction variable of a dominating loop. Apply
1241 // truncation and/or inversion of the step.
1242 if (TruncTy) {
1243 if (TruncTy != Result->getType() || InvertStep)
1244 Result = fixupLCSSAFormFor(Result);
1245 // Truncate the result.
1246 if (TruncTy != Result->getType())
1247 Result = Builder.CreateTrunc(Result, TruncTy);
1248
1249 // Invert the result.
1250 if (InvertStep)
1251 Result = Builder.CreateSub(expand(Normalized->getStart()), Result);
1252 }
1253
1254 return Result;
1255}
1256
1257std::pair<PHINode *, const SCEV *>
1260 const BasicBlock *InsertBB) {
1261 Type *STy = S->getType();
1262 const Loop *L = S->getLoop();
1263 BasicBlock *EB = L->getExitBlock();
1264 if (!EB || !EB->getSinglePredecessor() || !SE.DT.dominates(EB, InsertBB))
1265 return {nullptr, nullptr};
1266
1267 // Helper to check if the diff between S and ExitSCEV is simple enough to
1268 // allow reusing the LCSSA phi.
1269 auto CanReuse = [&](const SCEV *ExitSCEV) -> const SCEV * {
1270 if (isa<SCEVCouldNotCompute>(ExitSCEV))
1271 return nullptr;
1272 const SCEV *Diff = SE.getMinusSCEV(S, ExitSCEV);
1273 const SCEV *Op = Diff;
1278 return nullptr;
1279 return Diff;
1280 };
1281
1282 for (auto &PN : EB->phis()) {
1283 if (!SE.isSCEVable(PN.getType()))
1284 continue;
1285 auto *ExitSCEV = SE.getSCEV(&PN);
1286 if (!isa<SCEVAddRecExpr>(ExitSCEV))
1287 continue;
1288 Type *PhiTy = PN.getType();
1289 const SCEV *Diff = nullptr;
1290 if (STy->isIntegerTy() && PhiTy->isPointerTy() &&
1291 SE.getDataLayout().getAddressType(PhiTy) == STy) {
1292 const SCEV *AddrSCEV = SE.getPtrToAddrExpr(ExitSCEV);
1293 Diff = CanReuse(AddrSCEV);
1294 } else if (STy == PhiTy) {
1295 Diff = CanReuse(ExitSCEV);
1296 }
1297 if (!Diff)
1298 continue;
1299
1300 assert(Diff->getType()->isIntegerTy() &&
1301 "difference must be of integer type");
1302 return {&PN, Diff};
1303 }
1304
1305 return {nullptr, nullptr};
1306}
1307
1308Value *SCEVExpander::tryToReuseLCSSAPhi(SCEVUseT<const SCEVAddRecExpr *> S) {
1309 auto [PN, Diff] = findReusableLCSSAPhi(SE, S, Builder.GetInsertBlock());
1310 if (!PN)
1311 return nullptr;
1312 Value *DiffV = expand(Diff);
1313 Value *BaseV = fixupLCSSAFormFor(PN);
1314 if (PN->getType()->isPointerTy()) {
1315 if (S->getType()->isPointerTy())
1316 return Builder.CreatePtrAdd(BaseV, DiffV);
1317 BaseV = Builder.CreatePtrToAddr(BaseV);
1318 }
1319 return Builder.CreateAdd(BaseV, DiffV);
1320}
1321
1322Value *SCEVExpander::visitAddRecExpr(SCEVUseT<const SCEVAddRecExpr *> S) {
1323 // In canonical mode we compute the addrec as an expression of a canonical IV
1324 // and expand the resulting SCEV expression. This way we avoid introducing
1325 // new IVs to carry on the computation of the addrec throughout the loop.
1326 //
1327 // Nested addrecs would need a canonical IV of a type wider than the addrec
1328 // itself to be evaluated in terms of it. Emitting a canonical IV of the
1329 // proper type might produce non-legal types, for example expanding an i64
1330 // {0,+,2,+,1} addrec would need an i65 canonical IV. To avoid this just fall
1331 // back to non-canonical mode for nested addrecs.
1332 if (!CanonicalMode || (S->getNumOperands() > 2))
1333 return expandAddRecExprLiterally(S);
1334
1335 Type *Ty = SE.getEffectiveSCEVType(S->getType());
1336 const Loop *L = S->getLoop();
1337
1338 // First check for an existing canonical IV in a suitable type.
1339 PHINode *CanonicalIV = nullptr;
1340 if (PHINode *PN = L->getCanonicalInductionVariable())
1341 if (SE.getTypeSizeInBits(PN->getType()) >= SE.getTypeSizeInBits(Ty))
1342 CanonicalIV = PN;
1343
1344 // Rewrite an AddRec in terms of the canonical induction variable, if
1345 // its type is more narrow.
1346 if (CanonicalIV &&
1347 SE.getTypeSizeInBits(CanonicalIV->getType()) > SE.getTypeSizeInBits(Ty) &&
1348 !S->getType()->isPointerTy()) {
1349 SmallVector<SCEVUse, 4> NewOps(S->getNumOperands());
1350 for (unsigned i = 0, e = S->getNumOperands(); i != e; ++i)
1351 NewOps[i] = SE.getAnyExtendExpr(S->getOperand(i), CanonicalIV->getType());
1352 Value *V = expand(
1353 SE.getAddRecExpr(NewOps, S->getLoop(), S.getNoWrapFlags(SCEV::FlagNW)));
1354 BasicBlock::iterator NewInsertPt =
1356 &*Builder.GetInsertPoint())
1357 : Builder.GetInsertPoint();
1358 V = expand(SE.getTruncateExpr(SE.getUnknown(V), Ty), NewInsertPt);
1359 return V;
1360 }
1361
1362 // If S is expanded outside the defining loop, check if there is a
1363 // matching LCSSA phi node for it.
1364 if (Value *V = tryToReuseLCSSAPhi(S))
1365 return V;
1366
1367 // Expand a pointer AddRec as its pointer base plus its integer offset.
1368 if (isa<PointerType>(S->getType())) {
1369 Value *StartV = expand(SE.getPointerBase(S));
1370 return expandAddToGEP(SE.removePointerBase(S), StartV,
1372 }
1373
1374 // {X,+,F} --> X + {0,+,F}
1375 if (!S->getStart()->isZero()) {
1376 const SCEV *Rest = SE.getAddRecExpr(SE.getZero(Ty), S->getOperand(1), L,
1378
1379 // Just do a normal add. Pre-expand the operands to suppress folding.
1380 //
1381 // The LHS and RHS values are factored out of the expand call to make the
1382 // output independent of the argument evaluation order.
1383 const SCEV *AddExprLHS = SE.getUnknown(expand(S->getStart()));
1384 const SCEV *AddExprRHS = SE.getUnknown(expand(Rest));
1385 return expand(SE.getAddExpr(AddExprLHS, AddExprRHS));
1386 }
1387
1388 // If we don't yet have a canonical IV, create one.
1389 if (!CanonicalIV) {
1390 // Create and insert the PHI node for the induction variable in the
1391 // specified loop.
1392 BasicBlock *Header = L->getHeader();
1393 pred_iterator HPB = pred_begin(Header), HPE = pred_end(Header);
1394 CanonicalIV = PHINode::Create(Ty, std::distance(HPB, HPE), "indvar");
1395 CanonicalIV->insertBefore(Header->begin());
1396 rememberInstruction(CanonicalIV);
1397
1398 SmallPtrSet<BasicBlock *, 4> PredSeen;
1399 Constant *One = ConstantInt::get(Ty, 1);
1400 for (pred_iterator HPI = HPB; HPI != HPE; ++HPI) {
1401 BasicBlock *HP = *HPI;
1402 if (!PredSeen.insert(HP).second) {
1403 // There must be an incoming value for each predecessor, even the
1404 // duplicates!
1405 CanonicalIV->addIncoming(CanonicalIV->getIncomingValueForBlock(HP), HP);
1406 continue;
1407 }
1408
1409 if (L->contains(HP)) {
1410 // Insert a unit add instruction right before the terminator
1411 // corresponding to the back-edge.
1412 Instruction *Add = BinaryOperator::CreateAdd(CanonicalIV, One,
1413 "indvar.next",
1414 HP->getTerminator()->getIterator());
1415 Add->setDebugLoc(HP->getTerminator()->getDebugLoc());
1416 rememberInstruction(Add);
1417 CanonicalIV->addIncoming(Add, HP);
1418 } else {
1419 CanonicalIV->addIncoming(Constant::getNullValue(Ty), HP);
1420 }
1421 }
1422 }
1423
1424 // {0,+,F} --> {0,+,1} * F
1425 return expand(SE.getMulExpr(SE.getUnknown(CanonicalIV), S->getOperand(1)));
1426}
1427
1428/// Return true if \p CI computes the same value as a `ptrtoaddr` of its
1429/// pointer operand to \p Ty.
1430static bool canReuseCastForPtrToAddr(const CastInst *CI, Type *Ty,
1431 const DataLayout &DL) {
1432 if (CI->getType() != Ty)
1433 return false;
1434 if (CI->getOpcode() == CastInst::PtrToAddr)
1435 return true;
1436 if (CI->getOpcode() != CastInst::PtrToInt)
1437 return false;
1438 unsigned AS = CI->getSrcTy()->getPointerAddressSpace();
1439 return DL.getPointerSizeInBits(AS) == DL.getIndexSizeInBits(AS);
1440}
1441
1443 Value *PtrOp, Type *Ty, const DataLayout &DL,
1444 function_ref<bool(const CastInst *)> Dominates) {
1445 // Constants have no use list to scan.
1446 if (isa<Constant>(PtrOp))
1447 return nullptr;
1448 for (User *U : PtrOp->users()) {
1449 auto *CI = dyn_cast<CastInst>(U);
1450 if (!CI || !canReuseCastForPtrToAddr(CI, Ty, DL))
1451 continue;
1452 if (Dominates(CI))
1453 return CI;
1454 }
1455 return nullptr;
1456}
1457
1458Value *SCEVExpander::visitPtrToAddrExpr(SCEVUseT<const SCEVPtrToAddrExpr *> S) {
1459 Value *V = expand(S->getOperand());
1460 Type *Ty = S->getType();
1461
1462 // ptrtoaddr and ptrtoint can produce the same value, so try to reuse either.
1463 BasicBlock::iterator BIP = Builder.GetInsertPoint();
1464 if (CastInst *CI =
1465 findReusableCastForPtrToAddr(V, Ty, DL, [&](const CastInst *CI) {
1466 return &*BIP != CI && SE.DT.dominates(CI, &*BIP);
1467 }))
1468 return CI;
1469
1470 return ReuseOrCreateCast(V, Ty, CastInst::PtrToAddr,
1471 GetOptimalInsertionPointForCastOf(V));
1472}
1473
1474Value *SCEVExpander::visitTruncateExpr(SCEVUseT<const SCEVTruncateExpr *> S) {
1475 Type *Ty = S->getType();
1476
1477 // When truncating a ptrtoaddr, check for existing ptrtoint instructions that
1478 // convert directly to the target type, to avoid generating redundant
1479 // ptrtoaddr + trunc sequences.
1480 if (auto *PtrToAddr = dyn_cast<SCEVPtrToAddrExpr>(S->getOperand())) {
1481 Value *PtrOp = expand(PtrToAddr->getOperand());
1482 if (!isa<Constant>(PtrOp)) {
1483 BasicBlock::iterator BIP = Builder.GetInsertPoint();
1484 for (User *U : PtrOp->users()) {
1485 auto *CI = dyn_cast<CastInst>(U);
1486 if (CI && CI->getType() == Ty &&
1487 CI->getOpcode() == CastInst::PtrToInt && &*BIP != CI &&
1488 SE.DT.dominates(CI, &*BIP))
1489 return CI;
1490 }
1491 }
1492 }
1493
1494 Value *V = expand(S->getOperand());
1495 return Builder.CreateTrunc(V, S->getType());
1496}
1497
1498Value *
1499SCEVExpander::visitZeroExtendExpr(SCEVUseT<const SCEVZeroExtendExpr *> S) {
1500 Value *V = expand(S->getOperand());
1501 return Builder.CreateZExt(V, S->getType(), "",
1502 SE.isKnownNonNegative(S->getOperand()));
1503}
1504
1505Value *
1506SCEVExpander::visitSignExtendExpr(SCEVUseT<const SCEVSignExtendExpr *> S) {
1507 Value *V = expand(S->getOperand());
1508 return Builder.CreateSExt(V, S->getType());
1509}
1510
1511Value *SCEVExpander::expandMinMaxExpr(SCEVUseT<const SCEVNAryExpr *> S,
1512 Intrinsic::ID IntrinID, Twine Name,
1513 bool IsSequential) {
1514 bool PrevSafeMode = SafeUDivMode;
1515 SafeUDivMode |= IsSequential;
1516 Value *LHS = expand(S->getOperand(S->getNumOperands() - 1));
1517 Type *Ty = LHS->getType();
1518 if (IsSequential)
1519 LHS = Builder.CreateFreeze(LHS);
1520 for (int i = S->getNumOperands() - 2; i >= 0; --i) {
1521 SafeUDivMode = (IsSequential && i != 0) || PrevSafeMode;
1522 Value *RHS = expand(S->getOperand(i));
1523 if (IsSequential && i != 0)
1524 RHS = Builder.CreateFreeze(RHS);
1525 Value *Sel;
1526 if (Ty->isIntegerTy())
1527 Sel = Builder.CreateIntrinsic(IntrinID, {Ty}, {LHS, RHS},
1528 /*FMFSource=*/nullptr, Name);
1529 else {
1530 Value *ICmp =
1531 Builder.CreateICmp(MinMaxIntrinsic::getPredicate(IntrinID), LHS, RHS);
1532 Sel = Builder.CreateSelectWithUnknownProfile(ICmp, LHS, RHS,
1533 "scev-expander", Name);
1534 }
1535 LHS = Sel;
1536 }
1537 SafeUDivMode = PrevSafeMode;
1538 return LHS;
1539}
1540
1541Value *SCEVExpander::visitSMaxExpr(SCEVUseT<const SCEVSMaxExpr *> S) {
1542 return expandMinMaxExpr(S, Intrinsic::smax, "smax");
1543}
1544
1545Value *SCEVExpander::visitUMaxExpr(SCEVUseT<const SCEVUMaxExpr *> S) {
1546 return expandMinMaxExpr(S, Intrinsic::umax, "umax");
1547}
1548
1549Value *SCEVExpander::visitSMinExpr(SCEVUseT<const SCEVSMinExpr *> S) {
1550 return expandMinMaxExpr(S, Intrinsic::smin, "smin");
1551}
1552
1553Value *SCEVExpander::visitUMinExpr(SCEVUseT<const SCEVUMinExpr *> S) {
1554 return expandMinMaxExpr(S, Intrinsic::umin, "umin");
1555}
1556
1557Value *SCEVExpander::visitSequentialUMinExpr(
1559 return expandMinMaxExpr(S, Intrinsic::umin, "umin",
1560 /*IsSequential*/ true);
1561}
1562
1563Value *SCEVExpander::visitVScale(SCEVUseT<const SCEVVScale *> S) {
1564 return Builder.CreateVScale(S->getType());
1565}
1566
1569 setInsertPoint(IP);
1570 return expandCodeFor(SH, Ty);
1571}
1572
1574 // Expand the code for this SCEV.
1575 Value *V = expand(SH);
1576
1577 if (Ty && Ty != V->getType()) {
1578 assert(SE.getTypeSizeInBits(Ty) == SE.getTypeSizeInBits(SH->getType()) &&
1579 "non-trivial casts should be done with the SCEVs directly!");
1580 V = InsertNoopCastOfTo(V, Ty);
1581 }
1582 return V;
1583}
1584
1585Value *SCEVExpander::FindValueInExprValueMap(
1586 SCEVUse S, const Instruction *InsertPt,
1587 SmallVectorImpl<Instruction *> &DropPoisonGeneratingInsts) {
1588 // If the expansion is not in CanonicalMode, and the SCEV contains any
1589 // sub scAddRecExpr type SCEV, it is required to expand the SCEV literally.
1590 if (!CanonicalMode && SE.containsAddRecurrence(S))
1591 return nullptr;
1592
1593 // If S is a constant or unknown, it may be worse to reuse an existing Value.
1595 return nullptr;
1596
1597 for (Value *V : SE.getSCEVValues(S)) {
1598 Instruction *EntInst = dyn_cast<Instruction>(V);
1599 if (!EntInst)
1600 continue;
1601
1602 // Choose a Value from the set which dominates the InsertPt.
1603 // InsertPt should be inside the Value's parent loop so as not to break
1604 // the LCSSA form.
1605 assert(EntInst->getFunction() == InsertPt->getFunction());
1606 if (S->getType() != V->getType() || !SE.DT.dominates(EntInst, InsertPt) ||
1607 !(SE.LI.getLoopFor(EntInst->getParent()) == nullptr ||
1608 SE.LI.getLoopFor(EntInst->getParent())->contains(InsertPt)))
1609 continue;
1610
1611 // Make sure reusing the instruction is poison-safe.
1612 if (SE.canReuseInstruction(S, EntInst, DropPoisonGeneratingInsts))
1613 return V;
1614 DropPoisonGeneratingInsts.clear();
1615 }
1616 return nullptr;
1617}
1618
1619Value *SCEVExpander::findExistingExpansionAndDropPoisonFlags(
1620 SCEVUse S, const Instruction *InsertPt) {
1621 SmallVector<Instruction *> DropPoisonGeneratingInsts;
1622 Value *V = FindValueInExprValueMap(S, InsertPt, DropPoisonGeneratingInsts);
1623 if (!V)
1624 return nullptr;
1625 for (Instruction *I : DropPoisonGeneratingInsts) {
1626 rememberFlags(I);
1628 }
1629 return V;
1630}
1631
1632// The expansion of SCEV will either reuse a previous Value in ExprValueMap,
1633// or expand the SCEV literally. Specifically, if the expansion is in LSRMode,
1634// and the SCEV contains any sub scAddRecExpr type SCEV, it will be expanded
1635// literally, to prevent LSR's transformed SCEV from being reverted. Otherwise,
1636// the expansion will try to reuse Value from ExprValueMap, and only when it
1637// fails, expand the SCEV literally.
1638Value *SCEVExpander::expand(SCEVUse S) {
1639 // Compute an insertion point for this SCEV object. Hoist the instructions
1640 // as far out in the loop nest as possible.
1641 BasicBlock::iterator OrigInsertPt = Builder.GetInsertPoint();
1642 BasicBlock::iterator InsertPt = OrigInsertPt;
1643
1644 // We can move insertion point only if there is no div or rem operations
1645 // otherwise we are risky to move it over the check for zero denominator.
1646 auto SafeToHoist = [](const SCEV *S) {
1647 return !SCEVExprContains(S, [](const SCEV *S) {
1648 if (const auto *D = dyn_cast<SCEVUDivExpr>(S)) {
1649 if (const auto *SC = dyn_cast<SCEVConstant>(D->getRHS()))
1650 // Division by non-zero constants can be hoisted.
1651 return SC->getValue()->isZero();
1652 // All other divisions should not be moved as they may be
1653 // divisions by zero and should be kept within the
1654 // conditions of the surrounding loops that guard their
1655 // execution (see PR35406).
1656 return true;
1657 }
1658 return false;
1659 });
1660 };
1661 if (SafeToHoist(S)) {
1662 for (Loop *L = SE.LI.getLoopFor(Builder.GetInsertBlock());;
1663 L = L->getParentLoop()) {
1664 if (SE.isLoopInvariant(S, L)) {
1665 if (!L) break;
1666 if (BasicBlock *Preheader = L->getLoopPreheader()) {
1667 InsertPt = Preheader->getTerminator()->getIterator();
1668 } else {
1669 // LSR sets the insertion point for AddRec start/step values to the
1670 // block start to simplify value reuse, even though it's an invalid
1671 // position. SCEVExpander must correct for this in all cases.
1672 InsertPt = L->getHeader()->getFirstInsertionPt();
1673 }
1674 } else {
1675 // If the SCEV is computable at this level, insert it into the header
1676 // after the PHIs (and after any other instructions that we've inserted
1677 // there) so that it is guaranteed to dominate any user inside the loop.
1678 if (L && SE.hasComputableLoopEvolution(S, L) && !PostIncLoops.count(L))
1679 InsertPt = L->getHeader()->getFirstInsertionPt();
1680
1681 while (InsertPt != Builder.GetInsertPoint() &&
1682 (isInsertedInstruction(&*InsertPt))) {
1683 InsertPt = std::next(InsertPt);
1684 }
1685 break;
1686 }
1687 }
1688 }
1689
1690 // Check to see if we already expanded this here.
1691 auto I = InsertedExpressions.find(std::make_pair(S, &*InsertPt));
1692 if (I != InsertedExpressions.end())
1693 return I->second;
1694
1695 SCEVInsertPointGuard Guard(Builder, this);
1696 Builder.SetInsertPoint(InsertPt);
1697
1698 // Expand the expression into instructions.
1699 Value *V = findExistingExpansionAndDropPoisonFlags(S, &*InsertPt);
1700 BasicBlock::iterator CacheAt = InsertPt;
1701 if (!V && InsertPt != OrigInsertPt && PostIncLoops.empty()) {
1702 // Hoisting the insertion point can move it above a value that already
1703 // computes S. Such a value is still usable: it only has to dominate the
1704 // point we were asked to expand at, which is where the result is used.
1705 V = findExistingExpansionAndDropPoisonFlags(S, &*OrigInsertPt);
1706 if (V)
1707 CacheAt = OrigInsertPt;
1708 }
1709 if (!V) {
1710 V = visit(S);
1711 V = fixupLCSSAFormFor(V);
1712 }
1713 // Remember the expanded value for this SCEV at this location.
1714 //
1715 // This is independent of PostIncLoops. The mapped value simply materializes
1716 // the expression at this insertion point. If the mapped value happened to be
1717 // a postinc expansion, it could be reused by a non-postinc user, but only if
1718 // its insertion point was already at the head of the loop.
1719 InsertedExpressions[std::make_pair(S, &*CacheAt)] = V;
1720 return V;
1721}
1722
1723void SCEVExpander::rememberInstruction(Value *I) {
1724 auto DoInsert = [this](Value *V) {
1725 if (!PostIncLoops.empty())
1726 InsertedPostIncValues.insert(V);
1727 else
1728 InsertedValues.insert(V);
1729 };
1730 DoInsert(I);
1731}
1732
1733void SCEVExpander::rememberFlags(Instruction *I) {
1734 // If we already have flags for the instruction, keep the existing ones.
1735 OrigFlags.try_emplace(I, PoisonFlags(I));
1736}
1737
1740 I->dropPoisonGeneratingAnnotations();
1741 // See if we can re-infer from first principles any of the flags we just
1742 // dropped.
1743 if (auto *OBO = dyn_cast<OverflowingBinaryOperator>(I))
1744 if (SE.isSCEVable(OBO->getType()))
1745 if (auto Flags = SE.getStrengthenedNoWrapFlagsFromBinOp(OBO)) {
1746 auto *BO = cast<BinaryOperator>(I);
1747 BO->setHasNoUnsignedWrap(
1749 BO->setHasNoSignedWrap(
1751 }
1752 if (auto *NNI = dyn_cast<PossiblyNonNegInst>(I)) {
1753 auto *Src = NNI->getOperand(0);
1755 Constant::getNullValue(Src->getType()), I,
1756 SE.getDataLayout())
1757 .value_or(false))
1758 NNI->setNonNeg(true);
1759 }
1760}
1761
1762void SCEVExpander::replaceCongruentIVInc(
1763 PHINode *&Phi, PHINode *&OrigPhi, Loop *L, const DominatorTree *DT,
1765 BasicBlock *LatchBlock = L->getLoopLatch();
1766 if (!LatchBlock)
1767 return;
1768
1769 Instruction *OrigInc =
1770 dyn_cast<Instruction>(OrigPhi->getIncomingValueForBlock(LatchBlock));
1771 Instruction *IsomorphicInc =
1772 dyn_cast<Instruction>(Phi->getIncomingValueForBlock(LatchBlock));
1773 if (!OrigInc || !IsomorphicInc)
1774 return;
1775
1776 // If this phi has the same width but is more canonical, replace the
1777 // original with it. As part of the "more canonical" determination,
1778 // respect a prior decision to use an IV chain.
1779 if (OrigPhi->getType() == Phi->getType()) {
1780 bool Chained = ChainedPhis.contains(Phi);
1781 if (!(Chained || isExpandedAddRecExprPHI(OrigPhi, OrigInc, L)) &&
1782 (Chained || isExpandedAddRecExprPHI(Phi, IsomorphicInc, L))) {
1783 std::swap(OrigPhi, Phi);
1784 std::swap(OrigInc, IsomorphicInc);
1785 }
1786 }
1787
1788 // Replacing the congruent phi is sufficient because acyclic
1789 // redundancy elimination, CSE/GVN, should handle the
1790 // rest. However, once SCEV proves that a phi is congruent,
1791 // it's often the head of an IV user cycle that is isomorphic
1792 // with the original phi. It's worth eagerly cleaning up the
1793 // common case of a single IV increment so that DeleteDeadPHIs
1794 // can remove cycles that had postinc uses.
1795 // Because we may potentially introduce a new use of OrigIV that didn't
1796 // exist before at this point, its poison flags need readjustment.
1797 const SCEV *TruncExpr =
1798 SE.getTruncateOrNoop(SE.getSCEV(OrigInc), IsomorphicInc->getType());
1799 if (OrigInc == IsomorphicInc || TruncExpr != SE.getSCEV(IsomorphicInc) ||
1800 !SE.LI.replacementPreservesLCSSAForm(IsomorphicInc, OrigInc))
1801 return;
1802
1803 bool BothHaveNUW = false;
1804 bool BothHaveNSW = false;
1805 auto *OBOIncV = dyn_cast<OverflowingBinaryOperator>(OrigInc);
1806 auto *OBOIsomorphic = dyn_cast<OverflowingBinaryOperator>(IsomorphicInc);
1807 if (OBOIncV && OBOIsomorphic) {
1808 BothHaveNUW =
1809 OBOIncV->hasNoUnsignedWrap() && OBOIsomorphic->hasNoUnsignedWrap();
1810 BothHaveNSW =
1811 OBOIncV->hasNoSignedWrap() && OBOIsomorphic->hasNoSignedWrap();
1812 }
1813
1814 if (!hoistIVInc(OrigInc, IsomorphicInc,
1815 /*RecomputePoisonFlags*/ true))
1816 return;
1817
1818 // We are replacing with a wider increment. If both OrigInc and IsomorphicInc
1819 // are NUW/NSW, then we can preserve them on the wider increment; the narrower
1820 // IsomorphicInc would wrap before the wider OrigInc, so the replacement won't
1821 // make IsomorphicInc's uses more poisonous.
1822 assert(OrigInc->getType()->getScalarSizeInBits() >=
1823 IsomorphicInc->getType()->getScalarSizeInBits() &&
1824 "Should only replace an increment with a wider one.");
1825 if (BothHaveNUW || BothHaveNSW) {
1826 OrigInc->setHasNoUnsignedWrap(OBOIncV->hasNoUnsignedWrap() || BothHaveNUW);
1827 OrigInc->setHasNoSignedWrap(OBOIncV->hasNoSignedWrap() || BothHaveNSW);
1828 }
1829
1830 SCEV_DEBUG_WITH_TYPE(DebugType,
1831 dbgs() << "INDVARS: Eliminated congruent iv.inc: "
1832 << *IsomorphicInc << '\n');
1833 Value *NewInc = OrigInc;
1834 if (OrigInc->getType() != IsomorphicInc->getType()) {
1836 if (PHINode *PN = dyn_cast<PHINode>(OrigInc))
1837 IP = PN->getParent()->getFirstInsertionPt();
1838 else
1839 IP = OrigInc->getNextNode()->getIterator();
1840
1841 IRBuilder<> Builder(IP);
1842 Builder.SetCurrentDebugLocation(IsomorphicInc->getDebugLoc());
1843 NewInc =
1844 Builder.CreateTruncOrBitCast(OrigInc, IsomorphicInc->getType(), IVName);
1845 }
1846 IsomorphicInc->replaceAllUsesWith(NewInc);
1847 DeadInsts.emplace_back(IsomorphicInc);
1848}
1849
1850/// replaceCongruentIVs - Check for congruent phis in this loop header and
1851/// replace them with their most canonical representative. Return the number of
1852/// phis eliminated.
1853///
1854/// This does not depend on any SCEVExpander state but should be used in
1855/// the same context that SCEVExpander is used.
1856unsigned
1859 const TargetTransformInfo *TTI) {
1860 // Find integer phis in order of increasing width.
1862 llvm::make_pointer_range(L->getHeader()->phis()));
1863
1864 if (TTI)
1865 // Use stable_sort to preserve order of equivalent PHIs, so the order
1866 // of the sorted Phis is the same from run to run on the same loop.
1867 llvm::stable_sort(Phis, [](Value *LHS, Value *RHS) {
1868 // Put pointers at the back and make sure pointer < pointer = false.
1869 if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
1870 return RHS->getType()->isIntegerTy() && !LHS->getType()->isIntegerTy();
1871 return RHS->getType()->getPrimitiveSizeInBits().getFixedValue() <
1872 LHS->getType()->getPrimitiveSizeInBits().getFixedValue();
1873 });
1874
1875 unsigned NumElim = 0;
1877 // Process phis from wide to narrow. Map wide phis to their truncation
1878 // so narrow phis can reuse them.
1879 for (PHINode *Phi : Phis) {
1880 auto SimplifyPHINode = [&](PHINode *PN) -> Value * {
1881 if (Value *V = simplifyInstruction(PN, {DL, &SE.TLI, &SE.DT, &SE.AC}))
1882 return V;
1883 if (!SE.isSCEVable(PN->getType()))
1884 return nullptr;
1885 auto *Const = dyn_cast<SCEVConstant>(SE.getSCEV(PN));
1886 if (!Const)
1887 return nullptr;
1888 return Const->getValue();
1889 };
1890
1891 // Fold constant phis. They may be congruent to other constant phis and
1892 // would confuse the logic below that expects proper IVs.
1893 if (Value *V = SimplifyPHINode(Phi)) {
1894 if (V->getType() != Phi->getType())
1895 continue;
1896 SE.forgetValue(Phi);
1897 Phi->replaceAllUsesWith(V);
1898 DeadInsts.emplace_back(Phi);
1899 ++NumElim;
1900 SCEV_DEBUG_WITH_TYPE(DebugType,
1901 dbgs() << "INDVARS: Eliminated constant iv: " << *Phi
1902 << '\n');
1903 continue;
1904 }
1905
1906 if (!SE.isSCEVable(Phi->getType()))
1907 continue;
1908
1909 PHINode *&OrigPhiRef = ExprToIVMap[SE.getSCEV(Phi)];
1910 if (!OrigPhiRef) {
1911 OrigPhiRef = Phi;
1912 if (Phi->getType()->isIntegerTy() && TTI &&
1913 TTI->isTruncateFree(Phi->getType(), Phis.back()->getType())) {
1914 // Make sure we only rewrite using simple induction variables;
1915 // otherwise, we can make the trip count of a loop unanalyzable
1916 // to SCEV.
1917 const SCEV *PhiExpr = SE.getSCEV(Phi);
1918 if (isa<SCEVAddRecExpr>(PhiExpr)) {
1919 // This phi can be freely truncated to the narrowest phi type. Map the
1920 // truncated expression to it so it will be reused for narrow types.
1921 const SCEV *TruncExpr =
1922 SE.getTruncateExpr(PhiExpr, Phis.back()->getType());
1923 ExprToIVMap[TruncExpr] = Phi;
1924 }
1925 }
1926 continue;
1927 }
1928
1929 // Replacing a pointer phi with an integer phi or vice-versa doesn't make
1930 // sense.
1931 if (OrigPhiRef->getType()->isPointerTy() != Phi->getType()->isPointerTy())
1932 continue;
1933
1934 replaceCongruentIVInc(Phi, OrigPhiRef, L, DT, DeadInsts);
1935 SCEV_DEBUG_WITH_TYPE(DebugType,
1936 dbgs() << "INDVARS: Eliminated congruent iv: " << *Phi
1937 << '\n');
1939 DebugType, dbgs() << "INDVARS: Original iv: " << *OrigPhiRef << '\n');
1940 ++NumElim;
1941 Value *NewIV = OrigPhiRef;
1942 if (OrigPhiRef->getType() != Phi->getType()) {
1943 IRBuilder<> Builder(L->getHeader()->getFirstInsertionPt());
1944 Builder.SetCurrentDebugLocation(Phi->getDebugLoc());
1945 NewIV = Builder.CreateTruncOrBitCast(OrigPhiRef, Phi->getType(), IVName);
1946 }
1947 Phi->replaceAllUsesWith(NewIV);
1948 DeadInsts.emplace_back(Phi);
1949 }
1950 return NumElim;
1951}
1952
1954 const Instruction *At,
1955 Loop *L) {
1956 using namespace llvm::PatternMatch;
1957
1958 SmallVector<BasicBlock *, 4> ExitingBlocks;
1959 L->getExitingBlocks(ExitingBlocks);
1960
1961 // Look for suitable value in simple conditions at the loop exits.
1962 for (BasicBlock *BB : ExitingBlocks) {
1963 CmpPredicate Pred;
1964 Instruction *LHS, *RHS;
1965
1966 if (!match(BB->getTerminator(),
1967 m_Br(m_ICmp(Pred, m_Instruction(LHS), m_Instruction(RHS)),
1969 continue;
1970
1971 if (SE.getSCEV(LHS) == S && SE.DT.dominates(LHS, At))
1972 return true;
1973
1974 if (SE.getSCEV(RHS) == S && SE.DT.dominates(RHS, At))
1975 return true;
1976 }
1977
1978 // Use expand's logic which is used for reusing a previous Value in
1979 // ExprValueMap. Note that we don't currently model the cost of
1980 // needing to drop poison generating flags on the instruction if we
1981 // want to reuse it. We effectively assume that has zero cost.
1982 SmallVector<Instruction *> DropPoisonGeneratingInsts;
1983 return FindValueInExprValueMap(S, At, DropPoisonGeneratingInsts) != nullptr;
1984}
1985
1986template<typename T> static InstructionCost costAndCollectOperands(
1989 SmallVectorImpl<SCEVOperand> &Worklist) {
1990
1991 const T *S = cast<T>(WorkItem.S);
1992 InstructionCost Cost = 0;
1993 // Object to help map SCEV operands to expanded IR instructions.
1994 struct OperationIndices {
1995 OperationIndices(unsigned Opc, size_t min, size_t max) :
1996 Opcode(Opc), MinIdx(min), MaxIdx(max) { }
1997 unsigned Opcode;
1998 size_t MinIdx;
1999 size_t MaxIdx;
2000 };
2001
2002 // Collect the operations of all the instructions that will be needed to
2003 // expand the SCEVExpr. This is so that when we come to cost the operands,
2004 // we know what the generated user(s) will be.
2006
2007 auto CastCost = [&](unsigned Opcode) -> InstructionCost {
2008 Operations.emplace_back(Opcode, 0, 0);
2009 return TTI.getCastInstrCost(Opcode, S->getType(),
2010 S->getOperand(0)->getType(),
2011 TTI::CastContextHint::None, CostKind);
2012 };
2013
2014 auto ArithCost = [&](unsigned Opcode, unsigned NumRequired,
2015 unsigned MinIdx = 0,
2016 unsigned MaxIdx = 1) -> InstructionCost {
2017 Operations.emplace_back(Opcode, MinIdx, MaxIdx);
2018 return NumRequired *
2019 TTI.getArithmeticInstrCost(Opcode, S->getType(), CostKind);
2020 };
2021
2022 auto CmpSelCost = [&](unsigned Opcode, unsigned NumRequired, unsigned MinIdx,
2023 unsigned MaxIdx) -> InstructionCost {
2024 Operations.emplace_back(Opcode, MinIdx, MaxIdx);
2025 Type *OpType = S->getType();
2026 return NumRequired * TTI.getCmpSelInstrCost(
2027 Opcode, OpType, CmpInst::makeCmpResultType(OpType),
2028 CmpInst::BAD_ICMP_PREDICATE, CostKind);
2029 };
2030
2031 switch (S->getSCEVType()) {
2032 case scCouldNotCompute:
2033 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
2034 case scUnknown:
2035 case scConstant:
2036 case scVScale:
2037 return 0;
2038 case scPtrToAddr:
2039 Cost = CastCost(Instruction::PtrToAddr);
2040 break;
2041 case scTruncate:
2042 Cost = CastCost(Instruction::Trunc);
2043 break;
2044 case scZeroExtend:
2045 Cost = CastCost(Instruction::ZExt);
2046 break;
2047 case scSignExtend:
2048 Cost = CastCost(Instruction::SExt);
2049 break;
2050 case scUDivExpr: {
2051 unsigned Opcode = Instruction::UDiv;
2052 if (auto *SC = dyn_cast<SCEVConstant>(S->getOperand(1)))
2053 if (SC->getAPInt().isPowerOf2())
2054 Opcode = Instruction::LShr;
2055 Cost = ArithCost(Opcode, 1);
2056 break;
2057 }
2058 case scAddExpr:
2059 Cost = ArithCost(Instruction::Add, S->getNumOperands() - 1);
2060 break;
2061 case scMulExpr: {
2062 // Match the actual expansion in visitMulExpr: multiply by -1 is
2063 // expanded as a negate (sub 0, x), and multiply by a power of 2 is
2064 // expanded as a shift. Only handle the common two-operand case with a
2065 // constant LHS; for everything else fall back to the pessimistic
2066 // all-multiplies estimate.
2067 // TODO: this is still pessimistic for the general case because of the
2068 // Bin Pow algorithm actually used by the expander, see
2069 // SCEVExpander::visitMulExpr(), ExpandOpBinPowN().
2070 unsigned OpCode = Instruction::Mul;
2071 if (S->getNumOperands() == 2)
2072 if (auto *SC = dyn_cast<SCEVConstant>(S->getOperand(0))) {
2073 if (SC->getAPInt().isAllOnes()) // -1
2074 OpCode = Instruction::Sub;
2075 else if (SC->getAPInt().isPowerOf2())
2076 OpCode = Instruction::Shl;
2077 }
2078 Cost = ArithCost(OpCode, S->getNumOperands() - 1);
2079 break;
2080 }
2081 case scSMaxExpr:
2082 case scUMaxExpr:
2083 case scSMinExpr:
2084 case scUMinExpr:
2085 case scSequentialUMinExpr: {
2086 // FIXME: should this ask the cost for Intrinsic's?
2087 // The reduction tree.
2088 Cost += CmpSelCost(Instruction::ICmp, S->getNumOperands() - 1, 0, 1);
2089 Cost += CmpSelCost(Instruction::Select, S->getNumOperands() - 1, 0, 2);
2090 switch (S->getSCEVType()) {
2091 case scSequentialUMinExpr: {
2092 // The safety net against poison.
2093 // FIXME: this is broken.
2094 Cost += CmpSelCost(Instruction::ICmp, S->getNumOperands() - 1, 0, 0);
2095 Cost += ArithCost(Instruction::Or,
2096 S->getNumOperands() > 2 ? S->getNumOperands() - 2 : 0);
2097 Cost += CmpSelCost(Instruction::Select, 1, 0, 1);
2098 break;
2099 }
2100 default:
2102 "Unhandled SCEV expression type?");
2103 break;
2104 }
2105 break;
2106 }
2107 case scAddRecExpr: {
2108 // Addrec expands to a phi and add per recurrence.
2109 unsigned NumRecurrences = S->getNumOperands() - 1;
2110 Cost += TTI.getCFInstrCost(Instruction::PHI, CostKind) * NumRecurrences;
2111 Cost +=
2112 TTI.getArithmeticInstrCost(Instruction::Add, S->getType(), CostKind) *
2113 NumRecurrences;
2114 // AR start is used in phi.
2115 Worklist.emplace_back(Instruction::PHI, 0, S->getOperand(0));
2116 // Other operands are used in add.
2117 for (const SCEV *Op : S->operands().drop_front())
2118 Worklist.emplace_back(Instruction::Add, 1, Op);
2119 break;
2120 }
2121 }
2122
2123 for (auto &CostOp : Operations) {
2124 for (auto SCEVOp : enumerate(S->operands())) {
2125 // Clamp the index to account for multiple IR operations being chained.
2126 size_t MinIdx = std::max(SCEVOp.index(), CostOp.MinIdx);
2127 size_t OpIdx = std::min(MinIdx, CostOp.MaxIdx);
2128 Worklist.emplace_back(CostOp.Opcode, OpIdx, SCEVOp.value());
2129 }
2130 }
2131 return Cost;
2132}
2133
2134bool SCEVExpander::isHighCostExpansionHelper(
2135 const SCEVOperand &WorkItem, Loop *L, const Instruction &At,
2136 InstructionCost &Cost, unsigned Budget, const TargetTransformInfo &TTI,
2138 SmallVectorImpl<SCEVOperand> &Worklist) {
2139 if (Cost > Budget)
2140 return true; // Already run out of budget, give up.
2141
2142 const SCEV *S = WorkItem.S;
2143 // Was the cost of expansion of this expression already accounted for?
2144 if (!isa<SCEVConstant>(S) && !Processed.insert(S).second)
2145 return false; // We have already accounted for this expression.
2146
2147 // If we can find an existing value for this scev available at the point "At"
2148 // then consider the expression cheap.
2149 if (hasRelatedExistingExpansion(S, &At, L))
2150 return false; // Consider the expression to be free.
2151
2153 L->getHeader()->getParent()->hasMinSize()
2156
2157 switch (S->getSCEVType()) {
2158 case scCouldNotCompute:
2159 llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
2160 case scUnknown:
2161 case scVScale:
2162 // Assume to be zero-cost.
2163 return false;
2164 case scConstant: {
2165 // Only evalulate the costs of constants when optimizing for size.
2166 if (CostKind != TargetTransformInfo::TCK_CodeSize)
2167 return false;
2168 const APInt &Imm = cast<SCEVConstant>(S)->getAPInt();
2169 Type *Ty = S->getType();
2171 WorkItem.ParentOpcode, WorkItem.OperandIdx, Imm, Ty, CostKind);
2172 return Cost > Budget;
2173 }
2174 case scTruncate:
2175 case scPtrToAddr:
2176 case scZeroExtend:
2177 case scSignExtend: {
2178 Cost +=
2179 costAndCollectOperands<SCEVCastExpr>(WorkItem, TTI, CostKind, Worklist);
2180 return false; // Will answer upon next entry into this function.
2181 }
2182 case scUDivExpr: {
2183 // UDivExpr is very likely a UDiv that ScalarEvolution's HowFarToZero or
2184 // HowManyLessThans produced to compute a precise expression, rather than a
2185 // UDiv from the user's code. If we can't find a UDiv in the code with some
2186 // simple searching, we need to account for it's cost.
2187
2188 // At the beginning of this function we already tried to find existing
2189 // value for plain 'S'. Now try to lookup 'S + 1' since it is common
2190 // pattern involving division. This is just a simple search heuristic.
2192 SE.getAddExpr(S, SE.getConstant(S->getType(), 1)), &At, L))
2193 return false; // Consider it to be free.
2194
2195 Cost +=
2196 costAndCollectOperands<SCEVUDivExpr>(WorkItem, TTI, CostKind, Worklist);
2197 return false; // Will answer upon next entry into this function.
2198 }
2199 case scAddExpr:
2200 case scMulExpr:
2201 case scUMaxExpr:
2202 case scSMaxExpr:
2203 case scUMinExpr:
2204 case scSMinExpr:
2205 case scSequentialUMinExpr: {
2206 assert(cast<SCEVNAryExpr>(S)->getNumOperands() > 1 &&
2207 "Nary expr should have more than 1 operand.");
2208 // The simple nary expr will require one less op (or pair of ops)
2209 // than the number of it's terms.
2210 Cost +=
2211 costAndCollectOperands<SCEVNAryExpr>(WorkItem, TTI, CostKind, Worklist);
2212 return Cost > Budget;
2213 }
2214 case scAddRecExpr: {
2215 assert(cast<SCEVAddRecExpr>(S)->getNumOperands() >= 2 &&
2216 "Polynomial should be at least linear");
2218 WorkItem, TTI, CostKind, Worklist);
2219 return Cost > Budget;
2220 }
2221 }
2222 llvm_unreachable("Unknown SCEV kind!");
2223}
2224
2226 Instruction *IP) {
2227 assert(IP);
2228 switch (Pred->getKind()) {
2233 case SCEVPredicate::P_Wrap: {
2234 auto *AddRecPred = cast<SCEVWrapPredicate>(Pred);
2235 return expandWrapPredicate(AddRecPred, IP);
2236 }
2237 }
2238 llvm_unreachable("Unknown SCEV predicate type");
2239}
2240
2242 Instruction *IP) {
2243 Value *Expr0 = expand(Pred->getLHS(), IP);
2244 Value *Expr1 = expand(Pred->getRHS(), IP);
2245
2246 Builder.SetInsertPoint(IP);
2247 auto InvPred = ICmpInst::getInversePredicate(Pred->getPredicate());
2248 auto *I = Builder.CreateICmp(InvPred, Expr0, Expr1, "ident.check");
2249 return I;
2250}
2251
2253 Instruction *Loc, bool Signed) {
2254 assert(AR->isAffine() && "Cannot generate RT check for "
2255 "non-affine expression");
2256
2257 // FIXME: It is highly suspicious that we're ignoring the predicates here.
2259 const SCEV *ExitCount =
2260 SE.getPredicatedSymbolicMaxBackedgeTakenCount(AR->getLoop(), Pred);
2261
2262 assert(!isa<SCEVCouldNotCompute>(ExitCount) && "Invalid loop count");
2263
2264 const SCEV *Step = AR->getStepRecurrence(SE);
2265 const SCEV *Start = AR->getStart();
2266
2267 Type *ARTy = AR->getType();
2268 unsigned SrcBits = SE.getTypeSizeInBits(ExitCount->getType());
2269 unsigned DstBits = SE.getTypeSizeInBits(ARTy);
2270
2271 // The expression {Start,+,Step} has nusw/nssw if
2272 // Step < 0, Start - |Step| * Backedge <= Start
2273 // Step >= 0, Start + |Step| * Backedge > Start
2274 // and |Step| * Backedge doesn't unsigned overflow.
2275
2276 Builder.SetInsertPoint(Loc);
2277 Value *TripCountVal = expand(ExitCount, Loc);
2278
2279 IntegerType *Ty =
2280 IntegerType::get(Loc->getContext(), SE.getTypeSizeInBits(ARTy));
2281
2282 Value *StepValue = expand(Step, Loc);
2283 Value *NegStepValue = expand(SE.getNegativeSCEV(Step), Loc);
2284 Value *StartValue = expand(Start, Loc);
2285
2286 ConstantInt *Zero =
2287 ConstantInt::get(Loc->getContext(), APInt::getZero(DstBits));
2288
2289 Builder.SetInsertPoint(Loc);
2290 // Compute |Step|
2291 Value *StepCompare = Builder.CreateICmp(ICmpInst::ICMP_SLT, StepValue, Zero);
2292 Value *AbsStep = Builder.CreateSelectWithUnknownProfile(
2293 StepCompare, NegStepValue, StepValue, "scev-expander");
2294
2295 // Compute |Step| * Backedge
2296 // Compute:
2297 // 1. Start + |Step| * Backedge < Start
2298 // 2. Start - |Step| * Backedge > Start
2299 //
2300 // And select either 1. or 2. depending on whether step is positive or
2301 // negative. If Step is known to be positive or negative, only create
2302 // either 1. or 2.
2303 auto ComputeEndCheck = [&]() -> Value * {
2304 // Check to see if we already expanded this here.
2305 Value *MulV, *OfMul;
2306 auto Key = std::make_tuple(TripCountVal, AbsStep, Loc);
2307 auto I = InsertedOverflowChecks.find(Key);
2308 if (I != InsertedOverflowChecks.end()) {
2309 MulV = I->second.first;
2310 OfMul = I->second.second;
2311 } else {
2312 // Get the backedge taken count and truncate or extended to the AR type.
2313 Value *TruncTripCount = Builder.CreateZExtOrTrunc(TripCountVal, Ty);
2314 Value *Mul = Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, Ty,
2315 {AbsStep, TruncTripCount},
2316 /*FMFSource=*/nullptr, "mul");
2317 MulV = Builder.CreateExtractValue(Mul, 0, "mul.result");
2318 OfMul = Builder.CreateExtractValue(Mul, 1, "mul.overflow");
2319
2320 // The type Ty is already encoded in AbsStep.
2321 InsertedOverflowChecks[Key] = {MulV, OfMul};
2322 }
2323
2324 Value *Add = nullptr, *Sub = nullptr;
2325 bool NeedPosCheck = !SE.isKnownNegative(Step);
2326 bool NeedNegCheck = !SE.isKnownPositive(Step);
2327
2328 if (isa<PointerType>(ARTy)) {
2329 Value *NegMulV = Builder.CreateNeg(MulV);
2330 if (NeedPosCheck)
2331 Add = Builder.CreatePtrAdd(StartValue, MulV);
2332 if (NeedNegCheck)
2333 Sub = Builder.CreatePtrAdd(StartValue, NegMulV);
2334 } else {
2335 if (NeedPosCheck)
2336 Add = Builder.CreateAdd(StartValue, MulV);
2337 if (NeedNegCheck)
2338 Sub = Builder.CreateSub(StartValue, MulV);
2339 }
2340
2341 Value *EndCompareLT = nullptr;
2342 Value *EndCompareGT = nullptr;
2343 Value *EndCheck = nullptr;
2344 if (NeedPosCheck)
2345 EndCheck = EndCompareLT = Builder.CreateICmp(
2347 if (NeedNegCheck)
2348 EndCheck = EndCompareGT = Builder.CreateICmp(
2350 if (NeedPosCheck && NeedNegCheck) {
2351 // Select the answer based on the sign of Step.
2352 EndCheck = Builder.CreateSelectWithUnknownProfile(
2353 StepCompare, EndCompareGT, EndCompareLT, "scev-expander");
2354 }
2355 return Builder.CreateOr(EndCheck, OfMul);
2356 };
2357 Value *EndCheck = ComputeEndCheck();
2358
2359 // If the backedge taken count type is larger than the AR type,
2360 // check that we don't drop any bits by truncating it. If we are
2361 // dropping bits, then we have overflow (unless the step is zero).
2362 if (SrcBits > DstBits) {
2363 auto MaxVal = APInt::getMaxValue(DstBits).zext(SrcBits);
2364 auto *BackedgeCheck =
2365 Builder.CreateICmp(ICmpInst::ICMP_UGT, TripCountVal,
2366 ConstantInt::get(Loc->getContext(), MaxVal));
2367 BackedgeCheck = Builder.CreateAnd(
2368 BackedgeCheck, Builder.CreateICmp(ICmpInst::ICMP_NE, StepValue, Zero));
2369
2370 EndCheck = Builder.CreateOr(EndCheck, BackedgeCheck);
2371 }
2372
2373 return EndCheck;
2374}
2375
2377 Instruction *IP) {
2378 const auto *A = cast<SCEVAddRecExpr>(Pred->getExpr());
2379 Value *NSSWCheck = nullptr, *NUSWCheck = nullptr;
2380
2381 // Add a check for NUSW
2382 if (Pred->getFlags() & SCEVWrapPredicate::IncrementNUSW)
2383 NUSWCheck = generateOverflowCheck(A, IP, false);
2384
2385 // Add a check for NSSW
2386 if (Pred->getFlags() & SCEVWrapPredicate::IncrementNSSW)
2387 NSSWCheck = generateOverflowCheck(A, IP, true);
2388
2389 if (NUSWCheck && NSSWCheck)
2390 return Builder.CreateOr(NUSWCheck, NSSWCheck);
2391
2392 if (NUSWCheck)
2393 return NUSWCheck;
2394
2395 if (NSSWCheck)
2396 return NSSWCheck;
2397
2398 return ConstantInt::getFalse(IP->getContext());
2399}
2400
2402 Instruction *IP) {
2403 // Loop over all checks in this set.
2404 SmallVector<Value *> Checks;
2405 for (const auto *Pred : Union->getPredicates()) {
2406 Checks.push_back(expandCodeForPredicate(Pred, IP));
2407 Builder.SetInsertPoint(IP);
2408 }
2409
2410 if (Checks.empty())
2411 return ConstantInt::getFalse(IP->getContext());
2412 return Builder.CreateOr(Checks);
2413}
2414
2415Value *SCEVExpander::fixupLCSSAFormFor(Value *V) {
2416 auto *DefI = dyn_cast<Instruction>(V);
2417 if (!PreserveLCSSA || !DefI)
2418 return V;
2419
2420 BasicBlock::iterator InsertPt = Builder.GetInsertPoint();
2421 Loop *DefLoop = SE.LI.getLoopFor(DefI->getParent());
2422 Loop *UseLoop = SE.LI.getLoopFor(InsertPt->getParent());
2423 if (!DefLoop || UseLoop == DefLoop || DefLoop->contains(UseLoop))
2424 return V;
2425
2426 // Create a temporary instruction to at the current insertion point, so we
2427 // can hand it off to the helper to create LCSSA PHIs if required for the
2428 // new use.
2429 // FIXME: Ideally formLCSSAForInstructions (used in fixupLCSSAFormFor)
2430 // would accept a insertion point and return an LCSSA phi for that
2431 // insertion point, so there is no need to insert & remove the temporary
2432 // instruction.
2433 Type *ToTy;
2434 if (DefI->getType()->isIntegerTy())
2435 ToTy = PointerType::get(DefI->getContext(), 0);
2436 else
2437 ToTy = Type::getInt32Ty(DefI->getContext());
2438 Instruction *User =
2439 CastInst::CreateBitOrPointerCast(DefI, ToTy, "tmp.lcssa.user", InsertPt);
2440 llvm::scope_exit RemoveUserOnExit([User]() { User->eraseFromParent(); });
2441
2443 ToUpdate.push_back(DefI);
2444 SmallVector<PHINode *, 16> PHIsToRemove;
2445 SmallVector<PHINode *, 16> InsertedPHIs;
2446 formLCSSAForInstructions(ToUpdate, SE.DT, SE.LI, &SE, &PHIsToRemove,
2447 &InsertedPHIs);
2448 for (PHINode *PN : InsertedPHIs)
2449 rememberInstruction(PN);
2450 for (PHINode *PN : PHIsToRemove) {
2451 if (!PN->use_empty())
2452 continue;
2453 InsertedValues.erase(PN);
2454 InsertedPostIncValues.erase(PN);
2455 PN->eraseFromParent();
2456 }
2457
2458 return User->getOperand(0);
2459}
2460
2461namespace {
2462// Search for a SCEV subexpression that is not safe to expand. Any expression
2463// that may expand to a !isSafeToSpeculativelyExecute value is unsafe, namely
2464// UDiv expressions. We don't know if the UDiv is derived from an IR divide
2465// instruction, but the important thing is that we prove the denominator is
2466// nonzero before expansion.
2467//
2468// IVUsers already checks that IV-derived expressions are safe. So this check is
2469// only needed when the expression includes some subexpression that is not IV
2470// derived.
2471//
2472// Currently, we only allow division by a value provably non-zero here.
2473//
2474// We cannot generally expand recurrences unless the step dominates the loop
2475// header. The expander handles the special case of affine recurrences by
2476// scaling the recurrence outside the loop, but this technique isn't generally
2477// applicable. Expanding a nested recurrence outside a loop requires computing
2478// binomial coefficients. This could be done, but the recurrence has to be in a
2479// perfectly reduced form, which can't be guaranteed.
2480struct SCEVFindUnsafe {
2481 ScalarEvolution &SE;
2482 bool CanonicalMode;
2483 bool IsUnsafe = false;
2484
2485 SCEVFindUnsafe(ScalarEvolution &SE, bool CanonicalMode)
2486 : SE(SE), CanonicalMode(CanonicalMode) {}
2487
2488 bool follow(const SCEV *S) {
2489 if (const SCEVUDivExpr *D = dyn_cast<SCEVUDivExpr>(S)) {
2490 if (!SE.isKnownNonZero(D->getRHS()) ||
2491 !SE.isGuaranteedNotToBePoison(D->getRHS())) {
2492 IsUnsafe = true;
2493 return false;
2494 }
2495 }
2496 if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(S)) {
2497 // For non-affine addrecs or in non-canonical mode we need a preheader
2498 // to insert into.
2499 if (!AR->getLoop()->getLoopPreheader() &&
2500 (!CanonicalMode || !AR->isAffine())) {
2501 IsUnsafe = true;
2502 return false;
2503 }
2504 }
2505 return true;
2506 }
2507 bool isDone() const { return IsUnsafe; }
2508};
2509} // namespace
2510
2512 SCEVFindUnsafe Search(SE, CanonicalMode);
2513 visitAll(S, Search);
2514 return !Search.IsUnsafe;
2515}
2516
2518 const Instruction *InsertionPoint) const {
2519 if (!isSafeToExpand(S))
2520 return false;
2521 // We have to prove that the expanded site of S dominates InsertionPoint.
2522 // This is easy when not in the same block, but hard when S is an instruction
2523 // to be expanded somewhere inside the same block as our insertion point.
2524 // What we really need here is something analogous to an OrderedBasicBlock,
2525 // but for the moment, we paper over the problem by handling two common and
2526 // cheap to check cases.
2527 if (SE.properlyDominates(S, InsertionPoint->getParent()))
2528 return true;
2529 if (SE.dominates(S, InsertionPoint->getParent())) {
2530 if (InsertionPoint->getParent()->getTerminator() == InsertionPoint)
2531 return true;
2532 if (const SCEVUnknown *U = dyn_cast<SCEVUnknown>(S))
2533 if (llvm::is_contained(InsertionPoint->operand_values(), U->getValue()))
2534 return true;
2535 }
2536 return false;
2537}
2538
2540 // Result is used, nothing to remove.
2541 if (ResultUsed)
2542 return;
2543
2544 // Restore original poison flags.
2545 for (auto [I, Flags] : Expander.OrigFlags)
2546 Flags.apply(I);
2547
2548 auto InsertedInstructions = Expander.getAllInsertedInstructions();
2549#ifndef NDEBUG
2551 InsertedInstructions);
2552 (void)InsertedSet;
2553#endif
2554 // Remove sets with value handles.
2555 Expander.clear();
2556
2557 // Remove all inserted instructions.
2558 for (Instruction *I : reverse(InsertedInstructions)) {
2559#ifndef NDEBUG
2560 assert(all_of(I->users(),
2561 [&InsertedSet](Value *U) {
2562 return InsertedSet.contains(cast<Instruction>(U));
2563 }) &&
2564 "removed instruction should only be used by instructions inserted "
2565 "during expansion");
2566#endif
2567 assert(!I->getType()->isVoidTy() &&
2568 "inserted instruction should have non-void types");
2569 I->replaceAllUsesWith(PoisonValue::get(I->getType()));
2570 I->eraseFromParent();
2571 }
2572}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
uint64_t uint64_t
uint64_t Imm
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
#define X(NUM, ENUM, NAME)
Definition ELF.h:665
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static Expected< BitVector > expand(StringRef S, StringRef Original)
Hexagon Common GEP
Hexagon Hardware Loops
#define I(x, y, z)
Definition MD5.cpp:57
#define T
#define P(N)
if(PassOpts->AAPipeline)
This file contains the declarations for profiling metadata utility functions.
int64_t C1
This file contains some templates that are useful if you are working with the STL at all.
static const Loop * PickMostRelevantLoop(const Loop *A, const Loop *B, DominatorTree &DT)
PickMostRelevantLoop - Given two loops pick the one that's most relevant for SCEV expansion.
static InstructionCost costAndCollectOperands(const SCEVOperand &WorkItem, const TargetTransformInfo &TTI, TargetTransformInfo::TargetCostKind CostKind, SmallVectorImpl< SCEVOperand > &Worklist)
static bool canBeCheaplyTransformed(ScalarEvolution &SE, const SCEVAddRecExpr *Phi, const SCEVAddRecExpr *Requested, bool &InvertStep)
Check whether we can cheaply express the requested SCEV in terms of the available PHI SCEV by truncat...
#define SCEV_DEBUG_WITH_TYPE(TYPE, X)
static bool canReuseCastForPtrToAddr(const CastInst *CI, Type *Ty, const DataLayout &DL)
Return true if CI computes the same value as a ptrtoaddr of its pointer operand to Ty.
This file defines the scope_exit class, which executes user-defined cleanup logic at scope exit.
This pass exposes codegen information to IR-level passes.
Value * RHS
Value * LHS
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
Definition APInt.cpp:1057
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
Definition APInt.h:202
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
Definition APInt.h:196
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
Definition APInt.h:282
This class represents an incoming formal argument to a Function.
Definition Argument.h:32
LLVM Basic Block Representation.
Definition BasicBlock.h:62
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
Definition BasicBlock.h:509
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
InstListType::iterator iterator
Instruction iterators...
Definition BasicBlock.h:170
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
Definition BasicBlock.h:237
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
This is the base class for all instructions that perform data casts.
Definition InstrTypes.h:512
Type * getSrcTy() const
Return the source type, as a convenience.
Definition InstrTypes.h:679
static LLVM_ABI Instruction::CastOps getCastOpcode(const Value *Val, bool SrcIsSigned, Type *Ty, bool DstIsSigned)
Returns the opcode necessary to cast Val into Ty using usual casting rules.
Instruction::CastOps getOpcode() const
Return the opcode of this CastInst.
Definition InstrTypes.h:674
static LLVM_ABI CastInst * CreateBitOrPointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
@ ICMP_SLT
signed less than
Definition InstrTypes.h:769
@ ICMP_UGT
unsigned greater than
Definition InstrTypes.h:763
@ ICMP_SGT
signed greater than
Definition InstrTypes.h:767
@ ICMP_ULT
unsigned less than
Definition InstrTypes.h:765
@ ICMP_NE
not equal
Definition InstrTypes.h:762
@ ICMP_SGE
signed greater or equal
Definition InstrTypes.h:768
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
Definition InstrTypes.h:852
An abstraction over a floating-point predicate, and a pack of an integer predicate with samesign info...
static LLVM_ABI Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
This is the shared class of boolean and integer constants.
Definition Constants.h:87
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Definition DataLayout.h:64
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition Dominators.h:122
LLVM_ABI bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
static GEPNoWrapFlags noUnsignedWrap()
static GEPNoWrapFlags none()
This provides a uniform API for creating instructions and inserting them into a basic block: either a...
Definition IRBuilder.h:2909
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
LLVM_ABI bool comesBefore(const Instruction *Other) const
Given an instruction Other in the same basic block as this instruction, return true if this instructi...
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
Definition Type.cpp:338
bool contains(const LoopT *L) const
Return true if the specified loop is contained within this loop.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
ICmpInst::Predicate getPredicate() const
Returns the comparison predicate underlying the intrinsic.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
bool isComplete() const
If the PHI node is complete which means all of its parent's predecessors have incoming value in this ...
Value * getIncomingValueForBlock(const BasicBlock *BB) const
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
Definition Type.cpp:887
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
This node represents a polynomial recurrence on the trip count of the specified loop.
bool isAffine() const
Return true if this represents an expression A + B*x where A and B are loop invariant values.
SCEVUse getStepRecurrence(ScalarEvolution &SE) const
Constructs and returns the recurrence indicating how much this expression steps by.
This class represents an assumption that the expression LHS Pred RHS evaluates to true,...
ConstantInt * getValue() const
const APInt & getAPInt() const
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.
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...
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...
LLVM_ABI unsigned replaceCongruentIVs(Loop *L, const DominatorTree *DT, SmallVectorImpl< WeakTrackingVH > &DeadInsts, const TargetTransformInfo *TTI=nullptr)
replace congruent phis with their most canonical representative.
static LLVM_ABI void dropPoisonGeneratingAnnotationsAndReinfer(ScalarEvolution &SE, Instruction *I)
Drop poison-generating flags from I, then try re-infer via SCEV.
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.
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.
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...
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...
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...
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.
static LLVM_ABI std::pair< PHINode *, const SCEV * > findReusableLCSSAPhi(ScalarEvolution &SE, SCEVUseT< const SCEVAddRecExpr * > S, const BasicBlock *InsertBB)
Find a phi in the exit block of S's loop, which must dominate InsertBB, such that S can be expanded i...
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 means that we are dealing with an entirely unknown SCEV value, and only represent it as its LLVM...
This class represents an assumption made on an AddRec expression.
This class represents an analyzed expression in the program.
static constexpr auto FlagNUW
LLVM_ABI bool isNonConstantNegative() const
Return true if the specified scev is negated, but not a constant.
static constexpr auto FlagNSW
LLVM_ABI ArrayRef< SCEVUse > operands() const
Return operands of this SCEV expression.
Type * getType() const
Return the LLVM type of this SCEV expression.
static constexpr auto FlagNone
SCEVTypes getSCEVType() const
static constexpr auto FlagNW
The main scalar evolution driver.
LLVM_ABI bool isKnownNonZero(const SCEV *S)
Test if the given expression is known to be non-zero.
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEVFlags Flags=SCEV::FlagNone, unsigned Depth=0)
Return LHS-RHS.
static LLVM_ABI bool isGuaranteedNotToBePoison(const SCEV *Op)
Returns true if Op is guaranteed to not be poison.
LLVM_ABI const SCEV * getTruncateOrNoop(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
static SCEVFlags clearFlags(SCEVFlags Flags, SCEVFlags OffFlags)
static SCEVFlags maskFlags(SCEVFlags Flags, SCEVFlags Mask)
Convenient SCEVFlags manipulation.
LLVM_ABI bool containsAddRecurrence(const SCEV *S)
Return true if the SCEV is a scAddRecExpr or it contains scAddRecExpr.
LLVM_ABI bool canReuseInstruction(const SCEV *S, Instruction *I, SmallVectorImpl< Instruction * > &DropPoisonGeneratingInsts)
Check whether it is poison-safe to represent the expression S using the instruction I.
A templated base class for SmallPtrSet which provides the typesafe interface that is common across al...
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
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)
void push_back(const T &Elt)
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.
LLVM_ABI InstructionCost getIntImmCostInst(unsigned Opc, unsigned Idx, const APInt &Imm, Type *Ty, TargetCostKind CostKind, Instruction *Inst=nullptr) const
Return the expected cost of materialization for the given integer immediate of the specified type for...
TargetCostKind
The kind of cost model.
@ TCK_RecipThroughput
Reciprocal throughput.
@ TCK_CodeSize
Instruction code size.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
LLVM_ABI unsigned getIntegerBitWidth() const
bool isVectorTy() const
True if this is an instance of VectorType.
Definition Type.h:283
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
Definition Type.cpp:299
bool isPointerTy() const
True if this is an instance of PointerType.
Definition Type.h:277
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
Definition Type.cpp:222
bool isIntegerTy() const
True if this is an instance of IntegerType.
Definition Type.h:252
A Use represents the edge between a Value definition and its users.
Definition Use.h:35
op_range operands()
Definition User.h:267
Value * getOperand(unsigned i) const
Definition User.h:207
unsigned getNumOperands() const
Definition User.h:229
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:257
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:549
LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.h:260
iterator_range< user_iterator > users()
Definition Value.h:428
bool use_empty() const
Definition Value.h:348
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
Definition ilist_node.h:34
self_iterator getIterator()
Definition ilist_node.h:123
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
Definition ilist_node.h:348
#define UINT64_MAX
Definition DataTypes.h:77
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr bool any(E Val)
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ BasicBlock
Various leaf nodes.
Definition ISDOpcodes.h:83
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
bool match(Val *V, const Pattern &P)
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
auto m_BasicBlock()
Match an arbitrary basic block value and ignore it.
auto m_Value()
Match an arbitrary value and ignore it.
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
brc_match< Cond_t, match_bind< BasicBlock >, match_bind< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
cst_pred_ty< is_all_ones > m_scev_AllOnes()
Match an integer with all bits set.
SCEVUnaryExpr_match< SCEVPtrToAddrExpr, Op0_t > m_scev_PtrToAddr(const Op0_t &Op0)
match_bind< const SCEVMulExpr > m_scev_Mul(const SCEVMulExpr *&V)
SCEVBinaryExpr_match< SCEVUDivExpr, Op0_t, Op1_t > m_scev_UDiv(const Op0_t &Op0, const Op1_t &Op1)
SCEVBinaryExpr_match< SCEVUMaxExpr, Op0_t, Op1_t, SCEV::FlagNone, true > m_scev_UMax(const Op0_t &Op0, const Op1_t &Op1)
match_bind< const SCEVAddExpr > m_scev_Add(const SCEVAddExpr *&V)
SCEVURem_match< Op0_t, Op1_t > m_scev_URem(Op0_t LHS, Op1_t RHS, ScalarEvolution &SE)
Match the mathematical pattern A - (A / B) * B, where A and B can be arbitrary expressions.
@ CE
Windows NT (Windows on ARM)
Definition MCAsmInfo.h:51
initializer< Ty > init(const Ty &Val)
@ User
could "use" a pointer
friend class Instruction
Iterator for Instructions in a `BasicBlock.
Definition BasicBlock.h:73
This is an optimization pass for GlobalISel generic memory operations.
void visitAll(const SCEV *Root, SV &Visitor)
Use SCEVTraversal to visit all nodes in the given expression tree.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
Definition STLExtras.h:316
@ Offset
Definition DWP.cpp:577
void stable_sort(R &&Range)
Definition STLExtras.h:2132
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1755
InstructionCost Cost
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
Definition STLExtras.h:2570
auto pred_end(const MachineBasicBlock *BB)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
constexpr from_range_t from_range
constexpr NextUseDistance min(NextUseDistance A, NextUseDistance B)
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
Definition STLExtras.h:2224
auto pred_size(const MachineBasicBlock *BB)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI Value * simplifyInstruction(Instruction *I, const SimplifyQuery &Q)
See if we can compute a simplified version of this instruction.
LLVM_ABI bool isInstructionTriviallyDead(Instruction *I, const TargetLibraryInfo *TLI=nullptr)
Return true if the result produced by the instruction is not used, and the instruction will return.
Definition Local.cpp:408
auto reverse(ContainerTy &&C)
Definition STLExtras.h:408
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
IRBuilder(LLVMContext &, FolderTy, InserterTy) -> IRBuilder< FolderTy, InserterTy >
LLVM_ABI cl::opt< unsigned > SCEVCheapExpansionBudget
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
LLVM_ABI const SCEV * normalizeForPostIncUse(const SCEV *S, const PostIncLoopSet &Loops, ScalarEvolution &SE, bool CheckInvertible=true)
Normalize S to be post-increment for all loops present in Loops.
TargetTransformInfo TTI
constexpr NextUseDistance max(NextUseDistance A, NextUseDistance B)
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
@ Add
Sum of integers.
DWARFExpression::Operation Op
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
Definition CFG.h:93
SCEVFlags
SCEVFlags are bitfield indices into SCEV's SubclassData.
constexpr unsigned BitWidth
LLVM_ABI bool formLCSSAForInstructions(SmallVectorImpl< Instruction * > &Worklist, const DominatorTree &DT, const LoopInfo &LI, ScalarEvolution *SE, SmallVectorImpl< PHINode * > *PHIsToRemove=nullptr, SmallVectorImpl< PHINode * > *InsertedPHIs=nullptr)
Ensures LCSSA form for every instruction from the Worklist in the scope of innermost containing loop.
Definition LCSSA.cpp:328
auto pred_begin(const MachineBasicBlock *BB)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
SmallPtrSet< const Loop *, 2 > PostIncLoopSet
auto predecessors(const MachineBasicBlock *BB)
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
Definition iterator.h:368
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1963
LLVM_ABI std::optional< bool > isImpliedByDomCondition(const Value *Cond, const Instruction *ContextI, const DataLayout &DL)
Return the boolean condition value in the context of the given instruction if it is known based on do...
SCEVUseT< const SCEV * > SCEVUse
bool SCEVExprContains(const SCEV *Root, PredTy Pred)
Return true if any node in Root satisfies the predicate Pred.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
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.
int OperandIdx
The use index of an expanded instruction.
SCEVFlags getNoWrapFlags(SCEVFlags Mask=SCEVFlags::FlagsNoWrapMask) const
Return the flags for this SCEVUse, which is the union of the use-specific flags and the underlying SC...