Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
lib/CodeGen/Utils.cpp
Show All 14 Lines | |||||
#include "polly/CodeGen/IRBuilder.h" | #include "polly/CodeGen/IRBuilder.h" | ||||
#include "polly/ScopInfo.h" | #include "polly/ScopInfo.h" | ||||
#include "llvm/Analysis/LoopInfo.h" | #include "llvm/Analysis/LoopInfo.h" | ||||
#include "llvm/Support/Debug.h" | #include "llvm/Support/Debug.h" | ||||
#include "llvm/Transforms/Utils/BasicBlockUtils.h" | #include "llvm/Transforms/Utils/BasicBlockUtils.h" | ||||
using namespace llvm; | using namespace llvm; | ||||
BasicBlock *polly::executeScopConditionally(Scop &S, Pass *PassInfo) { | BasicBlock *polly::executeScopConditionally(Scop &S, Pass *P, Value *RTC) { | ||||
BasicBlock *StartBlock, *SplitBlock, *NewBlock; | BasicBlock *StartBlock, *SplitBlock, *NewBlock; | ||||
Region &R = S.getRegion(); | Region &R = S.getRegion(); | ||||
PollyIRBuilder Builder(R.getEntry()); | PollyIRBuilder Builder(R.getEntry()); | ||||
DominatorTree &DT = | DominatorTree &DT = P->getAnalysis<DominatorTreeWrapperPass>().getDomTree(); | ||||
PassInfo->getAnalysis<DominatorTreeWrapperPass>().getDomTree(); | RegionInfo &RI = P->getAnalysis<RegionInfoPass>().getRegionInfo(); | ||||
RegionInfo &RI = PassInfo->getAnalysis<RegionInfoPass>().getRegionInfo(); | LoopInfo &LI = P->getAnalysis<LoopInfo>(); | ||||
LoopInfo &LI = PassInfo->getAnalysis<LoopInfo>(); | |||||
// Split the entry edge of the region and generate a new basic block on this | // Split the entry edge of the region and generate a new basic block on this | ||||
// edge. This function also updates ScopInfo and RegionInfo. | // edge. This function also updates ScopInfo and RegionInfo. | ||||
NewBlock = SplitEdge(R.getEnteringBlock(), R.getEntry(), PassInfo); | NewBlock = SplitEdge(R.getEnteringBlock(), R.getEntry(), P); | ||||
if (DT.dominates(R.getEntry(), NewBlock)) { | if (DT.dominates(R.getEntry(), NewBlock)) { | ||||
BasicBlock *OldBlock = R.getEntry(); | BasicBlock *OldBlock = R.getEntry(); | ||||
std::string OldName = OldBlock->getName(); | std::string OldName = OldBlock->getName(); | ||||
// Update ScopInfo. | // Update ScopInfo. | ||||
for (ScopStmt *Stmt : S) | for (ScopStmt *Stmt : S) | ||||
if (Stmt->getBasicBlock() == OldBlock) { | if (Stmt->getBasicBlock() == OldBlock) { | ||||
Stmt->setBasicBlock(NewBlock); | Stmt->setBasicBlock(NewBlock); | ||||
Show All 11 Lines | if (DT.dominates(R.getEntry(), NewBlock)) { | ||||
SplitBlock = NewBlock; | SplitBlock = NewBlock; | ||||
} | } | ||||
SplitBlock->setName("polly.split_new_and_old"); | SplitBlock->setName("polly.split_new_and_old"); | ||||
Function *F = SplitBlock->getParent(); | Function *F = SplitBlock->getParent(); | ||||
StartBlock = BasicBlock::Create(F->getContext(), "polly.start", F); | StartBlock = BasicBlock::Create(F->getContext(), "polly.start", F); | ||||
SplitBlock->getTerminator()->eraseFromParent(); | SplitBlock->getTerminator()->eraseFromParent(); | ||||
Builder.SetInsertPoint(SplitBlock); | Builder.SetInsertPoint(SplitBlock); | ||||
Builder.CreateCondBr(Builder.getTrue(), StartBlock, R.getEntry()); | Builder.CreateCondBr(RTC, StartBlock, R.getEntry()); | ||||
if (Loop *L = LI.getLoopFor(SplitBlock)) | if (Loop *L = LI.getLoopFor(SplitBlock)) | ||||
L->addBasicBlockToLoop(StartBlock, LI.getBase()); | L->addBasicBlockToLoop(StartBlock, LI.getBase()); | ||||
DT.addNewBlock(StartBlock, SplitBlock); | DT.addNewBlock(StartBlock, SplitBlock); | ||||
Builder.SetInsertPoint(StartBlock); | Builder.SetInsertPoint(StartBlock); | ||||
BasicBlock *MergeBlock; | BasicBlock *MergeBlock; | ||||
if (R.getExit()->getSinglePredecessor()) | if (R.getExit()->getSinglePredecessor()) | ||||
// No splitEdge required. A block with a single predecessor cannot have | // No splitEdge required. A block with a single predecessor cannot have | ||||
// PHI nodes that would complicate life. | // PHI nodes that would complicate life. | ||||
MergeBlock = R.getExit(); | MergeBlock = R.getExit(); | ||||
else { | else { | ||||
MergeBlock = SplitEdge(R.getExitingBlock(), R.getExit(), PassInfo); | MergeBlock = SplitEdge(R.getExitingBlock(), R.getExit(), P); | ||||
// SplitEdge will never split R.getExit(), as R.getExit() has more than | // SplitEdge will never split R.getExit(), as R.getExit() has more than | ||||
// one predecessor. Hence, mergeBlock is always a newly generated block. | // one predecessor. Hence, mergeBlock is always a newly generated block. | ||||
R.replaceExitRecursive(MergeBlock); | R.replaceExitRecursive(MergeBlock); | ||||
RI.setRegionFor(MergeBlock, &R); | RI.setRegionFor(MergeBlock, &R); | ||||
} | } | ||||
Builder.CreateBr(MergeBlock); | Builder.CreateBr(MergeBlock); | ||||
MergeBlock->setName("polly.merge_new_and_old"); | MergeBlock->setName("polly.merge_new_and_old"); | ||||
if (DT.dominates(SplitBlock, MergeBlock)) | if (DT.dominates(SplitBlock, MergeBlock)) | ||||
DT.changeImmediateDominator(MergeBlock, SplitBlock); | DT.changeImmediateDominator(MergeBlock, SplitBlock); | ||||
return StartBlock; | return StartBlock; | ||||
} | } |