33#if LLVM_ENABLE_ABI_BREAKING_CHECKS
34#define SCEV_DEBUG_WITH_TYPE(TYPE, X) DEBUG_WITH_TYPE(TYPE, X)
36#define SCEV_DEBUG_WITH_TYPE(TYPE, X)
43 cl::desc(
"When performing SCEV expansion only if it is cheap to do, this "
44 "controls the budget that is considered cheap (default = 4)"));
58 NUW = OBO->hasNoUnsignedWrap();
59 NSW = OBO->hasNoSignedWrap();
62 Exact = PEO->isExact();
66 NNeg = PNI->hasNonNeg();
68 NUW = TI->hasNoUnsignedWrap();
69 NSW = TI->hasNoSignedWrap();
79 I->setHasNoUnsignedWrap(
NUW);
80 I->setHasNoSignedWrap(
NSW);
89 I->setHasNoUnsignedWrap(
NUW);
90 I->setHasNoSignedWrap(
NSW);
115 Value *Ret =
nullptr;
120 if (U->getType() != Ty)
129 if (IP->getParent() == CI->
getParent() && &*BIP != CI &&
139 SCEVInsertPointGuard Guard(Builder,
this);
140 Builder.SetInsertPoint(&*IP);
141 Ret = Builder.CreateCast(
Op, V, Ty,
V->getName());
157 if (
auto MaybeIP =
I->getInsertionPointAfterDef()) {
160 assert(SE.DT.dominates(
I, MustDominate) &&
161 "instruction must dominate the insertion point");
178 while (!WorkList.
empty()) {
187 InsertedValues.erase(
I);
188 InsertedPostIncValues.erase(
I);
190 I->eraseFromParent();
195SCEVExpander::GetOptimalInsertionPointForCastOf(
Value *V)
const {
214 "Expected the cast argument to be a global/constant");
215 return Builder.GetInsertBlock()
218 .getFirstInsertionPt();
226 assert((
Op == Instruction::BitCast ||
227 Op == Instruction::PtrToInt ||
228 Op == Instruction::IntToPtr) &&
229 "InsertNoopCastOfTo cannot perform non-noop casts!");
230 assert(SE.getTypeSizeInBits(
V->getType()) == SE.getTypeSizeInBits(Ty) &&
231 "InsertNoopCastOfTo cannot change sizes!");
238 if (
Op == Instruction::IntToPtr) {
240 if (DL.isNonIntegralPointerType(PtrTy))
244 if (
Op == Instruction::BitCast) {
245 if (
V->getType() == Ty)
253 if ((
Op == Instruction::PtrToInt ||
Op == Instruction::IntToPtr) &&
254 SE.getTypeSizeInBits(Ty) == SE.getTypeSizeInBits(
V->getType())) {
256 if ((CI->
getOpcode() == Instruction::PtrToInt ||
257 CI->
getOpcode() == Instruction::IntToPtr) &&
258 SE.getTypeSizeInBits(CI->
getType()) ==
262 if ((
CE->getOpcode() == Instruction::PtrToInt ||
263 CE->getOpcode() == Instruction::IntToPtr) &&
264 SE.getTypeSizeInBits(
CE->getType()) ==
265 SE.getTypeSizeInBits(
CE->getOperand(0)->getType()))
266 return CE->getOperand(0);
274 return ReuseOrCreateCast(V, Ty,
Op, GetOptimalInsertionPointForCastOf(V));
290 unsigned ScanLimit = 6;
294 if (IP != BlockBegin) {
296 for (; ScanLimit; --IP, --ScanLimit) {
311 if (IP->getOpcode() == (
unsigned)Opcode && IP->getOperand(0) ==
LHS &&
312 IP->getOperand(1) ==
RHS && !canGenerateIncompatiblePoison(&*IP))
314 if (IP == BlockBegin)
break;
319 DebugLoc Loc = Builder.GetInsertPoint()->getDebugLoc();
320 SCEVInsertPointGuard Guard(Builder,
this);
324 while (
const Loop *L = SE.LI.getLoopFor(Builder.GetInsertBlock())) {
325 if (!
L->isLoopInvariant(
LHS) || !
L->isLoopInvariant(
RHS))
break;
327 if (!Preheader)
break;
335 Builder.SetCurrentDebugLocation(Loc);
340 if (LSRMode && !PostIncLoops.empty() &&
342 return !
L->contains(Builder.GetInsertBlock());
346 BO->setHasNoUnsignedWrap();
348 BO->setHasNoSignedWrap();
349 return Builder.Insert(BO);
351 return Builder.CreateNoWrapBinOp(Opcode,
LHS,
RHS, IsNUW, IsNSW);
389 : GEPNoWrapFlags::
none();
394 return Builder.CreatePtrAdd(CLHS, CRHS,
"", NW);
397 unsigned ScanLimit = 6;
401 if (IP != BlockBegin) {
403 for (; ScanLimit; --IP, --ScanLimit) {
405 if (
GEP->getPointerOperand() == V &&
406 GEP->getSourceElementType() == Builder.getInt8Ty() &&
407 GEP->getOperand(1) == Idx) {
409 GEP->setNoWrapFlags(
GEP->getNoWrapFlags() & NW);
413 if (IP == BlockBegin)
break;
418 SCEVInsertPointGuard Guard(Builder,
this);
421 while (
const Loop *L = SE.LI.getLoopFor(Builder.GetInsertBlock())) {
422 if (!
L->isLoopInvariant(V) || !
L->isLoopInvariant(Idx))
break;
424 if (!Preheader)
break;
431 return Builder.CreatePtrAdd(V, Idx,
"scevgep", NW);
441 if (
A->contains(
B))
return B;
442 if (
B->contains(
A))
return A;
443 if (DT.
dominates(
A->getHeader(),
B->getHeader()))
return B;
444 if (DT.
dominates(
B->getHeader(),
A->getHeader()))
return A;
450const Loop *SCEVExpander::getRelevantLoop(
const SCEV *S) {
452 auto Pair = RelevantLoops.try_emplace(S);
454 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 *, SCEVUse>
LHS,
502 std::pair<const Loop *, SCEVUse>
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;
540 const SCEV *UMaxRHS =
nullptr;
541 const SCEVConstant *C1, *C2;
547 return Builder.CreateIntrinsic(Intrinsic::usub_sat, {S->getType()},
557 OpsAndLoops.
push_back(std::make_pair(getRelevantLoop(
Op),
Op));
565 Value *Sum =
nullptr;
566 for (
auto I = OpsAndLoops.
begin(),
E = OpsAndLoops.
end();
I !=
E;) {
567 const Loop *CurLoop =
I->first;
576 assert(!
Op->getType()->isPointerTy() &&
"Only first op can be pointer");
581 for (;
I !=
E &&
I->first == CurLoop; ++
I) {
587 X = SE.getSCEV(
U->getValue());
590 Sum = expandAddToGEP(SE.getAddExpr(NewOps), Sum, S.
getNoWrapFlags());
591 }
else if (
Op->isNonConstantNegative()) {
593 Value *
W = expand(SE.getNegativeSCEV(
Op));
613 Type *Ty = S->getType();
615 const SCEVConstant *C1, *C2;
626 Value *Res = InsertBinop(Instruction::And,
LHS, ConstantInt::get(Ty, Mask),
634 for (
const SCEV *
Op :
reverse(S->operands()))
635 OpsAndLoops.
push_back(std::make_pair(getRelevantLoop(
Op),
Op));
642 Value *Prod =
nullptr;
643 auto I = OpsAndLoops.
begin();
648 const auto ExpandOpBinPowN = [
this, &
I, &OpsAndLoops]() {
658 while (
E != OpsAndLoops.
end() && *
I == *
E &&
Exponent != MaxExponent) {
662 assert(
Exponent > 0 &&
"Trying to calculate a zeroth exponent of operand?");
681 assert(Result &&
"Nothing was expanded?");
685 while (
I != OpsAndLoops.
end()) {
688 Prod = ExpandOpBinPowN();
689 }
else if (
I->second->isAllOnesValue()) {
696 Value *
W = ExpandOpBinPowN();
705 if (
RHS->logBase2() ==
RHS->getBitWidth() - 1)
707 Prod = InsertBinop(Instruction::Shl, Prod,
708 ConstantInt::get(Ty,
RHS->logBase2()), NWFlags,
723 const APInt &
RHS = SC->getAPInt();
724 if (
RHS.isPowerOf2())
725 return InsertBinop(Instruction::LShr,
LHS,
726 ConstantInt::get(SC->getType(),
RHS.logBase2()),
730 const SCEV *RHSExpr = S->getRHS();
733 bool GuaranteedNotPoison =
735 if (!GuaranteedNotPoison)
736 RHS = Builder.CreateFreeze(
RHS);
741 if (!SE.isKnownNonZero(RHSExpr) || !GuaranteedNotPoison)
742 RHS = Builder.CreateIntrinsic(
RHS->
getType(), Intrinsic::umax,
743 {RHS, ConstantInt::get(RHS->getType(), 1)});
746 SE.isKnownNonZero(S->getRHS()));
759 if (L == IVIncInsertLoop) {
762 if (!SE.DT.dominates(OInst, IVIncInsertPos))
776 return isNormalAddRecExprPHI(PN, IncV, L);
791 if (IncV == InsertPos)
798 case Instruction::Add:
799 case Instruction::Sub: {
801 if (!OInst || SE.DT.dominates(OInst, InsertPos))
805 case Instruction::BitCast:
807 case Instruction::GetElementPtr:
812 if (!SE.DT.dominates(OInst, InsertPos))
838 if (Builder.GetInsertPoint() == It)
839 Builder.SetInsertPoint(&*NewInsertPt);
840 for (
auto *InsertPtGuard : InsertPointGuards)
841 if (InsertPtGuard->GetInsertPoint() == It)
842 InsertPtGuard->SetInsertPoint(NewInsertPt);
849 bool RecomputePoisonFlags) {
854 I->dropPoisonGeneratingFlags();
856 if (
auto Flags = SE.getStrengthenedNoWrapFlagsFromBinOp(OBO)) {
858 BO->setHasNoUnsignedWrap(
860 BO->setHasNoSignedWrap(
865 if (SE.DT.dominates(IncV, InsertPos)) {
866 if (RecomputePoisonFlags)
867 FixupPoisonFlags(IncV);
877 if (!SE.LI.movementPreservesLCSSAForm(IncV, InsertPos))
889 if (SE.DT.dominates(IncV, InsertPos))
893 fixupInsertPoints(
I);
895 if (RecomputePoisonFlags)
918 (IVOper =
getIVIncOperand(IVOper, L->getLoopPreheader()->getTerminator(),
935 IncV = Builder.CreatePtrAdd(PN, StepV,
"scevgep");
938 Builder.CreateSub(PN, StepV, Twine(IVName) +
".iv.next") :
939 Builder.CreateAdd(PN, StepV, Twine(IVName) +
".iv.next");
951 Type *PhiTy = Phi->getType();
965 if (Phi == Requested) {
988 const SCEV *ExtendAfterOp =
990 return ExtendAfterOp == OpAfterExtend;
1002 const SCEV *ExtendAfterOp =
1004 return ExtendAfterOp == OpAfterExtend;
1011SCEVExpander::getAddRecExprPHILiterally(
const SCEVAddRecExpr *Normalized,
1014 assert((!IVIncInsertLoop || IVIncInsertPos) &&
1015 "Uninitialized insert position");
1020 PHINode *AddRecPhiMatch =
nullptr;
1027 bool TryNonMatchingSCEV =
1029 SE.DT.properlyDominates(LatchBlock, IVIncInsertLoop->getHeader());
1031 for (PHINode &PN :
L->getHeader()->phis()) {
1032 if (!SE.isSCEVable(PN.
getType()))
1039 DebugType,
dbgs() <<
"One incomplete PHI is found: " << PN <<
"\n");
1047 bool IsMatchingSCEV = PhiSCEV == Normalized;
1051 if (!IsMatchingSCEV && !TryNonMatchingSCEV)
1062 if (!isExpandedAddRecExprPHI(&PN, TempIncV, L))
1065 if (!isNormalAddRecExprPHI(&PN, TempIncV, L))
1070 if (IsMatchingSCEV) {
1074 AddRecPhiMatch = &PN;
1080 if ((!TruncTy || InvertStep) &&
1084 AddRecPhiMatch = &PN;
1086 TruncTy = Normalized->
getType();
1090 if (AddRecPhiMatch) {
1093 InsertedValues.insert(AddRecPhiMatch);
1095 rememberInstruction(IncV);
1097 ReusedValues.insert(AddRecPhiMatch);
1098 ReusedValues.insert(IncV);
1099 return AddRecPhiMatch;
1104 SCEVInsertPointGuard Guard(Builder,
this);
1114 PostIncLoops.
clear();
1117 assert(
L->getLoopPreheader() &&
1118 "Can't expand add recurrences without a loop preheader!");
1120 expand(Normalized->
getStart(),
L->getLoopPreheader()->getTerminator());
1137 Step = SE.getNegativeSCEV(Step);
1139 Value *StepV = expand(Step,
L->getHeader()->getFirstInsertionPt());
1144 bool IncrementIsNUW = !useSubtract &&
IsIncrementNUW(SE, Normalized);
1145 bool IncrementIsNSW = !useSubtract &&
IsIncrementNSW(SE, Normalized);
1149 Builder.SetInsertPoint(Header, Header->begin());
1151 Builder.CreatePHI(ExpandTy,
pred_size(Header), Twine(IVName) +
".iv");
1156 if (!
L->contains(Pred)) {
1165 IVIncInsertPos : Pred->getTerminator();
1166 Builder.SetInsertPoint(InsertPos);
1167 Value *IncV = expandIVInc(PN, StepV, L, useSubtract);
1180 PostIncLoops = SavedPostIncLoops;
1184 InsertedValues.
insert(PN);
1185 InsertedIVs.push_back(PN);
1191 const Loop *
L = S->getLoop();
1195 const SCEVAddRecExpr *Normalized = S;
1196 if (PostIncLoops.count(L)) {
1203 [[maybe_unused]]
const SCEV *
Start = Normalized->
getStart();
1205 assert(SE.properlyDominates(Start,
L->getHeader()) &&
1206 "Start does not properly dominate loop header");
1207 assert(SE.dominates(Step,
L->getHeader()) &&
"Step not dominate loop header");
1211 Type *TruncTy =
nullptr;
1212 bool InvertStep =
false;
1213 PHINode *PN = getAddRecExprPHILiterally(Normalized, L, TruncTy, InvertStep);
1217 if (!PostIncLoops.count(L))
1222 assert(LatchBlock &&
"PostInc mode requires a unique loop latch!");
1230 if (!S->hasNoUnsignedWrap())
1231 I->setHasNoUnsignedWrap(
false);
1232 if (!S->hasNoSignedWrap())
1233 I->setHasNoSignedWrap(
false);
1241 &*Builder.GetInsertPoint())) {
1254 Step = SE.getNegativeSCEV(Step);
1258 SCEVInsertPointGuard Guard(Builder,
this);
1259 StepV = expand(Step,
L->getHeader()->getFirstInsertionPt());
1261 Result = expandIVInc(PN, StepV, L, useSubtract);
1268 if (TruncTy !=
Result->getType() || InvertStep)
1269 Result = fixupLCSSAFormFor(Result);
1271 if (TruncTy !=
Result->getType())
1272 Result = Builder.CreateTrunc(Result, TruncTy);
1276 Result = Builder.CreateSub(expand(Normalized->
getStart()), Result);
1283 Type *STy = S->getType();
1284 const Loop *
L = S->getLoop();
1287 !SE.DT.dominates(EB, Builder.GetInsertBlock()))
1292 auto CanReuse = [&](
const SCEV *ExitSCEV) ->
const SCEV * {
1295 const SCEV *Diff = SE.getMinusSCEV(S, ExitSCEV);
1296 const SCEV *
Op = Diff;
1305 for (
auto &PN : EB->
phis()) {
1306 if (!SE.isSCEVable(PN.
getType()))
1308 auto *ExitSCEV = SE.getSCEV(&PN);
1312 const SCEV *Diff =
nullptr;
1314 DL.getAddressType(PhiTy) == STy) {
1315 const SCEV *AddrSCEV = SE.getPtrToAddrExpr(ExitSCEV);
1316 Diff = CanReuse(AddrSCEV);
1317 }
else if (STy == PhiTy) {
1318 Diff = CanReuse(ExitSCEV);
1324 "difference must be of integer type");
1325 Value *DiffV = expand(Diff);
1326 Value *BaseV = fixupLCSSAFormFor(&PN);
1329 return Builder.CreatePtrAdd(BaseV, DiffV);
1330 BaseV = Builder.CreatePtrToAddr(BaseV);
1332 return Builder.CreateAdd(BaseV, DiffV);
1349 if (!CanonicalMode || (S->getNumOperands() > 2))
1350 return expandAddRecExprLiterally(S);
1352 Type *Ty = SE.getEffectiveSCEVType(S->getType());
1353 const Loop *
L = S->getLoop();
1356 PHINode *CanonicalIV =
nullptr;
1357 if (PHINode *PN =
L->getCanonicalInductionVariable())
1358 if (SE.getTypeSizeInBits(PN->
getType()) >= SE.getTypeSizeInBits(Ty))
1364 SE.getTypeSizeInBits(CanonicalIV->
getType()) > SE.getTypeSizeInBits(Ty) &&
1365 !S->getType()->isPointerTy()) {
1367 for (
unsigned i = 0, e = S->getNumOperands(); i != e; ++i)
1368 NewOps[i] = SE.getAnyExtendExpr(S->getOperand(i), CanonicalIV->
getType());
1373 &*Builder.GetInsertPoint())
1374 : Builder.GetInsertPoint();
1375 V = expand(SE.getTruncateExpr(SE.getUnknown(V), Ty), NewInsertPt);
1381 if (
Value *V = tryToReuseLCSSAPhi(S))
1385 if (!S->getStart()->isZero()) {
1387 Value *StartV = expand(SE.getPointerBase(S));
1388 return expandAddToGEP(SE.removePointerBase(S), StartV,
1393 NewOps[0] = SE.getConstant(Ty, 0);
1401 const SCEV *AddExprLHS = SE.getUnknown(expand(S->getStart()));
1402 const SCEV *AddExprRHS = SE.getUnknown(expand(Rest));
1403 return expand(SE.getAddExpr(AddExprLHS, AddExprRHS));
1414 rememberInstruction(CanonicalIV);
1416 SmallPtrSet<BasicBlock *, 4> PredSeen;
1417 Constant *One = ConstantInt::get(Ty, 1);
1420 if (!PredSeen.
insert(HP).second) {
1427 if (
L->contains(HP)) {
1434 rememberInstruction(
Add);
1443 if (S->isAffine() && S->getOperand(1)->isOne()) {
1444 assert(Ty == SE.getEffectiveSCEVType(CanonicalIV->
getType()) &&
1445 "IVs with types different from the canonical IV should "
1446 "already have been handled!");
1455 expand(SE.getTruncateOrNoop(
1456 SE.getMulExpr(SE.getUnknown(CanonicalIV),
1457 SE.getNoopOrAnyExtend(S->getOperand(1),
1465 const SCEV *IH = SE.getUnknown(CanonicalIV);
1468 const SCEV *NewS = S;
1469 const SCEV *Ext = SE.getNoopOrAnyExtend(S, CanonicalIV->
getType());
1476 const SCEV *
T = SE.getTruncateOrNoop(V, Ty);
1486 if (CI->
getOpcode() == CastInst::PtrToAddr)
1488 if (CI->
getOpcode() != CastInst::PtrToInt)
1491 return DL.getPointerSizeInBits(AS) ==
DL.getIndexSizeInBits(AS);
1512 Type *Ty = S->getType();
1518 return &*BIP != CI && SE.DT.
dominates(CI, &*BIP);
1522 return ReuseOrCreateCast(V, Ty, CastInst::PtrToAddr,
1523 GetOptimalInsertionPointForCastOf(V));
1527 Type *Ty = S->getType();
1533 Value *PtrOp = expand(PtrToAddr->getOperand());
1536 for (User *U : PtrOp->
users()) {
1538 if (CI && CI->
getType() == Ty &&
1539 CI->
getOpcode() == CastInst::PtrToInt && &*BIP != CI &&
1540 SE.DT.dominates(CI, &*BIP))
1546 Value *
V = expand(S->getOperand());
1547 return Builder.CreateTrunc(V, S->getType());
1552 Value *
V = expand(S->getOperand());
1553 return Builder.CreateZExt(V, S->getType(),
"",
1554 SE.isKnownNonNegative(S->getOperand()));
1559 Value *
V = expand(S->getOperand());
1560 return Builder.CreateSExt(V, S->getType());
1565 bool IsSequential) {
1566 bool PrevSafeMode = SafeUDivMode;
1567 SafeUDivMode |= IsSequential;
1568 Value *
LHS = expand(S->getOperand(S->getNumOperands() - 1));
1571 LHS = Builder.CreateFreeze(
LHS);
1572 for (
int i = S->getNumOperands() - 2; i >= 0; --i) {
1573 SafeUDivMode = (IsSequential && i != 0) || PrevSafeMode;
1574 Value *
RHS = expand(S->getOperand(i));
1575 if (IsSequential && i != 0)
1576 RHS = Builder.CreateFreeze(
RHS);
1579 Sel = Builder.CreateIntrinsic(IntrinID, {Ty}, {
LHS,
RHS},
1584 Sel = Builder.CreateSelectWithUnknownProfile(ICmp,
LHS,
RHS,
1585 "scev-expander", Name);
1589 SafeUDivMode = PrevSafeMode;
1594 return expandMinMaxExpr(S, Intrinsic::smax,
"smax");
1598 return expandMinMaxExpr(S, Intrinsic::umax,
"umax");
1602 return expandMinMaxExpr(S, Intrinsic::smin,
"smin");
1606 return expandMinMaxExpr(S, Intrinsic::umin,
"umin");
1609Value *SCEVExpander::visitSequentialUMinExpr(
1611 return expandMinMaxExpr(S, Intrinsic::umin,
"umin",
1616 return Builder.CreateVScale(S->getType());
1627 Value *V = expand(SH);
1629 if (Ty && Ty != V->getType()) {
1630 assert(SE.getTypeSizeInBits(Ty) == SE.getTypeSizeInBits(SH->
getType()) &&
1631 "non-trivial casts should be done with the SCEVs directly!");
1632 V = InsertNoopCastOfTo(V, Ty);
1637Value *SCEVExpander::FindValueInExprValueMap(
1649 for (
Value *V : SE.getSCEVValues(S)) {
1666 DropPoisonGeneratingInsts.
clear();
1671Value *SCEVExpander::findExistingExpansionAndDropPoisonFlags(
1673 SmallVector<Instruction *> DropPoisonGeneratingInsts;
1674 Value *
V = FindValueInExprValueMap(S, InsertPt, DropPoisonGeneratingInsts);
1677 for (Instruction *
I : DropPoisonGeneratingInsts) {
1698 auto SafeToHoist = [](
const SCEV *S) {
1703 return SC->getValue()->isZero();
1713 if (SafeToHoist(S)) {
1714 for (
Loop *L = SE.LI.getLoopFor(Builder.GetInsertBlock());;
1715 L =
L->getParentLoop()) {
1716 if (SE.isLoopInvariant(S, L)) {
1718 if (BasicBlock *Preheader =
L->getLoopPreheader()) {
1724 InsertPt =
L->getHeader()->getFirstInsertionPt();
1730 if (L && SE.hasComputableLoopEvolution(S, L) && !PostIncLoops.count(L))
1731 InsertPt =
L->getHeader()->getFirstInsertionPt();
1733 while (InsertPt != Builder.GetInsertPoint() &&
1735 InsertPt = std::next(InsertPt);
1743 auto I = InsertedExpressions.find(std::make_pair(S, &*InsertPt));
1744 if (
I != InsertedExpressions.end())
1747 SCEVInsertPointGuard Guard(Builder,
this);
1748 Builder.SetInsertPoint(InsertPt->getParent(), InsertPt);
1751 Value *
V = findExistingExpansionAndDropPoisonFlags(S, &*InsertPt);
1753 if (!V && InsertPt != OrigInsertPt && PostIncLoops.empty()) {
1757 V = findExistingExpansionAndDropPoisonFlags(S, &*OrigInsertPt);
1759 CacheAt = OrigInsertPt;
1763 V = fixupLCSSAFormFor(V);
1771 InsertedExpressions[std::make_pair(S, &*CacheAt)] =
V;
1775void SCEVExpander::rememberInstruction(
Value *
I) {
1776 auto DoInsert = [
this](
Value *
V) {
1777 if (!PostIncLoops.empty())
1778 InsertedPostIncValues.insert(V);
1780 InsertedValues.insert(V);
1787 OrigFlags.try_emplace(
I, PoisonFlags(
I));
1792 I->dropPoisonGeneratingAnnotations();
1796 if (SE.isSCEVable(OBO->getType()))
1797 if (
auto Flags = SE.getStrengthenedNoWrapFlagsFromBinOp(OBO)) {
1799 BO->setHasNoUnsignedWrap(
1801 BO->setHasNoSignedWrap(
1805 auto *Src = NNI->getOperand(0);
1810 NNI->setNonNeg(
true);
1814void SCEVExpander::replaceCongruentIVInc(
1825 if (!OrigInc || !IsomorphicInc)
1831 if (OrigPhi->
getType() == Phi->getType()) {
1832 bool Chained = ChainedPhis.contains(Phi);
1833 if (!(Chained || isExpandedAddRecExprPHI(OrigPhi, OrigInc, L)) &&
1834 (Chained || isExpandedAddRecExprPHI(Phi, IsomorphicInc, L))) {
1849 const SCEV *TruncExpr =
1850 SE.getTruncateOrNoop(SE.getSCEV(OrigInc), IsomorphicInc->
getType());
1851 if (OrigInc == IsomorphicInc || TruncExpr != SE.getSCEV(IsomorphicInc) ||
1852 !SE.LI.replacementPreservesLCSSAForm(IsomorphicInc, OrigInc))
1855 bool BothHaveNUW =
false;
1856 bool BothHaveNSW =
false;
1859 if (OBOIncV && OBOIsomorphic) {
1861 OBOIncV->hasNoUnsignedWrap() && OBOIsomorphic->hasNoUnsignedWrap();
1863 OBOIncV->hasNoSignedWrap() && OBOIsomorphic->hasNoSignedWrap();
1876 "Should only replace an increment with a wider one.");
1877 if (BothHaveNUW || BothHaveNSW) {
1883 dbgs() <<
"INDVARS: Eliminated congruent iv.inc: "
1884 << *IsomorphicInc <<
'\n');
1885 Value *NewInc = OrigInc;
1889 IP = PN->
getParent()->getFirstInsertionPt();
1894 Builder.SetCurrentDebugLocation(IsomorphicInc->
getDebugLoc());
1896 Builder.CreateTruncOrBitCast(OrigInc, IsomorphicInc->
getType(), IVName);
1921 if (!LHS->getType()->isIntegerTy() || !RHS->getType()->isIntegerTy())
1922 return RHS->getType()->isIntegerTy() && !LHS->getType()->isIntegerTy();
1923 return RHS->getType()->getPrimitiveSizeInBits().getFixedValue() <
1924 LHS->getType()->getPrimitiveSizeInBits().getFixedValue();
1927 unsigned NumElim = 0;
1935 if (!SE.isSCEVable(PN->
getType()))
1940 return Const->getValue();
1945 if (
Value *V = SimplifyPHINode(Phi)) {
1946 if (V->getType() != Phi->getType())
1948 SE.forgetValue(Phi);
1949 Phi->replaceAllUsesWith(V);
1953 dbgs() <<
"INDVARS: Eliminated constant iv: " << *Phi
1958 if (!SE.isSCEVable(Phi->getType()))
1961 PHINode *&OrigPhiRef = ExprToIVMap[SE.getSCEV(Phi)];
1964 if (Phi->getType()->isIntegerTy() &&
TTI &&
1965 TTI->isTruncateFree(Phi->getType(), Phis.
back()->getType())) {
1969 const SCEV *PhiExpr = SE.getSCEV(Phi);
1973 const SCEV *TruncExpr =
1974 SE.getTruncateExpr(PhiExpr, Phis.
back()->getType());
1975 ExprToIVMap[TruncExpr] = Phi;
1986 replaceCongruentIVInc(Phi, OrigPhiRef, L, DT, DeadInsts);
1988 dbgs() <<
"INDVARS: Eliminated congruent iv: " << *Phi
1991 DebugType,
dbgs() <<
"INDVARS: Original iv: " << *OrigPhiRef <<
'\n');
1993 Value *NewIV = OrigPhiRef;
1994 if (OrigPhiRef->
getType() != Phi->getType()) {
1996 L->getHeader()->getFirstInsertionPt());
1997 Builder.SetCurrentDebugLocation(Phi->getDebugLoc());
1998 NewIV = Builder.CreateTruncOrBitCast(OrigPhiRef, Phi->getType(), IVName);
2000 Phi->replaceAllUsesWith(NewIV);
2012 L->getExitingBlocks(ExitingBlocks);
2019 if (!
match(BB->getTerminator(),
2024 if (SE.getSCEV(LHS) == S && SE.DT.dominates(LHS, At))
2027 if (SE.getSCEV(RHS) == S && SE.DT.dominates(RHS, At))
2036 return FindValueInExprValueMap(S, At, DropPoisonGeneratingInsts) !=
nullptr;
2047 struct OperationIndices {
2048 OperationIndices(
unsigned Opc,
size_t min,
size_t max) :
2049 Opcode(
Opc), MinIdx(
min), MaxIdx(
max) { }
2062 return TTI.getCastInstrCost(Opcode, S->getType(),
2063 S->getOperand(0)->getType(),
2067 auto ArithCost = [&](
unsigned Opcode,
unsigned NumRequired,
2068 unsigned MinIdx = 0,
2071 return NumRequired *
2072 TTI.getArithmeticInstrCost(Opcode, S->getType(),
CostKind);
2075 auto CmpSelCost = [&](
unsigned Opcode,
unsigned NumRequired,
unsigned MinIdx,
2078 Type *OpType = S->getType();
2079 return NumRequired *
TTI.getCmpSelInstrCost(
2084 switch (S->getSCEVType()) {
2092 Cost = CastCost(Instruction::PtrToAddr);
2095 Cost = CastCost(Instruction::Trunc);
2098 Cost = CastCost(Instruction::ZExt);
2101 Cost = CastCost(Instruction::SExt);
2104 unsigned Opcode = Instruction::UDiv;
2106 if (SC->getAPInt().isPowerOf2())
2107 Opcode = Instruction::LShr;
2108 Cost = ArithCost(Opcode, 1);
2112 Cost = ArithCost(Instruction::Add, S->getNumOperands() - 1);
2123 unsigned OpCode = Instruction::Mul;
2124 if (S->getNumOperands() == 2)
2126 if (SC->getAPInt().isAllOnes())
2127 OpCode = Instruction::Sub;
2128 else if (SC->getAPInt().isPowerOf2())
2129 OpCode = Instruction::Shl;
2131 Cost = ArithCost(OpCode, S->getNumOperands() - 1);
2141 Cost += CmpSelCost(Instruction::ICmp, S->getNumOperands() - 1, 0, 1);
2142 Cost += CmpSelCost(Instruction::Select, S->getNumOperands() - 1, 0, 2);
2143 switch (S->getSCEVType()) {
2147 Cost += CmpSelCost(Instruction::ICmp, S->getNumOperands() - 1, 0, 0);
2148 Cost += ArithCost(Instruction::Or,
2149 S->getNumOperands() > 2 ? S->getNumOperands() - 2 : 0);
2150 Cost += CmpSelCost(Instruction::Select, 1, 0, 1);
2155 "Unhandled SCEV expression type?");
2162 unsigned NumRecurrences = S->getNumOperands() - 1;
2163 Cost +=
TTI.getCFInstrCost(Instruction::PHI,
CostKind) * NumRecurrences;
2165 TTI.getArithmeticInstrCost(Instruction::Add, S->getType(),
CostKind) *
2168 Worklist.
emplace_back(Instruction::PHI, 0, S->getOperand(0));
2170 for (
const SCEV *
Op : S->operands().drop_front())
2176 for (
auto &CostOp : Operations) {
2177 for (
auto SCEVOp :
enumerate(S->operands())) {
2179 size_t MinIdx = std::max(SCEVOp.index(), CostOp.MinIdx);
2180 size_t OpIdx = std::min(MinIdx, CostOp.MaxIdx);
2181 Worklist.
emplace_back(CostOp.Opcode, OpIdx, SCEVOp.value());
2187bool SCEVExpander::isHighCostExpansionHelper(
2195 const SCEV *S = WorkItem.
S;
2206 L->getHeader()->getParent()->hasMinSize()
2225 return Cost > Budget;
2245 SE.getAddExpr(S, SE.getConstant(S->
getType(), 1)), &At, L))
2260 "Nary expr should have more than 1 operand.");
2265 return Cost > Budget;
2269 "Polynomial should be at least linear");
2272 return Cost > Budget;
2281 switch (Pred->getKind()) {
2296 Value *Expr0 = expand(Pred->getLHS(), IP);
2297 Value *Expr1 = expand(Pred->getRHS(), IP);
2299 Builder.SetInsertPoint(IP);
2301 auto *
I = Builder.CreateICmp(InvPred, Expr0, Expr1,
"ident.check");
2308 "non-affine expression");
2312 const SCEV *ExitCount =
2313 SE.getPredicatedSymbolicMaxBackedgeTakenCount(AR->
getLoop(), Pred);
2321 unsigned SrcBits = SE.getTypeSizeInBits(ExitCount->
getType());
2322 unsigned DstBits = SE.getTypeSizeInBits(ARTy);
2329 Builder.SetInsertPoint(
Loc);
2330 Value *TripCountVal = expand(ExitCount,
Loc);
2335 Value *StepValue = expand(Step,
Loc);
2336 Value *NegStepValue = expand(SE.getNegativeSCEV(Step),
Loc);
2337 Value *StartValue = expand(Start,
Loc);
2342 Builder.SetInsertPoint(
Loc);
2345 Value *AbsStep = Builder.CreateSelectWithUnknownProfile(
2346 StepCompare, NegStepValue, StepValue,
"scev-expander");
2356 auto ComputeEndCheck = [&]() ->
Value * {
2358 Value *MulV, *OfMul;
2359 auto Key = std::make_tuple(TripCountVal, AbsStep,
Loc);
2360 auto I = InsertedOverflowChecks.find(
Key);
2361 if (
I != InsertedOverflowChecks.end()) {
2362 MulV =
I->second.first;
2363 OfMul =
I->second.second;
2366 Value *TruncTripCount = Builder.CreateZExtOrTrunc(TripCountVal, Ty);
2367 Value *
Mul = Builder.CreateIntrinsic(Intrinsic::umul_with_overflow, Ty,
2368 {AbsStep, TruncTripCount},
2370 MulV = Builder.CreateExtractValue(
Mul, 0,
"mul.result");
2371 OfMul = Builder.CreateExtractValue(
Mul, 1,
"mul.overflow");
2374 InsertedOverflowChecks[
Key] = std::pair<Value *, Value *>(MulV, OfMul);
2378 bool NeedPosCheck = !SE.isKnownNegative(Step);
2379 bool NeedNegCheck = !SE.isKnownPositive(Step);
2382 Value *NegMulV = Builder.CreateNeg(MulV);
2384 Add = Builder.CreatePtrAdd(StartValue, MulV);
2386 Sub = Builder.CreatePtrAdd(StartValue, NegMulV);
2389 Add = Builder.CreateAdd(StartValue, MulV);
2391 Sub = Builder.CreateSub(StartValue, MulV);
2394 Value *EndCompareLT =
nullptr;
2395 Value *EndCompareGT =
nullptr;
2396 Value *EndCheck =
nullptr;
2398 EndCheck = EndCompareLT = Builder.CreateICmp(
2401 EndCheck = EndCompareGT = Builder.CreateICmp(
2403 if (NeedPosCheck && NeedNegCheck) {
2405 EndCheck = Builder.CreateSelectWithUnknownProfile(
2406 StepCompare, EndCompareGT, EndCompareLT,
"scev-expander");
2408 return Builder.CreateOr(EndCheck, OfMul);
2410 Value *EndCheck = ComputeEndCheck();
2415 if (SrcBits > DstBits) {
2417 auto *BackedgeCheck =
2419 ConstantInt::get(
Loc->getContext(), MaxVal));
2420 BackedgeCheck = Builder.CreateAnd(
2423 EndCheck = Builder.CreateOr(EndCheck, BackedgeCheck);
2432 Value *NSSWCheck =
nullptr, *NUSWCheck =
nullptr;
2442 if (NUSWCheck && NSSWCheck)
2443 return Builder.CreateOr(NUSWCheck, NSSWCheck);
2458 for (
const auto *Pred : Union->getPredicates()) {
2460 Builder.SetInsertPoint(IP);
2465 return Builder.CreateOr(Checks);
2468Value *SCEVExpander::fixupLCSSAFormFor(
Value *V) {
2470 if (!PreserveLCSSA || !DefI)
2476 if (!DefLoop || UseLoop == DefLoop || DefLoop->
contains(UseLoop))
2487 if (DefI->getType()->isIntegerTy())
2501 for (
PHINode *PN : InsertedPHIs)
2502 rememberInstruction(PN);
2503 for (
PHINode *PN : PHIsToRemove) {
2506 InsertedValues.erase(PN);
2507 InsertedPostIncValues.erase(PN);
2511 return User->getOperand(0);
2533struct SCEVFindUnsafe {
2534 ScalarEvolution &SE;
2536 bool IsUnsafe =
false;
2538 SCEVFindUnsafe(ScalarEvolution &SE,
bool CanonicalMode)
2539 : SE(SE), CanonicalMode(CanonicalMode) {}
2541 bool follow(
const SCEV *S) {
2552 if (!AR->getLoop()->getLoopPreheader() &&
2553 (!CanonicalMode || !AR->isAffine())) {
2560 bool isDone()
const {
return IsUnsafe; }
2565 SCEVFindUnsafe Search(SE, CanonicalMode);
2567 return !Search.IsUnsafe;
2598 for (
auto [
I, Flags] : Expander.OrigFlags)
2601 auto InsertedInstructions = Expander.getAllInsertedInstructions();
2604 InsertedInstructions);
2614 [&InsertedSet](
Value *U) {
2615 return InsertedSet.contains(cast<Instruction>(U));
2617 "removed instruction should only be used by instructions inserted "
2618 "during expansion");
2620 assert(!
I->getType()->isVoidTy() &&
2621 "inserted instruction should have non-void types");
2623 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)
This file contains the declarations for profiling metadata utility functions.
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,...
ConstantInt * getValue() const
const APInt & getAPInt() const
LLVM_ABI Value * generateOverflowCheck(const SCEVAddRecExpr *AR, Instruction *Loc, bool Signed)
Generates code that evaluates if the AR expression will overflow.
LLVM_ABI bool hasRelatedExistingExpansion(const SCEV *S, const Instruction *At, Loop *L)
Determine whether there is an existing expansion of S that can be reused.
SmallVector< Instruction *, 32 > getAllInsertedInstructions() const
Return a vector containing all instructions inserted during expansion.
LLVM_ABI bool isSafeToExpand(const SCEV *S) const
Return true if the given expression is safe to expand in the sense that all materialized values are s...
LLVM_ABI bool isSafeToExpandAt(const SCEV *S, const Instruction *InsertionPoint) const
Return true if the given expression is safe to expand in the sense that all materialized values are d...
LLVM_ABI unsigned replaceCongruentIVs(Loop *L, const DominatorTree *DT, SmallVectorImpl< WeakTrackingVH > &DeadInsts, const TargetTransformInfo *TTI=nullptr)
replace congruent phis with their most canonical representative.
static LLVM_ABI void dropPoisonGeneratingAnnotationsAndReinfer(ScalarEvolution &SE, Instruction *I)
Drop poison-generating flags from I, then try re-infer via SCEV.
LLVM_ABI Value * expandUnionPredicate(const SCEVUnionPredicate *Pred, Instruction *Loc)
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a S...
static LLVM_ABI CastInst * findReusableCastForPtrToAddr(Value *PtrOp, Type *Ty, const DataLayout &DL, function_ref< bool(const CastInst *)> Dominates)
Find an existing cast among PtrOp's users that computes the same value as a ptrtoaddr of PtrOp to Ty ...
LLVM_ABI bool hoistIVInc(Instruction *IncV, Instruction *InsertPos, bool RecomputePoisonFlags=false)
Utility for hoisting IncV (with all subexpressions requried for its computation) before InsertPos.
bool isInsertedInstruction(Instruction *I) const
Return true if the specified instruction was inserted by the code rewriter.
LLVM_ABI Value * expandCodeForPredicate(const SCEVPredicate *Pred, Instruction *Loc)
Generates a code sequence that evaluates this predicate.
static LLVM_ABI bool canReuseFlagsFromOriginalIVInc(PHINode *OrigPhi, PHINode *WidePhi, Instruction *OrigInc, Instruction *WideInc)
Return true if both increments directly increment the corresponding IV PHI nodes and have the same op...
LLVM_ABI Value * expandCodeFor(SCEVUse SH, Type *Ty, BasicBlock::iterator I)
Insert code to directly compute the specified SCEV expression into the program.
LLVM_ABI Value * expandComparePredicate(const SCEVComparePredicate *Pred, Instruction *Loc)
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a S...
LLVM_ABI Value * expandWrapPredicate(const SCEVWrapPredicate *P, Instruction *Loc)
A specialized variant of expandCodeForPredicate, handling the case when we are expanding code for a S...
LLVM_ABI Instruction * getIVIncOperand(Instruction *IncV, Instruction *InsertPos, bool allowScale)
Return the induction variable increment's IV operand.
LLVM_ABI void eraseDeadInstructions(Value *Root)
Remove inserted instructions that are dead, e.g.
LLVM_ABI BasicBlock::iterator findInsertPointAfter(Instruction *I, Instruction *MustDominate) const
Returns a suitable insert point after I, that dominates MustDominate.
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
LLVM_ABI bool isNonConstantNegative() const
Return true if the specified scev is negated, but not a constant.
static constexpr auto FlagNSW
LLVM_ABI ArrayRef< SCEVUse > operands() const
Return operands of this SCEV expression.
Type * getType() const
Return the LLVM type of this SCEV expression.
static constexpr auto FlagNone
SCEVTypes getSCEVType() const
static constexpr auto FlagNW
The main scalar evolution driver.
LLVM_ABI const SCEV * getZeroExtendExpr(SCEVUse Op, Type *Ty, unsigned Depth=0)
LLVM_ABI bool isKnownNonZero(const SCEV *S)
Test if the given expression is known to be non-zero.
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.
static SCEV::NoWrapFlags clearFlags(SCEV::NoWrapFlags Flags, SCEV::NoWrapFlags OffFlags)
LLVM_ABI const SCEV * getSignExtendExpr(SCEVUse Op, Type *Ty, unsigned Depth=0)
static SCEV::NoWrapFlags maskFlags(SCEV::NoWrapFlags Flags, SCEV::NoWrapFlags Mask)
Convenient NoWrapFlags manipulation.
LLVM_ABI const SCEV * getMinusSCEV(SCEVUse LHS, SCEVUse RHS, SCEV::NoWrapFlags Flags=SCEV::FlagNone, unsigned Depth=0)
Return LHS-RHS.
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.
LLVM_ABI SCEVUse getAddExpr(SmallVectorImpl< SCEVUse > &Ops, SCEVFlags Flags={}, unsigned Depth=0)
Get a canonical add expression, or something simpler if possible.
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)
SCEVBinaryExpr_match< SCEVUMaxExpr, Op0_t, Op1_t, SCEV::FlagNone, true > m_scev_UMax(const Op0_t &Op0, const Op1_t &Op1)
match_bind< const SCEVAddExpr > m_scev_Add(const SCEVAddExpr *&V)
SCEVURem_match< Op0_t, Op1_t > m_scev_URem(Op0_t LHS, Op1_t RHS, ScalarEvolution &SE)
Match the mathematical pattern A - (A / B) * B, where A and B can be arbitrary expressions.
@ CE
Windows NT (Windows on ARM)
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_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI Constant * ConstantFoldBinaryOpOperands(unsigned Opcode, Constant *LHS, Constant *RHS, const DataLayout &DL)
Attempt to constant fold a binary operation with the specified operands.
LLVM_ABI const SCEV * normalizeForPostIncUse(const SCEV *S, const PostIncLoopSet &Loops, ScalarEvolution &SE, bool CheckInvertible=true)
Normalize S to be post-increment for all loops present in Loops.
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::FlagsMask) const
Return the no-wrap flags for this SCEVUse, which is the union of the use-specific flags and the under...