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;
473 const Loop *
L =
nullptr;
478 return RelevantLoops[S] =
L;
483 return Pair.first->second = SE.LI.getLoopFor(
I->getParent());
499 explicit LoopCompare(DominatorTree &dt) : DT(dt) {}
501 bool operator()(std::pair<const Loop *, const SCEV *>
LHS,
502 std::pair<const Loop *, const SCEV *>
RHS)
const {
509 if (
LHS.first !=
RHS.first)
515 if (
LHS.second->isNonConstantNegative()) {
516 if (!
RHS.second->isNonConstantNegative())
518 }
else if (
RHS.second->isNonConstantNegative())
530 const SCEV *URemLHS =
nullptr;
531 const SCEV *URemRHS =
nullptr;
544 for (
const SCEV *
Op :
reverse(S->operands()))
545 OpsAndLoops.
push_back(std::make_pair(getRelevantLoop(
Op),
Op));
553 Value *Sum =
nullptr;
554 for (
auto I = OpsAndLoops.
begin(),
E = OpsAndLoops.
end();
I !=
E;) {
555 const Loop *CurLoop =
I->first;
556 const SCEV *
Op =
I->second;
564 assert(!
Op->getType()->isPointerTy() &&
"Only first op can be pointer");
569 for (;
I !=
E &&
I->first == CurLoop; ++
I) {
572 const SCEV *
X =
I->second;
575 X = SE.getSCEV(
U->getValue());
578 Sum = expandAddToGEP(SE.getAddExpr(NewOps), Sum, S.
getNoWrapFlags());
579 }
else if (
Op->isNonConstantNegative()) {
581 Value *
W = expand(SE.getNegativeSCEV(
Op));
601 Type *Ty = S->getType();
606 for (
const SCEV *
Op :
reverse(S->operands()))
607 OpsAndLoops.
push_back(std::make_pair(getRelevantLoop(
Op),
Op));
614 Value *Prod =
nullptr;
615 auto I = OpsAndLoops.
begin();
620 const auto ExpandOpBinPowN = [
this, &
I, &OpsAndLoops]() {
630 while (
E != OpsAndLoops.
end() && *
I == *
E &&
Exponent != MaxExponent) {
634 assert(
Exponent > 0 &&
"Trying to calculate a zeroth exponent of operand?");
642 for (uint64_t BinExp = 2; BinExp <=
Exponent; BinExp <<= 1) {
653 assert(Result &&
"Nothing was expanded?");
657 while (
I != OpsAndLoops.
end()) {
660 Prod = ExpandOpBinPowN();
661 }
else if (
I->second->isAllOnesValue()) {
668 Value *
W = ExpandOpBinPowN();
677 if (
RHS->logBase2() ==
RHS->getBitWidth() - 1)
679 Prod = InsertBinop(Instruction::Shl, Prod,
680 ConstantInt::get(Ty,
RHS->logBase2()), NWFlags,
695 const APInt &
RHS = SC->getAPInt();
696 if (
RHS.isPowerOf2())
697 return InsertBinop(Instruction::LShr,
LHS,
698 ConstantInt::get(SC->getType(),
RHS.logBase2()),
702 const SCEV *RHSExpr = S->getRHS();
705 bool GuaranteedNotPoison =
707 if (!GuaranteedNotPoison)
708 RHS = Builder.CreateFreeze(
RHS);
713 if (!SE.isKnownNonZero(RHSExpr) || !GuaranteedNotPoison)
714 RHS = Builder.CreateIntrinsic(
RHS->
getType(), Intrinsic::umax,
715 {RHS, ConstantInt::get(RHS->getType(), 1)});
718 SE.isKnownNonZero(S->getRHS()));
731 if (L == IVIncInsertLoop) {
734 if (!SE.DT.dominates(OInst, IVIncInsertPos))
748 return isNormalAddRecExprPHI(PN, IncV, L);
763 if (IncV == InsertPos)
770 case Instruction::Add:
771 case Instruction::Sub: {
773 if (!OInst || SE.DT.dominates(OInst, InsertPos))
777 case Instruction::BitCast:
779 case Instruction::GetElementPtr:
784 if (!SE.DT.dominates(OInst, InsertPos))
810 if (Builder.GetInsertPoint() == It)
811 Builder.SetInsertPoint(&*NewInsertPt);
812 for (
auto *InsertPtGuard : InsertPointGuards)
813 if (InsertPtGuard->GetInsertPoint() == It)
814 InsertPtGuard->SetInsertPoint(NewInsertPt);
821 bool RecomputePoisonFlags) {
826 I->dropPoisonGeneratingFlags();
828 if (
auto Flags = SE.getStrengthenedNoWrapFlagsFromBinOp(OBO)) {
830 BO->setHasNoUnsignedWrap(
832 BO->setHasNoSignedWrap(
837 if (SE.DT.dominates(IncV, InsertPos)) {
838 if (RecomputePoisonFlags)
839 FixupPoisonFlags(IncV);
849 if (!SE.LI.movementPreservesLCSSAForm(IncV, InsertPos))
861 if (SE.DT.dominates(IncV, InsertPos))
865 fixupInsertPoints(
I);
867 if (RecomputePoisonFlags)
890 (IVOper =
getIVIncOperand(IVOper, L->getLoopPreheader()->getTerminator(),
907 IncV = Builder.CreatePtrAdd(PN, StepV,
"scevgep");
910 Builder.CreateSub(PN, StepV, Twine(IVName) +
".iv.next") :
911 Builder.CreateAdd(PN, StepV, Twine(IVName) +
".iv.next");
923 Type *PhiTy = Phi->getType();
937 if (Phi == Requested) {
960 const SCEV *ExtendAfterOp =
962 return ExtendAfterOp == OpAfterExtend;
974 const SCEV *ExtendAfterOp =
976 return ExtendAfterOp == OpAfterExtend;
983SCEVExpander::getAddRecExprPHILiterally(
const SCEVAddRecExpr *Normalized,
986 assert((!IVIncInsertLoop || IVIncInsertPos) &&
987 "Uninitialized insert position");
992 PHINode *AddRecPhiMatch =
nullptr;
999 bool TryNonMatchingSCEV =
1001 SE.DT.properlyDominates(LatchBlock, IVIncInsertLoop->getHeader());
1003 for (PHINode &PN :
L->getHeader()->phis()) {
1004 if (!SE.isSCEVable(PN.
getType()))
1011 DebugType,
dbgs() <<
"One incomplete PHI is found: " << PN <<
"\n");
1019 bool IsMatchingSCEV = PhiSCEV == Normalized;
1023 if (!IsMatchingSCEV && !TryNonMatchingSCEV)
1034 if (!isExpandedAddRecExprPHI(&PN, TempIncV, L))
1037 if (!isNormalAddRecExprPHI(&PN, TempIncV, L))
1042 if (IsMatchingSCEV) {
1046 AddRecPhiMatch = &PN;
1052 if ((!TruncTy || InvertStep) &&
1056 AddRecPhiMatch = &PN;
1058 TruncTy = Normalized->
getType();
1062 if (AddRecPhiMatch) {
1065 InsertedValues.insert(AddRecPhiMatch);
1067 rememberInstruction(IncV);
1069 ReusedValues.insert(AddRecPhiMatch);
1070 ReusedValues.insert(IncV);
1071 return AddRecPhiMatch;
1076 SCEVInsertPointGuard Guard(Builder,
this);
1086 PostIncLoops.
clear();
1089 assert(
L->getLoopPreheader() &&
1090 "Can't expand add recurrences without a loop preheader!");
1092 expand(Normalized->
getStart(),
L->getLoopPreheader()->getTerminator());
1109 Step = SE.getNegativeSCEV(Step);
1111 Value *StepV = expand(Step,
L->getHeader()->getFirstInsertionPt());
1116 bool IncrementIsNUW = !useSubtract &&
IsIncrementNUW(SE, Normalized);
1117 bool IncrementIsNSW = !useSubtract &&
IsIncrementNSW(SE, Normalized);
1121 Builder.SetInsertPoint(Header, Header->begin());
1123 Builder.CreatePHI(ExpandTy,
pred_size(Header), Twine(IVName) +
".iv");
1128 if (!
L->contains(Pred)) {
1137 IVIncInsertPos : Pred->getTerminator();
1138 Builder.SetInsertPoint(InsertPos);
1139 Value *IncV = expandIVInc(PN, StepV, L, useSubtract);
1152 PostIncLoops = SavedPostIncLoops;
1156 InsertedValues.
insert(PN);
1157 InsertedIVs.push_back(PN);
1163 const Loop *
L = S->getLoop();
1167 const SCEVAddRecExpr *Normalized = S;
1168 if (PostIncLoops.count(L)) {
1175 [[maybe_unused]]
const SCEV *
Start = Normalized->
getStart();
1177 assert(SE.properlyDominates(Start,
L->getHeader()) &&
1178 "Start does not properly dominate loop header");
1179 assert(SE.dominates(Step,
L->getHeader()) &&
"Step not dominate loop header");
1183 Type *TruncTy =
nullptr;
1184 bool InvertStep =
false;
1185 PHINode *PN = getAddRecExprPHILiterally(Normalized, L, TruncTy, InvertStep);
1189 if (!PostIncLoops.count(L))
1194 assert(LatchBlock &&
"PostInc mode requires a unique loop latch!");
1202 if (!S->hasNoUnsignedWrap())
1203 I->setHasNoUnsignedWrap(
false);
1204 if (!S->hasNoSignedWrap())
1205 I->setHasNoSignedWrap(
false);
1213 &*Builder.GetInsertPoint())) {
1226 Step = SE.getNegativeSCEV(Step);
1230 SCEVInsertPointGuard Guard(Builder,
this);
1231 StepV = expand(Step,
L->getHeader()->getFirstInsertionPt());
1233 Result = expandIVInc(PN, StepV, L, useSubtract);
1240 if (TruncTy !=
Result->getType() || InvertStep)
1241 Result = fixupLCSSAFormFor(Result);
1243 if (TruncTy !=
Result->getType())
1244 Result = Builder.CreateTrunc(Result, TruncTy);
1248 Result = Builder.CreateSub(expand(Normalized->
getStart()), Result);
1255 Type *STy = S->getType();
1256 const Loop *
L = S->getLoop();
1259 !SE.DT.dominates(EB, Builder.GetInsertBlock()))
1264 auto CanReuse = [&](
const SCEV *ExitSCEV) ->
const SCEV * {
1267 const SCEV *Diff = SE.getMinusSCEV(S, ExitSCEV);
1268 const SCEV *
Op = Diff;
1278 for (
auto &PN : EB->
phis()) {
1279 if (!SE.isSCEVable(PN.
getType()))
1281 auto *ExitSCEV = SE.getSCEV(&PN);
1285 const SCEV *Diff =
nullptr;
1287 DL.getAddressType(PhiTy) == STy) {
1289 const SCEV *AddrSCEV = SE.getPtrToAddrExpr(ExitSCEV);
1290 Diff = CanReuse(AddrSCEV);
1292 const SCEV *IntSCEV = SE.getPtrToIntExpr(ExitSCEV, STy);
1293 Diff = CanReuse(IntSCEV);
1295 }
else if (STy == PhiTy) {
1296 Diff = CanReuse(ExitSCEV);
1302 "difference must be of integer type");
1303 Value *DiffV = expand(Diff);
1304 Value *BaseV = fixupLCSSAFormFor(&PN);
1307 return Builder.CreatePtrAdd(BaseV, DiffV);
1308 BaseV = Builder.CreatePtrToAddr(BaseV);
1310 return Builder.CreateAdd(BaseV, DiffV);
1327 if (!CanonicalMode || (S->getNumOperands() > 2))
1328 return expandAddRecExprLiterally(S);
1330 Type *Ty = SE.getEffectiveSCEVType(S->getType());
1331 const Loop *
L = S->getLoop();
1334 PHINode *CanonicalIV =
nullptr;
1335 if (PHINode *PN =
L->getCanonicalInductionVariable())
1336 if (SE.getTypeSizeInBits(PN->
getType()) >= SE.getTypeSizeInBits(Ty))
1342 SE.getTypeSizeInBits(CanonicalIV->
getType()) > SE.getTypeSizeInBits(Ty) &&
1343 !S->getType()->isPointerTy()) {
1345 for (
unsigned i = 0, e = S->getNumOperands(); i != e; ++i)
1346 NewOps[i] = SE.getAnyExtendExpr(S->getOperand(i), CanonicalIV->
getType());
1351 &*Builder.GetInsertPoint())
1352 : Builder.GetInsertPoint();
1353 V = expand(SE.getTruncateExpr(SE.getUnknown(V), Ty), NewInsertPt);
1359 if (
Value *V = tryToReuseLCSSAPhi(S))
1363 if (!S->getStart()->isZero()) {
1365 Value *StartV = expand(SE.getPointerBase(S));
1366 return expandAddToGEP(SE.removePointerBase(S), StartV,
1371 NewOps[0] = SE.getConstant(Ty, 0);
1379 const SCEV *AddExprLHS = SE.getUnknown(expand(S->getStart()));
1380 const SCEV *AddExprRHS = SE.getUnknown(expand(Rest));
1381 return expand(SE.getAddExpr(AddExprLHS, AddExprRHS));
1392 rememberInstruction(CanonicalIV);
1394 SmallPtrSet<BasicBlock *, 4> PredSeen;
1395 Constant *One = ConstantInt::get(Ty, 1);
1398 if (!PredSeen.
insert(HP).second) {
1405 if (
L->contains(HP)) {
1412 rememberInstruction(
Add);
1421 if (S->isAffine() && S->getOperand(1)->isOne()) {
1422 assert(Ty == SE.getEffectiveSCEVType(CanonicalIV->
getType()) &&
1423 "IVs with types different from the canonical IV should "
1424 "already have been handled!");
1433 expand(SE.getTruncateOrNoop(
1434 SE.getMulExpr(SE.getUnknown(CanonicalIV),
1435 SE.getNoopOrAnyExtend(S->getOperand(1),
1443 const SCEV *IH = SE.getUnknown(CanonicalIV);
1446 const SCEV *NewS = S;
1447 const SCEV *Ext = SE.getNoopOrAnyExtend(S, CanonicalIV->
getType());
1454 const SCEV *
T = SE.getTruncateOrNoop(V, Ty);
1459 Value *
V = expand(S->getOperand());
1460 Type *Ty = S->getType();
1465 for (User *U :
V->users()) {
1467 if (CI && CI->
getType() == Ty &&
1468 (CI->
getOpcode() == CastInst::PtrToAddr ||
1469 CI->
getOpcode() == CastInst::PtrToInt) &&
1470 &*BIP != CI && SE.DT.dominates(CI, &*BIP))
1474 return ReuseOrCreateCast(V, Ty, CastInst::PtrToAddr,
1475 GetOptimalInsertionPointForCastOf(V));
1479 Value *
V = expand(S->getOperand());
1480 return ReuseOrCreateCast(V, S->getType(), CastInst::PtrToInt,
1481 GetOptimalInsertionPointForCastOf(V));
1485 Value *
V = expand(S->getOperand());
1486 return Builder.CreateTrunc(V, S->getType());
1491 Value *
V = expand(S->getOperand());
1492 return Builder.CreateZExt(V, S->getType(),
"",
1493 SE.isKnownNonNegative(S->getOperand()));
1498 Value *
V = expand(S->getOperand());
1499 return Builder.CreateSExt(V, S->getType());
1504 bool IsSequential) {
1505 bool PrevSafeMode = SafeUDivMode;
1506 SafeUDivMode |= IsSequential;
1507 Value *
LHS = expand(S->getOperand(S->getNumOperands() - 1));
1510 LHS = Builder.CreateFreeze(
LHS);
1511 for (
int i = S->getNumOperands() - 2; i >= 0; --i) {
1512 SafeUDivMode = (IsSequential && i != 0) || PrevSafeMode;
1513 Value *
RHS = expand(S->getOperand(i));
1514 if (IsSequential && i != 0)
1515 RHS = Builder.CreateFreeze(
RHS);
1518 Sel = Builder.CreateIntrinsic(IntrinID, {Ty}, {
LHS,
RHS},
1523 Sel = Builder.CreateSelect(ICmp,
LHS,
RHS, Name);
1527 SafeUDivMode = PrevSafeMode;
1532 return expandMinMaxExpr(S, Intrinsic::smax,
"smax");
1536 return expandMinMaxExpr(S, Intrinsic::umax,
"umax");
1540 return expandMinMaxExpr(S, Intrinsic::smin,
"smin");
1544 return expandMinMaxExpr(S, Intrinsic::umin,
"umin");
1547Value *SCEVExpander::visitSequentialUMinExpr(
1549 return expandMinMaxExpr(S, Intrinsic::umin,
"umin",
1554 return Builder.CreateVScale(S->getType());
1565 Value *V = expand(SH);
1567 if (Ty && Ty != V->getType()) {
1568 assert(SE.getTypeSizeInBits(Ty) == SE.getTypeSizeInBits(SH->
getType()) &&
1569 "non-trivial casts should be done with the SCEVs directly!");
1570 V = InsertNoopCastOfTo(V, Ty);
1575Value *SCEVExpander::FindValueInExprValueMap(
1587 for (
Value *V : SE.getSCEVValues(S)) {
1604 DropPoisonGeneratingInsts.
clear();
1622 auto SafeToHoist = [](
const SCEV *S) {
1627 return SC->getValue()->isZero();
1637 if (SafeToHoist(S)) {
1638 for (Loop *L = SE.LI.getLoopFor(Builder.GetInsertBlock());;
1639 L =
L->getParentLoop()) {
1640 if (SE.isLoopInvariant(S, L)) {
1642 if (BasicBlock *Preheader =
L->getLoopPreheader()) {
1648 InsertPt =
L->getHeader()->getFirstInsertionPt();
1654 if (L && SE.hasComputableLoopEvolution(S, L) && !PostIncLoops.count(L))
1655 InsertPt =
L->getHeader()->getFirstInsertionPt();
1657 while (InsertPt != Builder.GetInsertPoint() &&
1659 InsertPt = std::next(InsertPt);
1667 auto I = InsertedExpressions.find(std::make_pair(S, &*InsertPt));
1668 if (
I != InsertedExpressions.end())
1671 SCEVInsertPointGuard Guard(Builder,
this);
1672 Builder.SetInsertPoint(InsertPt->getParent(), InsertPt);
1676 Value *
V = FindValueInExprValueMap(S, &*InsertPt, DropPoisonGeneratingInsts);
1679 V = fixupLCSSAFormFor(V);
1681 for (Instruction *
I : DropPoisonGeneratingInsts) {
1692 InsertedExpressions[std::make_pair(S, &*InsertPt)] =
V;
1696void SCEVExpander::rememberInstruction(
Value *
I) {
1697 auto DoInsert = [
this](
Value *
V) {
1698 if (!PostIncLoops.empty())
1699 InsertedPostIncValues.insert(V);
1701 InsertedValues.insert(V);
1708 OrigFlags.try_emplace(
I, PoisonFlags(
I));
1713 I->dropPoisonGeneratingAnnotations();
1717 if (
auto Flags = SE.getStrengthenedNoWrapFlagsFromBinOp(OBO)) {
1719 BO->setHasNoUnsignedWrap(
1721 BO->setHasNoSignedWrap(
1725 auto *Src = NNI->getOperand(0);
1730 NNI->setNonNeg(
true);
1734void SCEVExpander::replaceCongruentIVInc(
1745 if (!OrigInc || !IsomorphicInc)
1751 if (OrigPhi->
getType() == Phi->getType()) {
1752 bool Chained = ChainedPhis.contains(Phi);
1753 if (!(Chained || isExpandedAddRecExprPHI(OrigPhi, OrigInc, L)) &&
1754 (Chained || isExpandedAddRecExprPHI(Phi, IsomorphicInc, L))) {
1769 const SCEV *TruncExpr =
1770 SE.getTruncateOrNoop(SE.getSCEV(OrigInc), IsomorphicInc->
getType());
1771 if (OrigInc == IsomorphicInc || TruncExpr != SE.getSCEV(IsomorphicInc) ||
1772 !SE.LI.replacementPreservesLCSSAForm(IsomorphicInc, OrigInc))
1775 bool BothHaveNUW =
false;
1776 bool BothHaveNSW =
false;
1779 if (OBOIncV && OBOIsomorphic) {
1781 OBOIncV->hasNoUnsignedWrap() && OBOIsomorphic->hasNoUnsignedWrap();
1783 OBOIncV->hasNoSignedWrap() && OBOIsomorphic->hasNoSignedWrap();
1796 "Should only replace an increment with a wider one.");
1797 if (BothHaveNUW || BothHaveNSW) {
1803 dbgs() <<
"INDVARS: Eliminated congruent iv.inc: "
1804 << *IsomorphicInc <<
'\n');
1805 Value *NewInc = OrigInc;
1809 IP = PN->
getParent()->getFirstInsertionPt();
1814 Builder.SetCurrentDebugLocation(IsomorphicInc->
getDebugLoc());
1816 Builder.CreateTruncOrBitCast(OrigInc, IsomorphicInc->
getType(), IVName);
1841 if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
1842 return RHS->getType()->isIntegerTy() && !LHS->getType()->isIntegerTy();
1843 return RHS->getType()->getPrimitiveSizeInBits().getFixedValue() <
1844 LHS->getType()->getPrimitiveSizeInBits().getFixedValue();
1847 unsigned NumElim = 0;
1855 if (!SE.isSCEVable(PN->
getType()))
1860 return Const->getValue();
1865 if (
Value *V = SimplifyPHINode(Phi)) {
1866 if (V->getType() != Phi->getType())
1868 SE.forgetValue(Phi);
1869 Phi->replaceAllUsesWith(V);
1873 dbgs() <<
"INDVARS: Eliminated constant iv: " << *Phi
1878 if (!SE.isSCEVable(Phi->getType()))
1881 PHINode *&OrigPhiRef = ExprToIVMap[SE.getSCEV(Phi)];
1884 if (Phi->getType()->isIntegerTy() &&
TTI &&
1885 TTI->isTruncateFree(Phi->getType(), Phis.
back()->getType())) {
1889 const SCEV *PhiExpr = SE.getSCEV(Phi);
1893 const SCEV *TruncExpr =
1894 SE.getTruncateExpr(PhiExpr, Phis.
back()->getType());
1895 ExprToIVMap[TruncExpr] = Phi;
1906 replaceCongruentIVInc(Phi, OrigPhiRef, L, DT, DeadInsts);
1908 dbgs() <<
"INDVARS: Eliminated congruent iv: " << *Phi
1911 DebugType,
dbgs() <<
"INDVARS: Original iv: " << *OrigPhiRef <<
'\n');
1913 Value *NewIV = OrigPhiRef;
1914 if (OrigPhiRef->
getType() != Phi->getType()) {
1916 L->getHeader()->getFirstInsertionPt());
1917 Builder.SetCurrentDebugLocation(Phi->getDebugLoc());
1918 NewIV = Builder.CreateTruncOrBitCast(OrigPhiRef, Phi->getType(), IVName);
1920 Phi->replaceAllUsesWith(NewIV);
1932 L->getExitingBlocks(ExitingBlocks);
1939 if (!
match(BB->getTerminator(),
1944 if (SE.getSCEV(LHS) == S && SE.DT.dominates(LHS, At))
1947 if (SE.getSCEV(RHS) == S && SE.DT.dominates(RHS, At))
1956 return FindValueInExprValueMap(S, At, DropPoisonGeneratingInsts) !=
nullptr;
1967 struct OperationIndices {
1968 OperationIndices(
unsigned Opc,
size_t min,
size_t max) :
1969 Opcode(
Opc), MinIdx(
min), MaxIdx(
max) { }
1982 return TTI.getCastInstrCost(Opcode, S->getType(),
1983 S->getOperand(0)->getType(),
1987 auto ArithCost = [&](
unsigned Opcode,
unsigned NumRequired,
1988 unsigned MinIdx = 0,
1991 return NumRequired *
1992 TTI.getArithmeticInstrCost(Opcode, S->getType(),
CostKind);
1995 auto CmpSelCost = [&](
unsigned Opcode,
unsigned NumRequired,
unsigned MinIdx,
1998 Type *OpType = S->getType();
1999 return NumRequired *
TTI.getCmpSelInstrCost(
2004 switch (S->getSCEVType()) {
2012 Cost = CastCost(Instruction::PtrToAddr);
2015 Cost = CastCost(Instruction::PtrToInt);
2018 Cost = CastCost(Instruction::Trunc);
2021 Cost = CastCost(Instruction::ZExt);
2024 Cost = CastCost(Instruction::SExt);
2027 unsigned Opcode = Instruction::UDiv;
2029 if (SC->getAPInt().isPowerOf2())
2030 Opcode = Instruction::LShr;
2031 Cost = ArithCost(Opcode, 1);
2035 Cost = ArithCost(Instruction::Add, S->getNumOperands() - 1);
2046 unsigned OpCode = Instruction::Mul;
2047 if (S->getNumOperands() == 2)
2049 if (SC->getAPInt().isAllOnes())
2050 OpCode = Instruction::Sub;
2051 else if (SC->getAPInt().isPowerOf2())
2052 OpCode = Instruction::Shl;
2054 Cost = ArithCost(OpCode, S->getNumOperands() - 1);
2064 Cost += CmpSelCost(Instruction::ICmp, S->getNumOperands() - 1, 0, 1);
2065 Cost += CmpSelCost(Instruction::Select, S->getNumOperands() - 1, 0, 2);
2066 switch (S->getSCEVType()) {
2070 Cost += CmpSelCost(Instruction::ICmp, S->getNumOperands() - 1, 0, 0);
2071 Cost += ArithCost(Instruction::Or,
2072 S->getNumOperands() > 2 ? S->getNumOperands() - 2 : 0);
2073 Cost += CmpSelCost(Instruction::Select, 1, 0, 1);
2078 "Unhandled SCEV expression type?");
2085 unsigned NumRecurrences = S->getNumOperands() - 1;
2086 Cost +=
TTI.getCFInstrCost(Instruction::PHI,
CostKind) * NumRecurrences;
2088 TTI.getArithmeticInstrCost(Instruction::Add, S->getType(),
CostKind) *
2091 Worklist.
emplace_back(Instruction::PHI, 0, S->getOperand(0));
2093 for (
const SCEV *
Op : S->operands().drop_front())
2099 for (
auto &CostOp : Operations) {
2100 for (
auto SCEVOp :
enumerate(S->operands())) {
2102 size_t MinIdx = std::max(SCEVOp.index(), CostOp.MinIdx);
2103 size_t OpIdx = std::min(MinIdx, CostOp.MaxIdx);
2110bool SCEVExpander::isHighCostExpansionHelper(
2118 const SCEV *S = WorkItem.
S;
2129 L->getHeader()->getParent()->hasMinSize()
2148 return Cost > Budget;
2169 SE.getAddExpr(S, SE.getConstant(S->
getType(), 1)), &At, L))
2184 "Nary expr should have more than 1 operand.");
2189 return Cost > Budget;
2193 "Polynomial should be at least linear");
2196 return Cost > Budget;
2205 switch (Pred->getKind()) {
2220 Value *Expr0 = expand(Pred->getLHS(), IP);
2221 Value *Expr1 = expand(Pred->getRHS(), IP);
2223 Builder.SetInsertPoint(IP);
2225 auto *
I = Builder.CreateICmp(InvPred, Expr0, Expr1,
"ident.check");
2232 "non-affine expression");
2236 const SCEV *ExitCount =
2237 SE.getPredicatedSymbolicMaxBackedgeTakenCount(AR->
getLoop(), Pred);
2245 unsigned SrcBits = SE.getTypeSizeInBits(ExitCount->
getType());
2246 unsigned DstBits = SE.getTypeSizeInBits(ARTy);
2253 Builder.SetInsertPoint(
Loc);
2254 Value *TripCountVal = expand(ExitCount,
Loc);
2259 Value *StepValue = expand(Step,
Loc);
2260 Value *NegStepValue = expand(SE.getNegativeSCEV(Step),
Loc);
2261 Value *StartValue = expand(Start,
Loc);
2266 Builder.SetInsertPoint(
Loc);
2269 Value *AbsStep = Builder.CreateSelect(StepCompare, NegStepValue, StepValue);
2279 auto ComputeEndCheck = [&]() ->
Value * {
2281 Value *TruncTripCount = Builder.CreateZExtOrTrunc(TripCountVal, Ty);
2283 Value *
Mul = Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, Ty,
2284 {AbsStep, TruncTripCount},
2286 Value *MulV = Builder.CreateExtractValue(
Mul, 0,
"mul.result");
2287 Value *OfMul = Builder.CreateExtractValue(
Mul, 1,
"mul.overflow");
2290 bool NeedPosCheck = !SE.isKnownNegative(Step);
2291 bool NeedNegCheck = !SE.isKnownPositive(Step);
2294 Value *NegMulV = Builder.CreateNeg(MulV);
2296 Add = Builder.CreatePtrAdd(StartValue, MulV);
2298 Sub = Builder.CreatePtrAdd(StartValue, NegMulV);
2301 Add = Builder.CreateAdd(StartValue, MulV);
2303 Sub = Builder.CreateSub(StartValue, MulV);
2306 Value *EndCompareLT =
nullptr;
2307 Value *EndCompareGT =
nullptr;
2308 Value *EndCheck =
nullptr;
2310 EndCheck = EndCompareLT = Builder.CreateICmp(
2313 EndCheck = EndCompareGT = Builder.CreateICmp(
2315 if (NeedPosCheck && NeedNegCheck) {
2317 EndCheck = Builder.CreateSelect(StepCompare, EndCompareGT, EndCompareLT);
2319 return Builder.CreateOr(EndCheck, OfMul);
2321 Value *EndCheck = ComputeEndCheck();
2326 if (SrcBits > DstBits) {
2328 auto *BackedgeCheck =
2330 ConstantInt::get(
Loc->getContext(), MaxVal));
2331 BackedgeCheck = Builder.CreateAnd(
2334 EndCheck = Builder.CreateOr(EndCheck, BackedgeCheck);
2343 Value *NSSWCheck =
nullptr, *NUSWCheck =
nullptr;
2353 if (NUSWCheck && NSSWCheck)
2354 return Builder.CreateOr(NUSWCheck, NSSWCheck);
2369 for (
const auto *Pred : Union->getPredicates()) {
2371 Builder.SetInsertPoint(IP);
2376 return Builder.CreateOr(Checks);
2379Value *SCEVExpander::fixupLCSSAFormFor(
Value *V) {
2381 if (!PreserveLCSSA || !DefI)
2387 if (!DefLoop || UseLoop == DefLoop || DefLoop->
contains(UseLoop))
2398 if (DefI->getType()->isIntegerTy())
2412 for (
PHINode *PN : InsertedPHIs)
2413 rememberInstruction(PN);
2414 for (
PHINode *PN : PHIsToRemove) {
2417 InsertedValues.erase(PN);
2418 InsertedPostIncValues.erase(PN);
2422 return User->getOperand(0);
2444struct SCEVFindUnsafe {
2445 ScalarEvolution &SE;
2447 bool IsUnsafe =
false;
2449 SCEVFindUnsafe(ScalarEvolution &SE,
bool CanonicalMode)
2450 : SE(SE), CanonicalMode(CanonicalMode) {}
2452 bool follow(
const SCEV *S) {
2463 if (!AR->getLoop()->getLoopPreheader() &&
2464 (!CanonicalMode || !AR->isAffine())) {
2471 bool isDone()
const {
return IsUnsafe; }
2476 SCEVFindUnsafe Search(SE, CanonicalMode);
2478 return !Search.IsUnsafe;
2509 for (
auto [
I, Flags] : Expander.OrigFlags)
2512 auto InsertedInstructions = Expander.getAllInsertedInstructions();
2515 InsertedInstructions);
2525 [&InsertedSet](
Value *U) {
2526 return InsertedSet.contains(cast<Instruction>(U));
2528 "removed instruction should only be used by instructions inserted "
2529 "during expansion");
2531 assert(!
I->getType()->isVoidTy() &&
2532 "inserted instruction should have non-void types");
2534 I->eraseFromParent();
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
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")))
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)
This file defines the make_scope_exit function, which executes user-defined cleanup logic at scope ex...
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.
static APInt getZero(unsigned numBits)
Get the '0' value for the specified bit-width.
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.
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.
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 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.
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.
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,...
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...
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.
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.
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.
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()
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)
@ C
The default llvm calling convention, compatible with C.
@ 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)
SCEVUnaryExpr_match< SCEVPtrToIntExpr, Op0_t > m_scev_PtrToInt(const Op0_t &Op0)
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...