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