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 assert((Set.is_params() || BB) &&
214 "Assumptions without a basic block must be parameter sets");
215 if (RecordedAssumptions)
216 RecordedAssumptions->push_back({
Kind, Sign, Set, Loc, BB, RTC});
245 ScalarEvolution &
GenSE,
const char *
Name,
254 "ScopExpander assumes to be applied to generated code region");
255 const SCEV *GenE =
visit(E);
256 return Expander.expandCodeFor(GenE, Ty, IP);
265 const SCEV *Result = SCEVVisitor::visit(E);
285 Function *Fn =
R.getEntry()->getParent();
288 "Instruction expected to be either in the SCoP or the translated "
296 BasicBlock::iterator IP) {
300 assert(!Inst->mayThrow() && !Inst->mayReadOrWriteMemory() &&
301 !isa<PHINode>(Inst));
303 auto *InstClone = Inst->clone();
304 for (
auto &Op : Inst->operands()) {
306 const SCEV *OpSCEV =
GenSE.getSCEV(Op);
308 InstClone->replaceUsesOfWith(Op, OpClone);
311 InstClone->setName(
Name + Inst->getName());
312 InstClone->insertBefore(IP);
313 return GenSE.getSCEV(InstClone);
319 Value *NewVal =
VMap ?
VMap->lookup(E->getValue()) :
nullptr;
321 const SCEV *NewE =
GenSE.getSCEV(NewVal);
331 Instruction *Inst = dyn_cast<Instruction>(E->getValue());
332 BasicBlock::iterator IP;
334 IP = Inst->getIterator();
335 else if (
R.getEntry()->getParent() !=
GenFn) {
340 IP =
GenFn->getEntryBlock().getTerminator()->getIterator();
341 }
else if (Inst &&
RTCBB->getParent() == Inst->getFunction())
342 IP =
RTCBB->getTerminator()->getIterator();
344 IP =
RTCBB->getParent()->getEntryBlock().getTerminator()->getIterator();
346 if (!Inst || (Inst->getOpcode() != Instruction::SRem &&
347 Inst->getOpcode() != Instruction::SDiv))
350 const SCEV *LHSScev =
GenSE.getSCEV(Inst->getOperand(0));
351 const SCEV *RHSScev =
GenSE.getSCEV(Inst->getOperand(1));
353 if (!
GenSE.isKnownNonZero(RHSScev))
354 RHSScev =
GenSE.getUMaxExpr(RHSScev,
GenSE.getConstant(E->getType(), 1));
359 Inst = BinaryOperator::Create((Instruction::BinaryOps)Inst->getOpcode(),
360 LHS, RHS, Inst->getName() +
Name, IP);
361 return GenSE.getSCEV(Inst);
371 return GenSE.getPtrToAddrExpr(
visit(E->getOperand()));
374 return GenSE.getPtrToIntExpr(
visit(E->getOperand()), E->getType());
377 return GenSE.getTruncateExpr(
visit(E->getOperand()), E->getType());
380 return GenSE.getZeroExtendExpr(
visit(E->getOperand()), E->getType());
383 return GenSE.getSignExtendExpr(
visit(E->getOperand()), E->getType());
386 auto *RHSScev =
visit(E->getRHS());
387 if (!
GenSE.isKnownNonZero(RHSScev))
388 RHSScev =
GenSE.getUMaxExpr(RHSScev,
GenSE.getConstant(E->getType(), 1));
389 return GenSE.getUDivExpr(
visit(E->getLHS()), RHSScev);
392 SmallVector<const SCEV *, 4> NewOps;
393 for (
const SCEV *Op : E->operands())
394 NewOps.push_back(
visit(Op));
395 return GenSE.getAddExpr(NewOps);
398 SmallVector<const SCEV *, 4> NewOps;
399 for (
const SCEV *Op : E->operands())
400 NewOps.push_back(
visit(Op));
401 return GenSE.getMulExpr(NewOps);
404 SmallVector<const SCEV *, 4> NewOps;
405 for (
const SCEV *Op : E->operands())
406 NewOps.push_back(
visit(Op));
407 return GenSE.getUMaxExpr(NewOps);
410 SmallVector<const SCEV *, 4> NewOps;
411 for (
const SCEV *Op : E->operands())
412 NewOps.push_back(
visit(Op));
413 return GenSE.getSMaxExpr(NewOps);
416 SmallVector<const SCEV *, 4> NewOps;
417 for (
const SCEV *Op : E->operands())
418 NewOps.push_back(
visit(Op));
419 return GenSE.getUMinExpr(NewOps);
422 SmallVector<const SCEV *, 4> NewOps;
423 for (
const SCEV *Op : E->operands())
424 NewOps.push_back(
visit(Op));
425 return GenSE.getSMinExpr(NewOps);
428 SmallVector<const SCEV *, 4> NewOps;
429 for (
const SCEV *Op : E->operands())
430 NewOps.push_back(
visit(Op));
431 return GenSE.getUMinExpr(NewOps,
true);
434 SmallVector<const SCEV *, 4> NewOps;
435 for (
const SCEV *Op : E->operands())
436 NewOps.push_back(
visit(Op));
438 const Loop *L = E->getLoop();
441 return GenSE.getAddRecExpr(NewOps, L, E->getNoWrapFlags());
444 const SCEV *Evaluated =
445 SCEVAddRecExpr::evaluateAtIteration(NewOps, GenLRepl,
GenSE);
450 return visit(Evaluated);
456 llvm::Function *GenFn, ScalarEvolution &GenSE,
457 const DataLayout &DL,
const char *Name,
458 const SCEV *E, Type *Ty, BasicBlock::iterator IP,
461 ScopExpander Expander(
S.getRegion(), SE, GenFn, GenSE, Name, VMap, LoopMap,
463 return Expander.expandCodeFor(E, Ty, IP);
467 if (BranchInst *BR = dyn_cast<BranchInst>(TI)) {
468 if (BR->isUnconditional())
469 return ConstantInt::getTrue(Type::getInt1Ty(TI->getContext()));
471 return BR->getCondition();
474 if (SwitchInst *SI = dyn_cast<SwitchInst>(TI))
475 return SI->getCondition();
486 Loop *L = LI.getLoopFor(
S.getEntry());
488 bool AllContained =
true;
489 for (
auto *BB :
S.blocks())
490 AllContained &= L->contains(BB);
493 L = L->getParentLoop();
496 return L ? (
S.contains(L) ? L->getParentLoop() : L) : nullptr;
500 unsigned NumBlocks = L->getNumBlocks();
501 SmallVector<BasicBlock *, 4> ExitBlocks;
502 L->getExitBlocks(ExitBlocks);
504 for (
auto ExitBlock : ExitBlocks) {
505 if (isa<UnreachableInst>(ExitBlock->getTerminator()))
512 if (!RN->isSubRegion())
515 Region *R = RN->getNodeAs<Region>();
516 return std::distance(R->block_begin(), R->block_end());
520 if (!RN->isSubRegion()) {
521 BasicBlock *BB = RN->getNodeAs<BasicBlock>();
522 Loop *L = LI.getLoopFor(BB);
542 if (!L && isa<UnreachableInst>(BB->getTerminator()) && BB->getPrevNode())
543 L = LI.getLoopFor(BB->getPrevNode());
547 Region *NonAffineSubRegion = RN->getNodeAs<Region>();
548 Loop *L = LI.getLoopFor(NonAffineSubRegion->getEntry());
549 while (L && NonAffineSubRegion->contains(L))
550 L = L->getParentLoop();
555 ScalarEvolution &SE) {
556 for (
const Use &Val : llvm::drop_begin(Gep->operands(), 1)) {
557 const SCEV *PtrSCEV = SE.getSCEVAtScope(Val, L);
558 Loop *OuterLoop = R.outermostLoopInRegion(L);
559 if (!SE.isLoopInvariant(PtrSCEV, OuterLoop))
566 ScalarEvolution &SE,
const DominatorTree &DT,
568 Loop *L = LI.getLoopFor(LInst->getParent());
569 auto *Ptr = LInst->getPointerOperand();
578 if (
auto *GepInst = dyn_cast<GetElementPtrInst>(Ptr)) {
580 if (
auto *DecidingLoad =
581 dyn_cast<LoadInst>(GepInst->getPointerOperand())) {
582 if (KnownInvariantLoads.count(DecidingLoad))
588 const SCEV *PtrSCEV = SE.getSCEVAtScope(Ptr, L);
589 while (L && R.contains(L)) {
590 if (!SE.isLoopInvariant(PtrSCEV, L))
592 L = L->getParentLoop();
595 if (!Ptr->hasUseList())
598 for (
auto *User : Ptr->users()) {
599 auto *UserI = dyn_cast<Instruction>(User);
600 if (!UserI || UserI->getFunction() != LInst->getFunction() ||
603 if (!UserI->mayWriteToMemory())
606 auto &BB = *UserI->getParent();
607 if (DT.dominates(&BB, LInst->getParent()))
610 bool DominatesAllPredecessors =
true;
611 if (R.isTopLevelRegion()) {
612 for (BasicBlock &I : *R.getEntry()->getParent())
613 if (isa<ReturnInst>(I.getTerminator()) && !DT.dominates(&BB, &I))
614 DominatesAllPredecessors =
false;
616 for (
auto Pred : predecessors(R.getExit()))
617 if (R.contains(Pred) && !DT.dominates(&BB, Pred))
618 DominatesAllPredecessors =
false;
621 if (!DominatesAllPredecessors)
631 if (
auto *IT = dyn_cast<IntrinsicInst>(V)) {
632 switch (IT->getIntrinsicID()) {
634 case llvm::Intrinsic::lifetime_start:
635 case llvm::Intrinsic::lifetime_end:
637 case llvm::Intrinsic::invariant_start:
638 case llvm::Intrinsic::invariant_end:
640 case llvm::Intrinsic::var_annotation:
641 case llvm::Intrinsic::ptr_annotation:
642 case llvm::Intrinsic::annotation:
643 case llvm::Intrinsic::donothing:
644 case llvm::Intrinsic::assume:
646 case llvm::Intrinsic::dbg_value:
647 case llvm::Intrinsic::dbg_declare:
658 if (!V || !SE->isSCEVable(V->getType()))
662 if (
const SCEV *Scev = SE->getSCEVAtScope(
const_cast<Value *
>(V), Scope))
663 if (!isa<SCEVCouldNotCompute>(Scev))
671 Instruction *UI = dyn_cast<Instruction>(U.getUser());
675 if (PHINode *
PHI = dyn_cast<PHINode>(UI))
676 return PHI->getIncomingBlock(U);
678 return UI->getParent();
683 while (BoxedLoops.count(L))
684 L = L->getParentLoop();
691 Loop *L = LI.getLoopFor(BB);
696 auto *CI = dyn_cast<CallInst>(Inst);
700 Function *CF = CI->getCalledFunction();
709 for (Instruction &Inst : *BB) {
729 for (BasicBlock *RBB : Stmt->
getRegion()->blocks())
741 for (
const MDOperand &X : drop_begin(LoopMD->operands(), 1)) {
742 auto *OpNode = dyn_cast<MDNode>(X.get());
746 auto *OpName = dyn_cast<MDString>(OpNode->getOperand(0));
749 if (OpName->getString() == Name)
760 switch (MD->getNumOperands()) {
764 return &MD->getOperand(1);
766 llvm_unreachable(
"loop metadata has 0 or 1 operand");
775 switch (MD->getNumOperands()) {
779 return MD->getOperand(1).get();
781 llvm_unreachable(
"loop metadata must have 0 or 1 operands");
790 switch (MD->getNumOperands()) {
794 if (ConstantInt *IntMD =
795 mdconst::extract_or_null<ConstantInt>(MD->getOperand(1).get()))
796 return IntMD->getZExtValue();
799 llvm_unreachable(
"unexpected number of options");
808 const MDOperand *AttrMD =
813 ConstantInt *IntMD = mdconst::extract_or_null<ConstantInt>(AttrMD->get());
817 return IntMD->getSExtValue();
821 return llvm::hasDisableAllTransformsHint(L);
829 assert(Attr &&
"Must be a valid BandAttr");
836 BandAttr *Attr = reinterpret_cast<BandAttr *>(Ptr);
847 MDNode *LoopID = L->getLoopID();
862 return Id.
get_name() ==
"Loop with Metadata";
869 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.
llvm::Value * getConditionFromTerminator(llvm::Instruction *TI)
Return the condition for the terminator TI.
llvm::DenseMap< const llvm::Loop *, const llvm::SCEV * > LoopToScevMapT
Same as llvm/Analysis/ScalarEvolutionExpressions.h.
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.
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)
const SCEV * visitVScale(const SCEVVScale *E)
bool isInGenRegion(Instruction *Inst)
const SCEV * visitPtrToAddrExpr(const SCEVPtrToAddrExpr *E)
ScopExpander(const Region &R, ScalarEvolution &SE, Function *GenFn, ScalarEvolution &GenSE, const char *Name, ValueMapT *VMap, LoopToScevMapT *LoopMap, BasicBlock *RTCBB)
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.