17#include "llvm/Analysis/LoopInfo.h"
18#include "llvm/Analysis/RegionInfo.h"
19#include "llvm/Analysis/ScalarEvolution.h"
20#include "llvm/Analysis/ScalarEvolutionExpressions.h"
21#include "llvm/Transforms/Utils/BasicBlockUtils.h"
22#include "llvm/Transforms/Utils/LoopUtils.h"
23#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
29#define DEBUG_TYPE "polly-scop-helper"
33 cl::desc(
"Allow calls to the specified functions in SCoPs even if their "
34 "side-effects are unknown. This can be used to do debug output in "
35 "Polly-transformed code."),
43 BasicBlock *EnteringBB = R->getEnteringBlock();
44 BasicBlock *
Entry = R->getEntry();
58 SmallVector<BasicBlock *, 4> Preds;
59 for (BasicBlock *P : predecessors(
Entry))
63 BasicBlock *NewEntering =
64 SplitBlockPredecessors(
Entry, Preds,
".region_entering", DT, LI);
68 for (BasicBlock *ExitPred : predecessors(NewEntering)) {
69 Region *RegionOfPred = RI->getRegionFor(ExitPred);
70 if (RegionOfPred->getExit() !=
Entry)
73 while (!RegionOfPred->isTopLevelRegion() &&
74 RegionOfPred->getExit() ==
Entry) {
75 RegionOfPred->replaceExit(NewEntering);
76 RegionOfPred = RegionOfPred->getParent();
81 Region *AncestorR = R->getParent();
82 RI->setRegionFor(NewEntering, AncestorR);
83 while (!AncestorR->isTopLevelRegion() && AncestorR->getEntry() ==
Entry) {
84 AncestorR->replaceEntry(NewEntering);
85 AncestorR = AncestorR->getParent();
89 EnteringBB = NewEntering;
91 assert(R->getEnteringBlock() == EnteringBB);
107 BasicBlock *ExitBB = R->getExit();
108 BasicBlock *ExitingBB = R->getExitingBlock();
118 SmallVector<BasicBlock *, 4> Preds;
119 for (BasicBlock *P : predecessors(ExitBB))
128 SplitBlockPredecessors(ExitBB, Preds,
".region_exiting", DT, LI);
136 RI->setRegionFor(ExitingBB, R);
139 R->replaceExitRecursive(ExitingBB);
140 R->replaceExit(ExitBB);
142 assert(ExitingBB == R->getExitingBlock());
155 assert(R && !R->isTopLevelRegion());
156 assert(!RI || RI == R->getRegionInfo());
158 "RegionInfo requires DominatorTree to be updated as well");
168static BasicBlock *
splitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt,
169 DominatorTree *DT, llvm::LoopInfo *LI,
179 BasicBlock *NewBlock = llvm::SplitBlock(Old, SplitPt, DT, LI);
182 Region *R = RI->getRegionFor(Old);
183 RI->setRegionFor(NewBlock, R);
198 LoopInfo *LI, RegionInfo *RI) {
201 BasicBlock::iterator I = EntryBlock->begin();
202 while (isa<AllocaInst>(I))
212 BasicBlock *BB,
bool RTC) {
213 if (RecordedAssumptions)
214 RecordedAssumptions->push_back({
Kind, Sign, Set, Loc, BB, RTC});
243 ScalarEvolution &
GenSE,
const char *
Name,
252 "ScopExpander assumes to be applied to generated code region");
253 const SCEV *GenE =
visit(E);
254 return Expander.expandCodeFor(GenE, Ty, IP);
263 const SCEV *Result = SCEVVisitor::visit(E);
283 Function *Fn =
R.getEntry()->getParent();
286 "Instruction expected to be either in the SCoP or the translated "
294 BasicBlock::iterator IP) {
298 assert(!Inst->mayThrow() && !Inst->mayReadOrWriteMemory() &&
299 !isa<PHINode>(Inst));
301 auto *InstClone = Inst->clone();
302 for (
auto &Op : Inst->operands()) {
304 const SCEV *OpSCEV =
GenSE.getSCEV(Op);
306 InstClone->replaceUsesOfWith(Op, OpClone);
309 InstClone->setName(
Name + Inst->getName());
310 InstClone->insertBefore(IP);
311 return GenSE.getSCEV(InstClone);
317 Value *NewVal =
VMap ?
VMap->lookup(E->getValue()) :
nullptr;
319 const SCEV *NewE =
GenSE.getSCEV(NewVal);
329 Instruction *Inst = dyn_cast<Instruction>(E->getValue());
330 BasicBlock::iterator IP;
332 IP = Inst->getIterator();
333 else if (
R.getEntry()->getParent() !=
GenFn) {
338 IP =
GenFn->getEntryBlock().getTerminator()->getIterator();
339 }
else if (Inst &&
RTCBB->getParent() == Inst->getFunction())
340 IP =
RTCBB->getTerminator()->getIterator();
342 IP =
RTCBB->getParent()->getEntryBlock().getTerminator()->getIterator();
344 if (!Inst || (Inst->getOpcode() != Instruction::SRem &&
345 Inst->getOpcode() != Instruction::SDiv))
348 const SCEV *LHSScev =
GenSE.getSCEV(Inst->getOperand(0));
349 const SCEV *RHSScev =
GenSE.getSCEV(Inst->getOperand(1));
351 if (!
GenSE.isKnownNonZero(RHSScev))
352 RHSScev =
GenSE.getUMaxExpr(RHSScev,
GenSE.getConstant(E->getType(), 1));
357 Inst = BinaryOperator::Create((Instruction::BinaryOps)Inst->getOpcode(),
358 LHS, RHS, Inst->getName() +
Name, IP);
359 return GenSE.getSCEV(Inst);
369 return GenSE.getPtrToAddrExpr(
visit(E->getOperand()));
372 return GenSE.getPtrToIntExpr(
visit(E->getOperand()), E->getType());
375 return GenSE.getTruncateExpr(
visit(E->getOperand()), E->getType());
378 return GenSE.getZeroExtendExpr(
visit(E->getOperand()), E->getType());
381 return GenSE.getSignExtendExpr(
visit(E->getOperand()), E->getType());
384 auto *RHSScev =
visit(E->getRHS());
385 if (!
GenSE.isKnownNonZero(RHSScev))
386 RHSScev =
GenSE.getUMaxExpr(RHSScev,
GenSE.getConstant(E->getType(), 1));
387 return GenSE.getUDivExpr(
visit(E->getLHS()), RHSScev);
390 SmallVector<SCEVUse, 4> NewOps;
391 for (
const SCEV *Op : E->operands())
392 NewOps.push_back(
visit(Op));
393 return GenSE.getAddExpr(NewOps);
396 SmallVector<SCEVUse, 4> NewOps;
397 for (
const SCEV *Op : E->operands())
398 NewOps.push_back(
visit(Op));
399 return GenSE.getMulExpr(NewOps);
402 SmallVector<SCEVUse, 4> NewOps;
403 for (SCEVUse Op : E->operands())
404 NewOps.push_back(
visit(Op));
405 return GenSE.getUMaxExpr(NewOps);
408 SmallVector<SCEVUse, 4> NewOps;
409 for (SCEVUse Op : E->operands())
410 NewOps.push_back(
visit(Op));
411 return GenSE.getSMaxExpr(NewOps);
414 SmallVector<SCEVUse, 4> NewOps;
415 for (SCEVUse Op : E->operands())
416 NewOps.push_back(
visit(Op));
417 return GenSE.getUMinExpr(NewOps);
420 SmallVector<SCEVUse, 4> NewOps;
421 for (SCEVUse Op : E->operands())
422 NewOps.push_back(
visit(Op));
423 return GenSE.getSMinExpr(NewOps);
426 SmallVector<SCEVUse, 4> NewOps;
427 for (SCEVUse Op : E->operands())
428 NewOps.push_back(
visit(Op));
429 return GenSE.getUMinExpr(NewOps,
true);
432 SmallVector<SCEVUse, 4> NewOps;
433 for (SCEVUse Op : E->operands())
434 NewOps.push_back(
visit(Op));
436 const Loop *L = E->getLoop();
439 return GenSE.getAddRecExpr(NewOps, L, E->getNoWrapFlags());
442 const SCEV *Evaluated =
443 SCEVAddRecExpr::evaluateAtIteration(NewOps, GenLRepl,
GenSE);
448 return visit(Evaluated);
454 llvm::Function *GenFn, ScalarEvolution &GenSE,
455 const DataLayout &DL,
const char *Name,
456 const SCEV *E, Type *Ty, BasicBlock::iterator IP,
459 ScopExpander Expander(
S.getRegion(), SE, GenFn, GenSE, Name, VMap, LoopMap,
461 return Expander.expandCodeFor(E, Ty, IP);
470 Loop *L = LI.getLoopFor(
S.getEntry());
472 bool AllContained =
true;
473 for (
auto *BB :
S.blocks())
474 AllContained &= L->contains(BB);
477 L = L->getParentLoop();
480 return L ? (
S.contains(L) ? L->getParentLoop() : L) : nullptr;
484 unsigned NumBlocks = L->getNumBlocks();
485 SmallVector<BasicBlock *, 4> ExitBlocks;
486 L->getExitBlocks(ExitBlocks);
488 for (
auto ExitBlock : ExitBlocks) {
489 if (isa<UnreachableInst>(ExitBlock->getTerminator()))
496 if (!RN->isSubRegion())
499 Region *R = RN->getNodeAs<Region>();
500 return std::distance(R->block_begin(), R->block_end());
504 if (!RN->isSubRegion()) {
505 BasicBlock *BB = RN->getNodeAs<BasicBlock>();
506 Loop *L = LI.getLoopFor(BB);
526 if (!L && isa<UnreachableInst>(BB->getTerminator()) && BB->getPrevNode())
527 L = LI.getLoopFor(BB->getPrevNode());
531 Region *NonAffineSubRegion = RN->getNodeAs<Region>();
532 Loop *L = LI.getLoopFor(NonAffineSubRegion->getEntry());
533 while (L && NonAffineSubRegion->contains(L))
534 L = L->getParentLoop();
539 ScalarEvolution &SE) {
540 for (
const Use &Val : llvm::drop_begin(Gep->operands(), 1)) {
541 const SCEV *PtrSCEV = SE.getSCEVAtScope(Val, L);
542 Loop *OuterLoop = R.outermostLoopInRegion(L);
543 if (!SE.isLoopInvariant(PtrSCEV, OuterLoop))
550 ScalarEvolution &SE,
const DominatorTree &DT,
552 Loop *L = LI.getLoopFor(LInst->getParent());
553 auto *Ptr = LInst->getPointerOperand();
562 if (
auto *GepInst = dyn_cast<GetElementPtrInst>(Ptr)) {
564 if (
auto *DecidingLoad =
565 dyn_cast<LoadInst>(GepInst->getPointerOperand())) {
566 if (KnownInvariantLoads.count(DecidingLoad))
572 const SCEV *PtrSCEV = SE.getSCEVAtScope(Ptr, L);
573 while (L && R.contains(L)) {
574 if (!SE.isLoopInvariant(PtrSCEV, L))
576 L = L->getParentLoop();
579 if (!Ptr->hasUseList())
582 for (
auto *User : Ptr->users()) {
583 auto *UserI = dyn_cast<Instruction>(User);
584 if (!UserI || UserI->getFunction() != LInst->getFunction() ||
587 if (!UserI->mayWriteToMemory())
590 auto &BB = *UserI->getParent();
591 if (DT.dominates(&BB, LInst->getParent()))
594 bool DominatesAllPredecessors =
true;
595 if (R.isTopLevelRegion()) {
596 for (BasicBlock &I : *R.getEntry()->getParent())
597 if (isa<ReturnInst>(I.getTerminator()) && !DT.dominates(&BB, &I))
598 DominatesAllPredecessors =
false;
600 for (
auto Pred : predecessors(R.getExit()))
601 if (R.contains(Pred) && !DT.dominates(&BB, Pred))
602 DominatesAllPredecessors =
false;
605 if (!DominatesAllPredecessors)
615 if (
auto *IT = dyn_cast<IntrinsicInst>(V)) {
616 switch (IT->getIntrinsicID()) {
618 case llvm::Intrinsic::lifetime_start:
619 case llvm::Intrinsic::lifetime_end:
621 case llvm::Intrinsic::invariant_start:
622 case llvm::Intrinsic::invariant_end:
624 case llvm::Intrinsic::var_annotation:
625 case llvm::Intrinsic::ptr_annotation:
626 case llvm::Intrinsic::annotation:
627 case llvm::Intrinsic::donothing:
628 case llvm::Intrinsic::assume:
630 case llvm::Intrinsic::dbg_value:
631 case llvm::Intrinsic::dbg_declare:
642 if (!V || !SE->isSCEVable(V->getType()))
646 if (
const SCEV *Scev = SE->getSCEVAtScope(
const_cast<Value *
>(V), Scope))
647 if (!isa<SCEVCouldNotCompute>(Scev))
655 Instruction *UI = dyn_cast<Instruction>(U.getUser());
659 if (PHINode *
PHI = dyn_cast<PHINode>(UI))
660 return PHI->getIncomingBlock(U);
662 return UI->getParent();
667 while (BoxedLoops.count(L))
668 L = L->getParentLoop();
675 Loop *L = LI.getLoopFor(BB);
680 auto *CI = dyn_cast<CallInst>(Inst);
684 Function *CF = CI->getCalledFunction();
693 for (Instruction &Inst : *BB) {
713 for (BasicBlock *RBB : Stmt->
getRegion()->blocks())
725 for (
const MDOperand &X : drop_begin(LoopMD->operands(), 1)) {
726 auto *OpNode = dyn_cast<MDNode>(X.get());
730 auto *OpName = dyn_cast<MDString>(OpNode->getOperand(0));
733 if (OpName->getString() == Name)
744 switch (MD->getNumOperands()) {
748 return &MD->getOperand(1);
750 llvm_unreachable(
"loop metadata has 0 or 1 operand");
759 switch (MD->getNumOperands()) {
763 return MD->getOperand(1).get();
765 llvm_unreachable(
"loop metadata must have 0 or 1 operands");
774 switch (MD->getNumOperands()) {
778 if (ConstantInt *IntMD =
779 mdconst::extract_or_null<ConstantInt>(MD->getOperand(1).get()))
780 return IntMD->getZExtValue();
783 llvm_unreachable(
"unexpected number of options");
792 const MDOperand *AttrMD =
797 ConstantInt *IntMD = mdconst::extract_or_null<ConstantInt>(AttrMD->get());
801 return IntMD->getSExtValue();
805 return llvm::hasDisableAllTransformsHint(L);
813 assert(Attr &&
"Must be a valid BandAttr");
820 BandAttr *Attr = reinterpret_cast<BandAttr *>(Ptr);
831 MDNode *LoopID = L->getLoopID();
846 return Id.
get_name() ==
"Loop with Metadata";
853 return reinterpret_cast<BandAttr *
>(Id.get_user());
llvm::cl::OptionCategory PollyCategory
static std::optional< bool > getOptionalBoolLoopAttribute(MDNode *LoopID, StringRef Name)
static BasicBlock * splitBlock(BasicBlock *Old, BasicBlock::iterator SplitPt, DominatorTree *DT, llvm::LoopInfo *LI, RegionInfo *RI)
static void simplifyRegionEntry(Region *R, DominatorTree *DT, LoopInfo *LI, RegionInfo *RI)
static std::optional< const MDOperand * > findNamedMetadataArg(MDNode *LoopID, StringRef Name)
static cl::list< std::string > DebugFunctions("polly-debug-func", cl::desc("Allow calls to the specified functions in SCoPs even if their " "side-effects are unknown. This can be used to do debug output in " "Polly-transformed code."), cl::Hidden, cl::CommaSeparated, cl::cat(PollyCategory))
static MDNode * findNamedMetadataNode(MDNode *LoopMD, StringRef Name)
Find a property in a LoopID.
static void simplifyRegionExit(Region *R, DominatorTree *DT, LoopInfo *LI, RegionInfo *RI)
static bool hasVariantIndex(GetElementPtrInst *Gep, Loop *L, Region &R, ScalarEvolution &SE)
__isl_give isl_id * release()
std::string get_name() const
static isl::id alloc(isl::ctx ctx, const std::string &name, void *user)
BasicBlock * getEntryBlock() const
Return a BasicBlock from this statement.
const std::vector< Instruction * > & getInstructions() const
Region * getRegion() const
Get the region represented by this ScopStmt (if any).
bool isRegionStmt() const
Return true if this statement represents a whole region.
__isl_give isl_id * isl_id_set_free_user(__isl_take isl_id *id, void(*free_user)(void *user))
boolean manage(isl_bool val)
llvm::Loop * getRegionNodeLoop(llvm::RegionNode *RN, llvm::LoopInfo &LI)
Return the smallest loop surrounding RN.
bool isLoopAttr(const isl::id &Id)
Is Id representing a loop?
std::optional< llvm::Metadata * > findMetadataOperand(llvm::MDNode *LoopMD, llvm::StringRef Name)
Find a property value in a LoopID.
llvm::SetVector< llvm::AssertingVH< llvm::LoadInst > > InvariantLoadsSetTy
Type for a set of invariant loads.
llvm::Value * expandCodeFor(Scop &S, llvm::ScalarEvolution &SE, llvm::Function *GenFn, llvm::ScalarEvolution &GenSE, const llvm::DataLayout &DL, const char *Name, const llvm::SCEV *E, llvm::Type *Ty, llvm::BasicBlock::iterator IP, ValueMapT *VMap, LoopToScevMapT *LoopMap, llvm::BasicBlock *RTCBB)
Wrapper for SCEVExpander extended to all Polly features.
unsigned getNumBlocksInRegionNode(llvm::RegionNode *RN)
Get the number of blocks in RN.
llvm::Loop * getFirstNonBoxedLoopFor(llvm::Loop *L, llvm::LoopInfo &LI, const BoxedLoopsSetTy &BoxedLoops)
AssumptionSign
Enum to distinguish between assumptions and restrictions.
@ Value
MemoryKind::Value: Models an llvm::Value.
@ PHI
MemoryKind::PHI: Models PHI nodes within the SCoP.
void splitEntryBlockForAlloca(llvm::BasicBlock *EntryBlock, llvm::DominatorTree *DT, llvm::LoopInfo *LI, llvm::RegionInfo *RI)
Split the entry block of a function to store the newly inserted allocations outside of all Scops.
bool hasDisableAllTransformsHint(llvm::Loop *L)
Does the loop's LoopID contain a 'llvm.loop.disable_heuristics' property?
std::optional< int > getOptionalIntLoopAttribute(llvm::MDNode *LoopID, llvm::StringRef Name)
Find an integers property value in a LoopID.
bool isDebugCall(llvm::Instruction *Inst)
Is the given instruction a call to a debug function?
bool hasDebugCall(ScopStmt *Stmt)
Does the statement contain a call to a debug function?
BandAttr * getLoopAttr(const isl::id &Id)
Return the BandAttr of a loop's isl::id.
llvm::BasicBlock * getUseBlock(const llvm::Use &U)
Return the block in which a value is used.
llvm::Loop * getLoopSurroundingScop(Scop &S, llvm::LoopInfo &LI)
Get the smallest loop that contains S but is not in S.
void recordAssumption(RecordedAssumptionsTy *RecordedAssumptions, AssumptionKind Kind, isl::set Set, llvm::DebugLoc Loc, AssumptionSign Sign, llvm::BasicBlock *BB=nullptr, bool RTC=true)
Record an assumption for later addition to the assumed context.
llvm::DenseMap< const llvm::Loop *, llvm::SCEVUse > LoopToScevMapT
Same as llvm/Analysis/ScalarEvolutionExpressions.h.
isl::id getIslLoopAttr(isl::ctx Ctx, BandAttr *Attr)
Get an isl::id representing a loop.
llvm::SetVector< const llvm::Loop * > BoxedLoopsSetTy
Set of loops (used to remember loops in non-affine subregions).
bool isHoistableLoad(llvm::LoadInst *LInst, llvm::Region &R, llvm::LoopInfo &LI, llvm::ScalarEvolution &SE, const llvm::DominatorTree &DT, const InvariantLoadsSetTy &KnownInvariantLoads)
Check if LInst can be hoisted in R.
isl::id createIslLoopAttr(isl::ctx Ctx, llvm::Loop *L)
Create an isl::id that identifies an original loop.
bool hasScalarDepsInsideRegion(const llvm::SCEV *Expr, const llvm::Region *R, llvm::Loop *Scope, bool AllowLoops, const InvariantLoadsSetTy &ILS)
Returns true when the SCEV contains references to instructions within the region.
llvm::SmallVector< Assumption, 8 > RecordedAssumptionsTy
llvm::DenseMap< llvm::AssertingVH< llvm::Value >, llvm::AssertingVH< llvm::Value > > ValueMapT
Type to remap values.
AssumptionKind
Enumeration of assumptions Polly can take.
bool isIgnoredIntrinsic(const llvm::Value *V)
Return true iff V is an intrinsic that we ignore during code generation.
void simplifyRegion(llvm::Region *R, llvm::DominatorTree *DT, llvm::LoopInfo *LI, llvm::RegionInfo *RI)
Simplify the region to have a single unconditional entry edge and a single exit edge.
bool canSynthesize(const llvm::Value *V, const Scop &S, llvm::ScalarEvolution *SE, llvm::Loop *Scope)
Check whether a value an be synthesized by the code generator.
bool getBooleanLoopAttribute(llvm::MDNode *LoopID, llvm::StringRef Name)
Find a boolean property value in a LoopID.
unsigned getNumBlocksInLoop(llvm::Loop *L)
Get the number of blocks in L.
ScopExpander generates IR the the value of a SCEV that represents a value from a SCoP.
const SCEV * visit(const SCEV *E)
const SCEV * visitAddExpr(const SCEVAddExpr *E)
const SCEV * visitUMaxExpr(const SCEVUMaxExpr *E)
const SCEV * visitUMinExpr(const SCEVUMinExpr *E)
const SCEV * visitUnknown(const SCEVUnknown *E)
const SCEV * visitAddRecExpr(const SCEVAddRecExpr *E)
const SCEV * visitPtrToIntExpr(const SCEVPtrToIntExpr *E)
Value * expandCodeFor(const SCEV *E, Type *Ty, BasicBlock::iterator IP)
const SCEV * visitSMaxExpr(const SCEVSMaxExpr *E)
const SCEV * visitConstant(const SCEVConstant *E)
The following functions will just traverse the SCEV and rebuild it using GenSE and the new operands r...
const SCEV * visitSequentialUMinExpr(const SCEVSequentialUMinExpr *E)
const SCEV * visitZeroExtendExpr(const SCEVZeroExtendExpr *E)
const SCEV * visitUDivExpr(const SCEVUDivExpr *E)
const SCEV * visitGenericInst(const SCEVUnknown *E, Instruction *Inst, BasicBlock::iterator IP)
DenseMap< const SCEV *, const SCEV * > SCEVCache
const SCEV * visitSignExtendExpr(const SCEVSignExtendExpr *E)
bool isInOrigRegion(Instruction *Inst)
Is the instruction part of the original SCoP (in contrast to be located in the code-generated region)...
const SCEV * visitSMinExpr(const SCEVSMinExpr *E)
const SCEV * visitMulExpr(const SCEVMulExpr *E)
ScopExpander(const Region &R, ScalarEvolution &SE, Function *GenFn, ScalarEvolution &GenSE, const char *Name, ValueMapT *VMap, polly::LoopToScevMapT *LoopMap, BasicBlock *RTCBB)
const SCEV * visitVScale(const SCEVVScale *E)
polly::LoopToScevMapT * LoopMap
bool isInGenRegion(Instruction *Inst)
const SCEV * visitPtrToAddrExpr(const SCEVPtrToAddrExpr *E)
const SCEV * visitTruncateExpr(const SCEVTruncateExpr *E)
Represent the attributes of a loop.
llvm::MDNode * Metadata
LoopID which stores the properties of the loop, such as transformations to apply and the metadata of ...
llvm::Loop * OriginalLoop
The LoopInfo reference for this loop.