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