32#if LLVM_ENABLE_ABI_BREAKING_CHECKS
33#define SCEV_DEBUG_WITH_TYPE(TYPE, X) DEBUG_WITH_TYPE(TYPE, X)
35#define SCEV_DEBUG_WITH_TYPE(TYPE, X)
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)"));
57 NUW = OBO->hasNoUnsignedWrap();
58 NSW = OBO->hasNoSignedWrap();
61 Exact = PEO->isExact();
65 NNeg = PNI->hasNonNeg();
67 NUW = TI->hasNoUnsignedWrap();
68 NSW = TI->hasNoSignedWrap();
78 I->setHasNoUnsignedWrap(
NUW);
79 I->setHasNoSignedWrap(
NSW);
88 I->setHasNoUnsignedWrap(
NUW);
89 I->setHasNoSignedWrap(
NSW);
114 Value *Ret =
nullptr;
119 if (U->getType() != Ty)
128 if (IP->getParent() == CI->
getParent() && &*BIP != CI &&
138 SCEVInsertPointGuard Guard(Builder,
this);
139 Builder.SetInsertPoint(&*IP);
140 Ret = Builder.CreateCast(
Op, V, Ty,
V->getName());
156 if (
auto MaybeIP =
I->getInsertionPointAfterDef()) {
159 assert(SE.DT.dominates(
I, MustDominate) &&
160 "instruction must dominate the insertion point");
177 while (!WorkList.
empty()) {
186 InsertedValues.erase(
I);
187 InsertedPostIncValues.erase(
I);
189 I->eraseFromParent();
194SCEVExpander::GetOptimalInsertionPointForCastOf(
Value *V)
const {
213 "Expected the cast argument to be a global/constant");
214 return Builder.GetInsertBlock()
217 .getFirstInsertionPt();
225 assert((
Op == Instruction::BitCast ||
226 Op == Instruction::PtrToInt ||
227 Op == Instruction::IntToPtr) &&
228 "InsertNoopCastOfTo cannot perform non-noop casts!");
229 assert(SE.getTypeSizeInBits(
V->getType()) == SE.getTypeSizeInBits(Ty) &&
230 "InsertNoopCastOfTo cannot change sizes!");
237 if (
Op == Instruction::IntToPtr) {
239 if (DL.isNonIntegralPointerType(PtrTy))
243 if (
Op == Instruction::BitCast) {
244 if (
V->getType() == Ty)
252 if ((
Op == Instruction::PtrToInt ||
Op == Instruction::IntToPtr) &&
253 SE.getTypeSizeInBits(Ty) == SE.getTypeSizeInBits(
V->getType())) {
255 if ((CI->
getOpcode() == Instruction::PtrToInt ||
256 CI->
getOpcode() == Instruction::IntToPtr) &&
257 SE.getTypeSizeInBits(CI->
getType()) ==
261 if ((
CE->getOpcode() == Instruction::PtrToInt ||
262 CE->getOpcode() == Instruction::IntToPtr) &&
263 SE.getTypeSizeInBits(
CE->getType()) ==
264 SE.getTypeSizeInBits(
CE->getOperand(0)->getType()))
265 return CE->getOperand(0);
273 return ReuseOrCreateCast(V, Ty,
Op, GetOptimalInsertionPointForCastOf(V));
289 unsigned ScanLimit = 6;
293 if (IP != BlockBegin) {
295 for (; ScanLimit; --IP, --ScanLimit) {
310 if (IP->getOpcode() == (
unsigned)Opcode && IP->getOperand(0) ==
LHS &&
311 IP->getOperand(1) ==
RHS && !canGenerateIncompatiblePoison(&*IP))
313 if (IP == BlockBegin)
break;
318 DebugLoc Loc = Builder.GetInsertPoint()->getDebugLoc();
319 SCEVInsertPointGuard Guard(Builder,
this);
323 while (
const Loop *L = SE.LI.getLoopFor(Builder.GetInsertBlock())) {
324 if (!
L->isLoopInvariant(
LHS) || !
L->isLoopInvariant(
RHS))
break;
326 if (!Preheader)
break;
334 Builder.SetCurrentDebugLocation(Loc);
339 if (LSRMode && !PostIncLoops.empty() &&
340 all_of(PostIncLoops, [&](
const Loop *L) {
341 return !
L->contains(Builder.GetInsertBlock());
345 BO->setHasNoUnsignedWrap();
347 BO->setHasNoSignedWrap();
348 return Builder.Insert(BO);
350 return Builder.CreateNoWrapBinOp(Opcode,
LHS,
RHS, IsNUW, IsNSW);
388 : GEPNoWrapFlags::
none();
393 return Builder.CreatePtrAdd(CLHS, CRHS,
"", NW);
396 unsigned ScanLimit = 6;
400 if (IP != BlockBegin) {
402 for (; ScanLimit; --IP, --ScanLimit) {
404 if (
GEP->getPointerOperand() == V &&
405 GEP->getSourceElementType() == Builder.getInt8Ty() &&
406 GEP->getOperand(1) == Idx) {
408 GEP->setNoWrapFlags(
GEP->getNoWrapFlags() & NW);
412 if (IP == BlockBegin)
break;
417 SCEVInsertPointGuard Guard(Builder,
this);
420 while (
const Loop *L = SE.LI.getLoopFor(Builder.GetInsertBlock())) {
421 if (!
L->isLoopInvariant(V) || !
L->isLoopInvariant(Idx))
break;
423 if (!Preheader)
break;
430 return Builder.CreatePtrAdd(V, Idx,
"scevgep", NW);
440 if (
A->contains(
B))
return B;
441 if (
B->contains(
A))
return A;
442 if (DT.
dominates(
A->getHeader(),
B->getHeader()))
return B;
443 if (DT.
dominates(
B->getHeader(),
A->getHeader()))
return A;
449const Loop *SCEVExpander::getRelevantLoop(
const SCEV *S) {
451 auto Pair = RelevantLoops.try_emplace(S);
453 return Pair.first->second;
472 const Loop *
L =
nullptr;
477 return RelevantLoops[S] =
L;
482 return Pair.first->second = SE.LI.getLoopFor(
I->getParent());
498 explicit LoopCompare(DominatorTree &dt) : DT(dt) {}
500 bool operator()(std::pair<const Loop *, const SCEV *>
LHS,
501 std::pair<const Loop *, const SCEV *>
RHS)
const {
508 if (
LHS.first !=
RHS.first)
514 if (
LHS.second->isNonConstantNegative()) {
515 if (!
RHS.second->isNonConstantNegative())
517 }
else if (
RHS.second->isNonConstantNegative())
529 const SCEV *URemLHS =
nullptr;
530 const SCEV *URemRHS =
nullptr;
543 for (
const SCEV *
Op :
reverse(S->operands()))
544 OpsAndLoops.
push_back(std::make_pair(getRelevantLoop(
Op),
Op));
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;
563 assert(!
Op->getType()->isPointerTy() &&
"Only first op can be pointer");
568 for (;
I !=
E &&
I->first == CurLoop; ++
I) {
571 const SCEV *
X =
I->second;
574 X = SE.getSCEV(
U->getValue());
577 Sum = expandAddToGEP(SE.getAddExpr(NewOps), Sum, S.
getNoWrapFlags());
578 }
else if (
Op->isNonConstantNegative()) {
580 Value *
W = expand(SE.getNegativeSCEV(
Op));
600 Type *Ty = S->getType();
602 const SCEVConstant *C1, *C2;
613 Value *Res = InsertBinop(Instruction::And,
LHS, ConstantInt::get(Ty, Mask),
621 for (
const SCEV *
Op :
reverse(S->operands()))
622 OpsAndLoops.
push_back(std::make_pair(getRelevantLoop(
Op),
Op));
629 Value *Prod =
nullptr;
630 auto I = OpsAndLoops.
begin();
635 const auto ExpandOpBinPowN = [
this, &
I, &OpsAndLoops]() {
645 while (
E != OpsAndLoops.
end() && *
I == *
E &&
Exponent != MaxExponent) {
649 assert(
Exponent > 0 &&
"Trying to calculate a zeroth exponent of operand?");
657 for (uint64_t BinExp = 2; BinExp <=
Exponent; BinExp <<= 1) {
668 assert(Result &&
"Nothing was expanded?");
672 while (
I != OpsAndLoops.
end()) {
675 Prod = ExpandOpBinPowN();
676 }
else if (
I->second->isAllOnesValue()) {
683 Value *
W = ExpandOpBinPowN();
692 if (
RHS->logBase2() ==
RHS->getBitWidth() - 1)
694 Prod = InsertBinop(Instruction::Shl, Prod,
695 ConstantInt::get(Ty,
RHS->logBase2()), NWFlags,
710 const APInt &
RHS = SC->getAPInt();
711 if (
RHS.isPowerOf2())
712 return InsertBinop(Instruction::LShr,
LHS,
713 ConstantInt::get(SC->getType(),
RHS.logBase2()),
717 const SCEV *RHSExpr = S->getRHS();
720 bool GuaranteedNotPoison =
722 if (!GuaranteedNotPoison)
723 RHS = Builder.CreateFreeze(
RHS);
728 if (!SE.isKnownNonZero(RHSExpr) || !GuaranteedNotPoison)
729 RHS = Builder.CreateIntrinsic(
RHS->
getType(), Intrinsic::umax,
730 {RHS, ConstantInt::get(RHS->getType(), 1)});
733 SE.isKnownNonZero(S->getRHS()));
746 if (L == IVIncInsertLoop) {
749 if (!SE.DT.dominates(OInst, IVIncInsertPos))
763 return isNormalAddRecExprPHI(PN, IncV, L);
778 if (IncV == InsertPos)
785 case Instruction::Add:
786 case Instruction::Sub: {
788 if (!OInst || SE.DT.dominates(OInst, InsertPos))
792 case Instruction::BitCast:
794 case Instruction::GetElementPtr:
799 if (!SE.DT.dominates(OInst, InsertPos))
825 if (Builder.GetInsertPoint() == It)
826 Builder.SetInsertPoint(&*NewInsertPt);
827 for (
auto *InsertPtGuard : InsertPointGuards)
828 if (InsertPtGuard->GetInsertPoint() == It)
829 InsertPtGuard->SetInsertPoint(NewInsertPt);
836 bool RecomputePoisonFlags) {
841 I->dropPoisonGeneratingFlags();
843 if (
auto Flags = SE.getStrengthenedNoWrapFlagsFromBinOp(OBO)) {
845 BO->setHasNoUnsignedWrap(
847 BO->setHasNoSignedWrap(
852 if (SE.DT.dominates(IncV, InsertPos)) {
853 if (RecomputePoisonFlags)
854 FixupPoisonFlags(IncV);
864 if (!SE.LI.movementPreservesLCSSAForm(IncV, InsertPos))
876 if (SE.DT.dominates(IncV, InsertPos))
880 fixupInsertPoints(
I);
882 if (RecomputePoisonFlags)
905 (IVOper =
getIVIncOperand(IVOper, L->getLoopPreheader()->getTerminator(),
922 IncV = Builder.CreatePtrAdd(PN, StepV,
"scevgep");
925 Builder.CreateSub(PN, StepV, Twine(IVName) +
".iv.next") :
926 Builder.CreateAdd(PN, StepV, Twine(IVName) +
".iv.next");
938 Type *PhiTy = Phi->getType();
952 if (Phi == Requested) {
975 const SCEV *ExtendAfterOp =
977 return ExtendAfterOp == OpAfterExtend;
989 const SCEV *ExtendAfterOp =
991 return ExtendAfterOp == OpAfterExtend;
998SCEVExpander::getAddRecExprPHILiterally(
const SCEVAddRecExpr *Normalized,
1001 assert((!IVIncInsertLoop || IVIncInsertPos) &&
1002 "Uninitialized insert position");
1007 PHINode *AddRecPhiMatch =
nullptr;
1014 bool TryNonMatchingSCEV =
1016 SE.DT.properlyDominates(LatchBlock, IVIncInsertLoop->getHeader());
1018 for (PHINode &PN :
L->getHeader()->phis()) {
1019 if (!SE.isSCEVable(PN.
getType()))
1026 DebugType,
dbgs() <<
"One incomplete PHI is found: " << PN <<
"\n");
1034 bool IsMatchingSCEV = PhiSCEV == Normalized;
1038 if (!IsMatchingSCEV && !TryNonMatchingSCEV)
1049 if (!isExpandedAddRecExprPHI(&PN, TempIncV, L))
1052 if (!isNormalAddRecExprPHI(&PN, TempIncV, L))
1057 if (IsMatchingSCEV) {
1061 AddRecPhiMatch = &PN;
1067 if ((!TruncTy || InvertStep) &&
1071 AddRecPhiMatch = &PN;
1073 TruncTy = Normalized->
getType();
1077 if (AddRecPhiMatch) {
1080 InsertedValues.insert(AddRecPhiMatch);
1082 rememberInstruction(IncV);
1084 ReusedValues.insert(AddRecPhiMatch);
1085 ReusedValues.insert(IncV);
1086 return AddRecPhiMatch;
1091 SCEVInsertPointGuard Guard(Builder,
this);
1101 PostIncLoops.
clear();
1104 assert(
L->getLoopPreheader() &&
1105 "Can't expand add recurrences without a loop preheader!");
1107 expand(Normalized->
getStart(),
L->getLoopPreheader()->getTerminator());
1124 Step = SE.getNegativeSCEV(Step);
1126 Value *StepV = expand(Step,
L->getHeader()->getFirstInsertionPt());
1131 bool IncrementIsNUW = !useSubtract &&
IsIncrementNUW(SE, Normalized);
1132 bool IncrementIsNSW = !useSubtract &&
IsIncrementNSW(SE, Normalized);
1136 Builder.SetInsertPoint(Header, Header->begin());
1138 Builder.CreatePHI(ExpandTy,
pred_size(Header), Twine(IVName) +
".iv");
1143 if (!
L->contains(Pred)) {
1152 IVIncInsertPos : Pred->getTerminator();
1153 Builder.SetInsertPoint(InsertPos);
1154 Value *IncV = expandIVInc(PN, StepV, L, useSubtract);
1167 PostIncLoops = SavedPostIncLoops;
1171 InsertedValues.
insert(PN);
1172 InsertedIVs.push_back(PN);
1178 const Loop *
L = S->getLoop();
1182 const SCEVAddRecExpr *Normalized = S;
1183 if (PostIncLoops.count(L)) {
1190 [[maybe_unused]]
const SCEV *
Start = Normalized->
getStart();
1192 assert(SE.properlyDominates(Start,
L->getHeader()) &&
1193 "Start does not properly dominate loop header");
1194 assert(SE.dominates(Step,
L->getHeader()) &&
"Step not dominate loop header");
1198 Type *TruncTy =
nullptr;
1199 bool InvertStep =
false;
1200 PHINode *PN = getAddRecExprPHILiterally(Normalized, L, TruncTy, InvertStep);
1204 if (!PostIncLoops.count(L))
1209 assert(LatchBlock &&
"PostInc mode requires a unique loop latch!");
1217 if (!S->hasNoUnsignedWrap())
1218 I->setHasNoUnsignedWrap(
false);
1219 if (!S->hasNoSignedWrap())
1220 I->setHasNoSignedWrap(
false);
1228 &*Builder.GetInsertPoint())) {
1241 Step = SE.getNegativeSCEV(Step);
1245 SCEVInsertPointGuard Guard(Builder,
this);
1246 StepV = expand(Step,
L->getHeader()->getFirstInsertionPt());
1248 Result = expandIVInc(PN, StepV, L, useSubtract);
1255 if (TruncTy !=
Result->getType() || InvertStep)
1256 Result = fixupLCSSAFormFor(Result);
1258 if (TruncTy !=
Result->getType())
1259 Result = Builder.CreateTrunc(Result, TruncTy);
1263 Result = Builder.CreateSub(expand(Normalized->
getStart()), Result);
1270 Type *STy = S->getType();
1271 const Loop *
L = S->getLoop();
1274 !SE.DT.dominates(EB, Builder.GetInsertBlock()))
1279 auto CanReuse = [&](
const SCEV *ExitSCEV) ->
const SCEV * {
1282 const SCEV *Diff = SE.getMinusSCEV(S, ExitSCEV);
1283 const SCEV *
Op = Diff;
1292 for (
auto &PN : EB->
phis()) {
1293 if (!SE.isSCEVable(PN.
getType()))
1295 auto *ExitSCEV = SE.getSCEV(&PN);
1299 const SCEV *Diff =
nullptr;
1301 DL.getAddressType(PhiTy) == STy) {
1302 const SCEV *AddrSCEV = SE.getPtrToAddrExpr(ExitSCEV);
1303 Diff = CanReuse(AddrSCEV);
1304 }
else if (STy == PhiTy) {
1305 Diff = CanReuse(ExitSCEV);
1311 "difference must be of integer type");
1312 Value *DiffV = expand(Diff);
1313 Value *BaseV = fixupLCSSAFormFor(&PN);
1316 return Builder.CreatePtrAdd(BaseV, DiffV);
1317 BaseV = Builder.CreatePtrToAddr(BaseV);
1319 return Builder.CreateAdd(BaseV, DiffV);
1336 if (!CanonicalMode || (S->getNumOperands() > 2))
1337 return expandAddRecExprLiterally(S);
1339 Type *Ty = SE.getEffectiveSCEVType(S->getType());
1340 const Loop *
L = S->getLoop();
1343 PHINode *CanonicalIV =
nullptr;
1344 if (PHINode *PN =
L->getCanonicalInductionVariable())
1345 if (SE.getTypeSizeInBits(PN->
getType()) >= SE.getTypeSizeInBits(Ty))
1351 SE.getTypeSizeInBits(CanonicalIV->
getType()) > SE.getTypeSizeInBits(Ty) &&
1352 !S->getType()->isPointerTy()) {
1354 for (
unsigned i = 0, e = S->getNumOperands(); i != e; ++i)
1355 NewOps[i] = SE.getAnyExtendExpr(S->getOperand(i), CanonicalIV->
getType());
1360 &*Builder.GetInsertPoint())
1361 : Builder.GetInsertPoint();
1362 V = expand(SE.getTruncateExpr(SE.getUnknown(V), Ty), NewInsertPt);
1368 if (
Value *V = tryToReuseLCSSAPhi(S))
1372 if (!S->getStart()->isZero()) {
1374 Value *StartV = expand(SE.getPointerBase(S));
1375 return expandAddToGEP(SE.removePointerBase(S), StartV,
1380 NewOps[0] = SE.getConstant(Ty, 0);
1388 const SCEV *AddExprLHS = SE.getUnknown(expand(S->getStart()));
1389 const SCEV *AddExprRHS = SE.getUnknown(expand(Rest));
1390 return expand(SE.getAddExpr(AddExprLHS, AddExprRHS));
1401 rememberInstruction(CanonicalIV);
1403 SmallPtrSet<BasicBlock *, 4> PredSeen;
1404 Constant *One = ConstantInt::get(Ty, 1);
1407 if (!PredSeen.
insert(HP).second) {
1414 if (
L->contains(HP)) {
1421 rememberInstruction(
Add);
1430 if (S->isAffine() && S->getOperand(1)->isOne()) {
1431 assert(Ty == SE.getEffectiveSCEVType(CanonicalIV->
getType()) &&
1432 "IVs with types different from the canonical IV should "
1433 "already have been handled!");
1442 expand(SE.getTruncateOrNoop(
1443 SE.getMulExpr(SE.getUnknown(CanonicalIV),
1444 SE.getNoopOrAnyExtend(S->getOperand(1),
1452 const SCEV *IH = SE.getUnknown(CanonicalIV);
1455 const SCEV *NewS = S;
1456 const SCEV *Ext = SE.getNoopOrAnyExtend(S, CanonicalIV->
getType());
1463 const SCEV *
T = SE.getTruncateOrNoop(V, Ty);
1473 if (CI->
getOpcode() == CastInst::PtrToAddr)
1475 if (CI->
getOpcode() != CastInst::PtrToInt)
1478 return DL.getPointerSizeInBits(AS) ==
DL.getIndexSizeInBits(AS);
1499 Type *Ty = S->getType();
1505 return &*BIP != CI && SE.DT.
dominates(CI, &*BIP);
1509 return ReuseOrCreateCast(V, Ty, CastInst::PtrToAddr,
1510 GetOptimalInsertionPointForCastOf(V));
1514 Type *Ty = S->getType();
1520 Value *PtrOp = expand(PtrToAddr->getOperand());
1523 for (User *U : PtrOp->
users()) {
1525 if (CI && CI->
getType() == Ty &&
1526 CI->
getOpcode() == CastInst::PtrToInt && &*BIP != CI &&
1527 SE.DT.dominates(CI, &*BIP))
1533 Value *
V = expand(S->getOperand());
1534 return Builder.CreateTrunc(V, S->getType());
1539 Value *
V = expand(S->getOperand());
1540 return Builder.CreateZExt(V, S->getType(),
"",
1541 SE.isKnownNonNegative(S->getOperand()));
1546 Value *
V = expand(S->getOperand());
1547 return Builder.CreateSExt(V, S->getType());
1552 bool IsSequential) {
1553 bool PrevSafeMode = SafeUDivMode;
1554 SafeUDivMode |= IsSequential;
1555 Value *
LHS = expand(S->getOperand(S->getNumOperands() - 1));
1558 LHS = Builder.CreateFreeze(
LHS);
1559 for (
int i = S->getNumOperands() - 2; i >= 0; --i) {
1560 SafeUDivMode = (IsSequential && i != 0) || PrevSafeMode;
1561 Value *
RHS = expand(S->getOperand(i));
1562 if (IsSequential && i != 0)
1563 RHS = Builder.CreateFreeze(
RHS);
1566 Sel = Builder.CreateIntrinsic(IntrinID, {Ty}, {
LHS,
RHS},
1571 Sel = Builder.CreateSelect(ICmp,
LHS,
RHS, Name);
1575 SafeUDivMode = PrevSafeMode;
1580 return expandMinMaxExpr(S, Intrinsic::smax,
"smax");
1584 return expandMinMaxExpr(S, Intrinsic::umax,
"umax");
1588 return expandMinMaxExpr(S, Intrinsic::smin,
"smin");
1592 return expandMinMaxExpr(S, Intrinsic::umin,
"umin");
1595Value *SCEVExpander::visitSequentialUMinExpr(
1597 return expandMinMaxExpr(S, Intrinsic::umin,
"umin",
1602 return Builder.CreateVScale(S->getType());
1613 Value *V = expand(SH);
1615 if (Ty && Ty != V->getType()) {
1616 assert(SE.getTypeSizeInBits(Ty) == SE.getTypeSizeInBits(SH->
getType()) &&
1617 "non-trivial casts should be done with the SCEVs directly!");
1618 V = InsertNoopCastOfTo(V, Ty);
1623Value *SCEVExpander::FindValueInExprValueMap(
1635 for (
Value *V : SE.getSCEVValues(S)) {
1652 DropPoisonGeneratingInsts.
clear();
1670 auto SafeToHoist = [](
const SCEV *S) {
1675 return SC->getValue()->isZero();
1685 if (SafeToHoist(S)) {
1686 for (Loop *L = SE.LI.getLoopFor(Builder.GetInsertBlock());;
1687 L =
L->getParentLoop()) {
1688 if (SE.isLoopInvariant(S, L)) {
1690 if (BasicBlock *Preheader =
L->getLoopPreheader()) {
1696 InsertPt =
L->getHeader()->getFirstInsertionPt();
1702 if (L && SE.hasComputableLoopEvolution(S, L) && !PostIncLoops.count(L))
1703 InsertPt =
L->getHeader()->getFirstInsertionPt();
1705 while (InsertPt != Builder.GetInsertPoint() &&
1707 InsertPt = std::next(InsertPt);
1715 auto I = InsertedExpressions.find(std::make_pair(S, &*InsertPt));
1716 if (
I != InsertedExpressions.end())
1719 SCEVInsertPointGuard Guard(Builder,
this);
1720 Builder.SetInsertPoint(InsertPt->getParent(), InsertPt);
1723 SmallVector<Instruction *> DropPoisonGeneratingInsts;
1724 Value *
V = FindValueInExprValueMap(S, &*InsertPt, DropPoisonGeneratingInsts);
1727 V = fixupLCSSAFormFor(V);
1729 for (Instruction *
I : DropPoisonGeneratingInsts) {
1740 InsertedExpressions[std::make_pair(S, &*InsertPt)] =
V;
1744void SCEVExpander::rememberInstruction(
Value *
I) {
1745 auto DoInsert = [
this](
Value *
V) {
1746 if (!PostIncLoops.empty())
1747 InsertedPostIncValues.insert(V);
1749 InsertedValues.insert(V);
1756 OrigFlags.try_emplace(
I, PoisonFlags(
I));
1761 I->dropPoisonGeneratingAnnotations();
1765 if (
auto Flags = SE.getStrengthenedNoWrapFlagsFromBinOp(OBO)) {
1767 BO->setHasNoUnsignedWrap(
1769 BO->setHasNoSignedWrap(
1773 auto *Src = NNI->getOperand(0);
1778 NNI->setNonNeg(
true);
1782void SCEVExpander::replaceCongruentIVInc(
1793 if (!OrigInc || !IsomorphicInc)
1799 if (OrigPhi->
getType() == Phi->getType()) {
1800 bool Chained = ChainedPhis.contains(Phi);
1801 if (!(Chained || isExpandedAddRecExprPHI(OrigPhi, OrigInc, L)) &&
1802 (Chained || isExpandedAddRecExprPHI(Phi, IsomorphicInc, L))) {
1817 const SCEV *TruncExpr =
1818 SE.getTruncateOrNoop(SE.getSCEV(OrigInc), IsomorphicInc->
getType());
1819 if (OrigInc == IsomorphicInc || TruncExpr != SE.getSCEV(IsomorphicInc) ||
1820 !SE.LI.replacementPreservesLCSSAForm(IsomorphicInc, OrigInc))
1823 bool BothHaveNUW =
false;
1824 bool BothHaveNSW =
false;
1827 if (OBOIncV && OBOIsomorphic) {
1829 OBOIncV->hasNoUnsignedWrap() && OBOIsomorphic->hasNoUnsignedWrap();
1831 OBOIncV->hasNoSignedWrap() && OBOIsomorphic->hasNoSignedWrap();
1844 "Should only replace an increment with a wider one.");
1845 if (BothHaveNUW || BothHaveNSW) {
1851 dbgs() <<
"INDVARS: Eliminated congruent iv.inc: "
1852 << *IsomorphicInc <<
'\n');
1853 Value *NewInc = OrigInc;
1857 IP = PN->
getParent()->getFirstInsertionPt();
1862 Builder.SetCurrentDebugLocation(IsomorphicInc->
getDebugLoc());
1864 Builder.CreateTruncOrBitCast(OrigInc, IsomorphicInc->
getType(), IVName);
1889 if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
1890 return RHS->getType()->isIntegerTy() && !LHS->getType()->isIntegerTy();
1891 return RHS->getType()->getPrimitiveSizeInBits().getFixedValue() <
1892 LHS->getType()->getPrimitiveSizeInBits().getFixedValue();
1895 unsigned NumElim = 0;
1903 if (!SE.isSCEVable(PN->
getType()))
1908 return Const->getValue();
1913 if (
Value *V = SimplifyPHINode(Phi)) {
1914 if (V->getType() != Phi->getType())
1916 SE.forgetValue(Phi);
1917 Phi->replaceAllUsesWith(V);
1921 dbgs() <<
"INDVARS: Eliminated constant iv: " << *Phi
1926 if (!SE.isSCEVable(Phi->getType()))
1929 PHINode *&OrigPhiRef = ExprToIVMap[SE.getSCEV(Phi)];
1932 if (Phi->getType()->isIntegerTy() &&
TTI &&
1933 TTI->isTruncateFree(Phi->getType(), Phis.
back()->getType())) {
1937 const SCEV *PhiExpr = SE.getSCEV(Phi);
1941 const SCEV *TruncExpr =
1942 SE.getTruncateExpr(PhiExpr, Phis.
back()->getType());
1943 ExprToIVMap[TruncExpr] = Phi;
1954 replaceCongruentIVInc(Phi, OrigPhiRef, L, DT, DeadInsts);
1956 dbgs() <<
"INDVARS: Eliminated congruent iv: " << *Phi
1959 DebugType,
dbgs() <<
"INDVARS: Original iv: " << *OrigPhiRef <<
'\n');
1961 Value *NewIV = OrigPhiRef;
1962 if (OrigPhiRef->
getType() != Phi->getType()) {
1964 L->getHeader()->getFirstInsertionPt());
1965 Builder.SetCurrentDebugLocation(Phi->getDebugLoc());
1966 NewIV = Builder.CreateTruncOrBitCast(OrigPhiRef, Phi->getType(), IVName);
1968 Phi->replaceAllUsesWith(NewIV);
1980 L->getExitingBlocks(ExitingBlocks);
1987 if (!
match(BB->getTerminator(),
1992 if (SE.getSCEV(LHS) == S && SE.DT.dominates(LHS, At))
1995 if (SE.getSCEV(RHS) == S && SE.DT.dominates(RHS, At))
2004 return FindValueInExprValueMap(S, At, DropPoisonGeneratingInsts) !=
nullptr;
2015 struct OperationIndices {
2016 OperationIndices(
unsigned Opc,
size_t min,
size_t max) :
2017 Opcode(
Opc), MinIdx(
min), MaxIdx(
max) { }
2030 return TTI.getCastInstrCost(Opcode, S->getType(),
2031 S->getOperand(0)->getType(),
2035 auto ArithCost = [&](
unsigned Opcode,
unsigned NumRequired,
2036 unsigned MinIdx = 0,
2039 return NumRequired *
2040 TTI.getArithmeticInstrCost(Opcode, S->getType(),
CostKind);
2043 auto CmpSelCost = [&](
unsigned Opcode,
unsigned NumRequired,
unsigned MinIdx,
2046 Type *OpType = S->getType();
2047 return NumRequired *
TTI.getCmpSelInstrCost(
2052 switch (S->getSCEVType()) {
2060 Cost = CastCost(Instruction::PtrToAddr);
2063 Cost = CastCost(Instruction::Trunc);
2066 Cost = CastCost(Instruction::ZExt);
2069 Cost = CastCost(Instruction::SExt);
2072 unsigned Opcode = Instruction::UDiv;
2074 if (SC->getAPInt().isPowerOf2())
2075 Opcode = Instruction::LShr;
2076 Cost = ArithCost(Opcode, 1);
2080 Cost = ArithCost(Instruction::Add, S->getNumOperands() - 1);
2091 unsigned OpCode = Instruction::Mul;
2092 if (S->getNumOperands() == 2)
2094 if (SC->getAPInt().isAllOnes())
2095 OpCode = Instruction::Sub;
2096 else if (SC->getAPInt().isPowerOf2())
2097 OpCode = Instruction::Shl;
2099 Cost = ArithCost(OpCode, S->getNumOperands() - 1);
2109 Cost += CmpSelCost(Instruction::ICmp, S->getNumOperands() - 1, 0, 1);
2110 Cost += CmpSelCost(Instruction::Select, S->getNumOperands() - 1, 0, 2);
2111 switch (S->getSCEVType()) {
2115 Cost += CmpSelCost(Instruction::ICmp, S->getNumOperands() - 1, 0, 0);
2116 Cost += ArithCost(Instruction::Or,
2117 S->getNumOperands() > 2 ? S->getNumOperands() - 2 : 0);
2118 Cost += CmpSelCost(Instruction::Select, 1, 0, 1);
2123 "Unhandled SCEV expression type?");
2130 unsigned NumRecurrences = S->getNumOperands() - 1;
2131 Cost +=
TTI.getCFInstrCost(Instruction::PHI,
CostKind) * NumRecurrences;
2133 TTI.getArithmeticInstrCost(Instruction::Add, S->getType(),
CostKind) *
2136 Worklist.
emplace_back(Instruction::PHI, 0, S->getOperand(0));
2138 for (
const SCEV *
Op : S->operands().drop_front())
2144 for (
auto &CostOp : Operations) {
2145 for (
auto SCEVOp :
enumerate(S->operands())) {
2147 size_t MinIdx = std::max(SCEVOp.index(), CostOp.MinIdx);
2148 size_t OpIdx = std::min(MinIdx, CostOp.MaxIdx);
2155bool SCEVExpander::isHighCostExpansionHelper(
2163 const SCEV *S = WorkItem.
S;
2174 L->getHeader()->getParent()->hasMinSize()
2193 return Cost > Budget;
2213 SE.getAddExpr(S, SE.getConstant(S->
getType(), 1)), &At, L))
2228 "Nary expr should have more than 1 operand.");
2233 return Cost > Budget;
2237 "Polynomial should be at least linear");
2240 return Cost > Budget;
2249 switch (Pred->getKind()) {
2264 Value *Expr0 = expand(Pred->getLHS(), IP);
2265 Value *Expr1 = expand(Pred->getRHS(), IP);
2267 Builder.SetInsertPoint(IP);
2269 auto *
I = Builder.CreateICmp(InvPred, Expr0, Expr1,
"ident.check");
2276 "non-affine expression");
2280 const SCEV *ExitCount =
2281 SE.getPredicatedSymbolicMaxBackedgeTakenCount(AR->
getLoop(), Pred);
2289 unsigned SrcBits = SE.getTypeSizeInBits(ExitCount->
getType());
2290 unsigned DstBits = SE.getTypeSizeInBits(ARTy);
2297 Builder.SetInsertPoint(
Loc);
2298 Value *TripCountVal = expand(ExitCount,
Loc);
2303 Value *StepValue = expand(Step,
Loc);
2304 Value *NegStepValue = expand(SE.getNegativeSCEV(Step),
Loc);
2305 Value *StartValue = expand(Start,
Loc);
2310 Builder.SetInsertPoint(
Loc);
2313 Value *AbsStep = Builder.CreateSelect(StepCompare, NegStepValue, StepValue);
2323 auto ComputeEndCheck = [&]() ->
Value * {
2325 Value *TruncTripCount = Builder.CreateZExtOrTrunc(TripCountVal, Ty);
2327 Value *
Mul = Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, Ty,
2328 {AbsStep, TruncTripCount},
2330 Value *MulV = Builder.CreateExtractValue(
Mul, 0,
"mul.result");
2331 Value *OfMul = Builder.CreateExtractValue(
Mul, 1,
"mul.overflow");
2334 bool NeedPosCheck = !SE.isKnownNegative(Step);
2335 bool NeedNegCheck = !SE.isKnownPositive(Step);
2338 Value *NegMulV = Builder.CreateNeg(MulV);
2340 Add = Builder.CreatePtrAdd(StartValue, MulV);
2342 Sub = Builder.CreatePtrAdd(StartValue, NegMulV);
2345 Add = Builder.CreateAdd(StartValue, MulV);
2347 Sub = Builder.CreateSub(StartValue, MulV);
2350 Value *EndCompareLT =
nullptr;
2351 Value *EndCompareGT =
nullptr;
2352 Value *EndCheck =
nullptr;
2354 EndCheck = EndCompareLT = Builder.CreateICmp(
2357 EndCheck = EndCompareGT = Builder.CreateICmp(
2359 if (NeedPosCheck && NeedNegCheck) {
2361 EndCheck = Builder.CreateSelect(StepCompare, EndCompareGT, EndCompareLT);
2363 return Builder.CreateOr(EndCheck, OfMul);
2365 Value *EndCheck = ComputeEndCheck();
2370 if (SrcBits > DstBits) {
2372 auto *BackedgeCheck =
2374 ConstantInt::get(
Loc->getContext(), MaxVal));
2375 BackedgeCheck = Builder.CreateAnd(
2378 EndCheck = Builder.CreateOr(EndCheck, BackedgeCheck);
2387 Value *NSSWCheck =
nullptr, *NUSWCheck =
nullptr;
2397 if (NUSWCheck && NSSWCheck)
2398 return Builder.CreateOr(NUSWCheck, NSSWCheck);
2413 for (
const auto *Pred : Union->getPredicates()) {
2415 Builder.SetInsertPoint(IP);
2420 return Builder.CreateOr(Checks);
2423Value *SCEVExpander::fixupLCSSAFormFor(
Value *V) {
2425 if (!PreserveLCSSA || !DefI)
2431 if (!DefLoop || UseLoop == DefLoop || DefLoop->
contains(UseLoop))
2442 if (DefI->getType()->isIntegerTy())
2456 for (
PHINode *PN : InsertedPHIs)
2457 rememberInstruction(PN);
2458 for (
PHINode *PN : PHIsToRemove) {
2461 InsertedValues.erase(PN);
2462 InsertedPostIncValues.erase(PN);
2466 return User->getOperand(0);
2488struct SCEVFindUnsafe {
2489 ScalarEvolution &SE;
2491 bool IsUnsafe =
false;
2493 SCEVFindUnsafe(ScalarEvolution &SE,
bool CanonicalMode)
2494 : SE(SE), CanonicalMode(CanonicalMode) {}
2496 bool follow(
const SCEV *S) {
2507 if (!AR->getLoop()->getLoopPreheader() &&
2508 (!CanonicalMode || !AR->isAffine())) {
2515 bool isDone()
const {
return IsUnsafe; }
2520 SCEVFindUnsafe Search(SE, CanonicalMode);
2522 return !Search.IsUnsafe;
2553 for (
auto [
I, Flags] : Expander.OrigFlags)
2556 auto InsertedInstructions = Expander.getAllInsertedInstructions();
2559 InsertedInstructions);
2569 [&InsertedSet](
Value *U) {
2570 return InsertedSet.contains(cast<Instruction>(U));
2572 "removed instruction should only be used by instructions inserted "
2573 "during expansion");
2575 assert(!
I->getType()->isVoidTy() &&
2576 "inserted instruction should have non-void types");
2578 I->eraseFromParent();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static 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")))
static Expected< BitVector > expand(StringRef S, StringRef Original)
MachineInstr unsigned OpIdx
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)
static bool canReuseCastForPtrToAddr(const CastInst *CI, Type *Ty, const DataLayout &DL)
Return true if CI computes the same value as a ptrtoaddr of its pointer operand to Ty.
This file defines the scope_exit class, which executes user-defined cleanup logic at scope exit.
LLVM_ABI APInt zext(unsigned width) const
Zero extend to a new width.
static APInt getMaxValue(unsigned numBits)
Gets maximum unsigned value of APInt for specific bit width.
unsigned logBase2() const
bool isPowerOf2() const
Check if this APInt's value is a power of two greater than zero.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
static APInt getBitsSetFrom(unsigned numBits, unsigned loBit)
Constructs an APInt value that has a contiguous range of bits set.
This class represents an incoming formal argument to a Function.
LLVM Basic Block Representation.
iterator_range< const_phi_iterator > phis() const
Returns a range that iterates over the phis in the basic block.
LLVM_ABI const BasicBlock * getSinglePredecessor() const
Return the predecessor of this block if it has a single predecessor block.
InstListType::iterator iterator
Instruction iterators...
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction; assumes that the block is well-formed.
static LLVM_ABI BinaryOperator * Create(BinaryOps Op, Value *S1, Value *S2, const Twine &Name=Twine(), InsertPosition InsertBefore=nullptr)
Construct a binary instruction, given the opcode and the two operands.
This is the base class for all instructions that perform data casts.
Type * getSrcTy() const
Return the source type, as a convenience.
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.
static LLVM_ABI CastInst * CreateBitOrPointerCast(Value *S, Type *Ty, const Twine &Name="", InsertPosition InsertBefore=nullptr)
Create a BitCast, a PtrToInt, or an IntToPTr cast instruction.
static Type * makeCmpResultType(Type *opnd_type)
Create a result type for fcmp/icmp.
@ ICMP_SLT
signed less than
@ ICMP_UGT
unsigned greater than
@ ICMP_SGT
signed greater than
@ ICMP_ULT
unsigned less than
@ ICMP_SGE
signed greater or equal
Predicate getInversePredicate() const
For example, EQ -> NE, UGT -> ULE, SLT -> SGE, OEQ -> UNE, UGT -> OLE, OLT -> UGE,...
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.
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
static LLVM_ABI Constant * getNullValue(Type *Ty)
Constructor to create a '0' constant of arbitrary type.
A parsed version of the target data layout string in and methods for querying it.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
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...
LLVM_ABI void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
LLVM_ABI void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
LLVM_ABI void insertBefore(InstListType::iterator InsertPos)
Insert an unlinked instruction into a basic block immediately before the specified position.
LLVM_ABI InstListType::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
LLVM_ABI const Function * getFunction() const
Return the function this instruction belongs to.
LLVM_ABI bool mayHaveSideEffects() const LLVM_READONLY
Return true if the instruction may have side effects.
LLVM_ABI bool comesBefore(const Instruction *Other) const
Given an instruction Other in the same basic block as this instruction, return true if this instructi...
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
Class to represent integer types.
static LLVM_ABI IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
bool contains(const LoopT *L) const
Return true if the specified loop is contained within this loop.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
ICmpInst::Predicate getPredicate() const
Returns the comparison predicate underlying the intrinsic.
void addIncoming(Value *V, BasicBlock *BB)
Add an incoming value to the end of the PHI list.
bool isComplete() const
If the PHI node is complete which means all of its parent's predecessors have incoming value in this ...
Value * getIncomingValueForBlock(const BasicBlock *BB) const
static PHINode * Create(Type *Ty, unsigned NumReservedValues, const Twine &NameStr="", InsertPosition InsertBefore=nullptr)
Constructors - NumReservedValues is a hint for the number of incoming edges that this phi node will h...
static LLVM_ABI PointerType * get(LLVMContext &C, unsigned AddressSpace)
This constructs an opaque pointer to an object in a numbered address space.
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.
const Loop * getLoop() const
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,...
const APInt & getAPInt() const
LLVM_ABI Value * generateOverflowCheck(const SCEVAddRecExpr *AR, Instruction *Loc, bool Signed)
Generates code that evaluates if the AR expression will overflow.
LLVM_ABI bool hasRelatedExistingExpansion(const SCEV *S, const Instruction *At, Loop *L)
Determine whether there is an existing expansion of S that can be reused.
SmallVector< Instruction *, 32 > getAllInsertedInstructions() const
Return a vector containing all instructions inserted during expansion.
LLVM_ABI bool isSafeToExpand(const SCEV *S) const
Return true if the given expression is safe to expand in the sense that all materialized values are s...
LLVM_ABI bool isSafeToExpandAt(const SCEV *S, const Instruction *InsertionPoint) const
Return true if the given expression is safe to expand in the sense that all materialized values are d...
LLVM_ABI unsigned replaceCongruentIVs(Loop *L, const DominatorTree *DT, SmallVectorImpl< WeakTrackingVH > &DeadInsts, const TargetTransformInfo *TTI=nullptr)
replace congruent phis with their most canonical representative.
static LLVM_ABI void dropPoisonGeneratingAnnotationsAndReinfer(ScalarEvolution &SE, Instruction *I)
Drop poison-generating flags from I, then try re-infer via SCEV.
LLVM_ABI Value * expandUnionPredicate(const SCEVUnionPredicate *Pred, Instruction *Loc)
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a S...
static LLVM_ABI CastInst * findReusableCastForPtrToAddr(Value *PtrOp, Type *Ty, const DataLayout &DL, function_ref< bool(const CastInst *)> Dominates)
Find an existing cast among PtrOp's users that computes the same value as a ptrtoaddr of PtrOp to Ty ...
LLVM_ABI bool hoistIVInc(Instruction *IncV, Instruction *InsertPos, bool RecomputePoisonFlags=false)
Utility for hoisting IncV (with all subexpressions requried for its computation) before InsertPos.
bool isInsertedInstruction(Instruction *I) const
Return true if the specified instruction was inserted by the code rewriter.
LLVM_ABI Value * expandCodeForPredicate(const SCEVPredicate *Pred, Instruction *Loc)
Generates a code sequence that evaluates this predicate.
static LLVM_ABI bool canReuseFlagsFromOriginalIVInc(PHINode *OrigPhi, PHINode *WidePhi, Instruction *OrigInc, Instruction *WideInc)
Return true if both increments directly increment the corresponding IV PHI nodes and have the same op...
LLVM_ABI Value * expandCodeFor(SCEVUse SH, Type *Ty, BasicBlock::iterator I)
Insert code to directly compute the specified SCEV expression into the program.
LLVM_ABI Value * expandComparePredicate(const SCEVComparePredicate *Pred, Instruction *Loc)
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a S...
LLVM_ABI Value * expandWrapPredicate(const SCEVWrapPredicate *P, Instruction *Loc)
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a S...
LLVM_ABI Instruction * getIVIncOperand(Instruction *IncV, Instruction *InsertPos, bool allowScale)
Return the induction variable increment's IV operand.
LLVM_ABI void eraseDeadInstructions(Value *Root)
Remove inserted instructions that are dead, e.g.
LLVM_ABI BasicBlock::iterator findInsertPointAfter(Instruction *I, Instruction *MustDominate) const
Returns a suitable insert point after I, that dominates MustDominate.
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.
Type * getType() const
Return the LLVM type of this SCEV expression.
SCEVTypes getSCEVType() const
static constexpr auto FlagNW
The main scalar evolution driver.
LLVM_ABI bool isKnownNonZero(const SCEV *S)
Test if the given expression is known to be non-zero.
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEV::NoWrapFlags Flags=SCEV::FlagAnyWrap, unsigned Depth=0)
Return LHS-RHS.
static LLVM_ABI bool isGuaranteedNotToBePoison(const SCEV *Op)
Returns true if Op is guaranteed to not be poison.
LLVM_ABI const SCEV * getTruncateOrNoop(const SCEV *V, Type *Ty)
Return a SCEV corresponding to a conversion of the input value to the specified type.
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.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI unsigned getIntegerBitWidth() const
bool isVectorTy() const
True if this is an instance of VectorType.
static LLVM_ABI IntegerType * getInt32Ty(LLVMContext &C)
bool isPointerTy() const
True if this is an instance of PointerType.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
LLVM_ABI unsigned getScalarSizeInBits() const LLVM_READONLY
If this is a vector type, return the getPrimitiveSizeInBits value for the element type.
bool isIntegerTy() const
True if this is an instance of IntegerType.
A Use represents the edge between a Value definition and its users.
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
LLVMContext & getContext() const
All values hold a context through their type.
iterator_range< user_iterator > users()
An efficient, type-erasing, non-owning reference to a callable.
const ParentTy * getParent() const
self_iterator getIterator()
NodeTy * getNextNode()
Get the next node, or nullptr for the list tail.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr bool any(E Val)
constexpr std::underlying_type_t< E > Mask()
Get a bitmask with 1s in all places up to the high-order bit of E's largest value.
@ BasicBlock
Various leaf nodes.
cst_pred_ty< is_power2 > m_Power2()
Match an integer or vector power-of-2.
bool match(Val *V, const Pattern &P)
match_bind< Instruction > m_Instruction(Instruction *&I)
Match an instruction, capturing it if we match.
specificval_ty m_Specific(const Value *V)
Match if we have a specific specified value.
auto m_BasicBlock()
Match an arbitrary basic block value and ignore it.
auto m_Value()
Match an arbitrary value and ignore it.
AnyBinaryOp_match< LHS, RHS, true > m_c_BinOp(const LHS &L, const RHS &R)
Matches a BinaryOperator with LHS and RHS in either order.
CmpClass_match< LHS, RHS, ICmpInst > m_ICmp(CmpPredicate &Pred, const LHS &L, const RHS &R)
brc_match< Cond_t, match_bind< BasicBlock >, match_bind< BasicBlock > > m_Br(const Cond_t &C, BasicBlock *&T, BasicBlock *&F)
cst_pred_ty< is_all_ones > m_scev_AllOnes()
Match an integer with all bits set.
SCEVUnaryExpr_match< SCEVPtrToAddrExpr, Op0_t > m_scev_PtrToAddr(const Op0_t &Op0)
match_bind< const SCEVMulExpr > m_scev_Mul(const SCEVMulExpr *&V)
SCEVBinaryExpr_match< SCEVUDivExpr, Op0_t, Op1_t > m_scev_UDiv(const Op0_t &Op0, const Op1_t &Op1)
match_bind< const SCEVAddExpr > m_scev_Add(const SCEVAddExpr *&V)
SCEVURem_match< Op0_t, Op1_t > m_scev_URem(Op0_t LHS, Op1_t RHS, ScalarEvolution &SE)
Match the mathematical pattern A - (A / B) * B, where A and B can be arbitrary expressions.
@ CE
Windows NT (Windows on ARM)
initializer< Ty > init(const Ty &Val)
@ User
could "use" a pointer
friend class Instruction
Iterator for Instructions in a `BasicBlock.
This is an optimization pass for GlobalISel generic memory operations.
void visitAll(const SCEV *Root, SV &Visitor)
Use SCEVTraversal to visit all nodes in the given expression tree.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
void stable_sort(R &&Range)
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
auto enumerate(FirstRange &&First, RestRanges &&...Rest)
Given two or more input ranges, returns a new range whose values are tuples (A, B,...
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.
constexpr from_range_t from_range
constexpr NextUseDistance min(NextUseDistance A, NextUseDistance B)
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
auto pred_size(const MachineBasicBlock *BB)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
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.
auto reverse(ContainerTy &&C)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
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...
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.
IRBuilder(LLVMContext &, FolderTy, InserterTy, MDNode *, ArrayRef< OperandBundleDef >) -> IRBuilder< FolderTy, InserterTy >
constexpr NextUseDistance max(NextUseDistance A, NextUseDistance B)
@ Mul
Product of integers.
@ Sub
Subtraction of integers.
DWARFExpression::Operation Op
PredIterator< BasicBlock, Value::user_iterator > pred_iterator
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.
auto pred_begin(const MachineBasicBlock *BB)
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
SmallPtrSet< const Loop *, 2 > PostIncLoopSet
auto predecessors(const MachineBasicBlock *BB)
iterator_range< pointer_iterator< WrappedIteratorT > > make_pointer_range(RangeT &&Range)
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
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.
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...