127 AllocaInst *StructData,
128 SetVector<Value *> Data,
ValueMapT &Map) {
130 LLVMContext &Context = SubFn->getContext();
133 BasicBlock *HeaderBB = BasicBlock::Create(Context,
"polly.par.setup", SubFn);
135 auto *UI =
new UnreachableInst(Context, HeaderBB);
136 SubFnDT = std::make_unique<DominatorTree>(*SubFn);
138 UI->eraseFromParent();
140 BasicBlock *ExitBB = BasicBlock::Create(Context,
"polly.par.exit", SubFn);
141 BasicBlock *CheckNextBB =
142 BasicBlock::Create(Context,
"polly.par.checkNext", SubFn);
143 BasicBlock *PreHeaderBB =
144 BasicBlock::Create(Context,
"polly.par.loadIVBounds", SubFn);
146 SubFnDT->addNewBlock(ExitBB, HeaderBB);
147 SubFnDT->addNewBlock(CheckNextBB, HeaderBB);
148 SubFnDT->addNewBlock(PreHeaderBB, HeaderBB);
151 Builder.SetInsertPoint(HeaderBB);
155 "polly.par.lastIterPtr");
160 Function::arg_iterator AI = SubFn->arg_begin();
170 Value *Stride = &*AI;
172 Value *Shared = &*AI;
176 const auto Alignment = llvm::Align(
is64BitArch() ? 8 : 4);
178 "polly.par.global_tid");
180 Builder.CreateAlignedStore(LB, LBPtr, Alignment);
181 Builder.CreateAlignedStore(UB, UBPtr, Alignment);
182 Builder.CreateAlignedStore(
Builder.getInt32(0), IsLastPtr, Alignment);
183 Builder.CreateAlignedStore(Stride, StridePtr, Alignment);
188 "polly.indvar.UBAdjusted");
196 switch (Scheduling) {
206 Value *HasIteration =
207 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_EQ, HasWork,
208 Builder.getInt32(1),
"polly.hasIteration");
209 Builder.CreateCondBr(HasIteration, PreHeaderBB, ExitBB);
211 Builder.SetInsertPoint(CheckNextBB);
214 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_EQ, HasWork,
215 Builder.getInt32(1),
"polly.hasWork");
216 Builder.CreateCondBr(HasIteration, PreHeaderBB, ExitBB);
218 Builder.SetInsertPoint(PreHeaderBB);
229 Builder.CreateAlignedStore(AdjustedUB, UBPtr, Alignment);
233 LongType, StridePtr, Alignment,
"polly.kmpc.stride");
238 "polly.indvar.UB.temp");
241 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_SLE, UB, AdjustedUB,
242 "polly.indvar.UB.inRange");
243 UB =
Builder.CreateSelect(UBInRange, UB, AdjustedUB,
"polly.indvar.UB");
244 Builder.CreateAlignedStore(UB, UBPtr, Alignment);
247 llvm::CmpInst::Predicate::ICMP_SLE, LB, UB,
"polly.hasIteration");
248 Builder.CreateCondBr(HasIteration, PreHeaderBB, ExitBB);
251 Builder.SetInsertPoint(PreHeaderBB);
253 "polly.indvar.LB.entry");
255 "polly.indvar.UB.entry");
258 Builder.SetInsertPoint(CheckNextBB);
262 Builder.CreateAdd(LB, ChunkedStride,
"polly.indvar.nextLB");
265 Value *NextUBOutOfBounds =
266 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_SGT, NextUB,
267 AdjustedUB,
"polly.indvar.nextUB.outOfBounds");
268 NextUB =
Builder.CreateSelect(NextUBOutOfBounds, AdjustedUB, NextUB,
269 "polly.indvar.nextUB");
271 Builder.CreateAlignedStore(NextLB, LBPtr, Alignment);
272 Builder.CreateAlignedStore(NextUB, UBPtr, Alignment);
275 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_SLE, NextLB,
276 AdjustedUB,
"polly.hasWork");
277 Builder.CreateCondBr(HasWork, PreHeaderBB, ExitBB);
282 Builder.SetInsertPoint(PreHeaderBB);
291 *
SubFnDT, AfterBB, ICmpInst::ICMP_SLE,
nullptr,
true,
294 BasicBlock::iterator LoopBody =
Builder.GetInsertPoint();
297 Builder.SetInsertPoint(ExitBB);
304 Builder.SetInsertPoint(LoopBody);
310 return std::make_tuple(IV, SubFn);
485 const std::string LocName =
".loc.dummy";
486 GlobalVariable *SourceLocDummy =
M->getGlobalVariable(LocName);
488 if (SourceLocDummy ==
nullptr) {
489 const std::string StructName =
"struct.ident_t";
490 StructType *IdentTy =
491 StructType::getTypeByName(
M->getContext(), StructName);
501 StructType::create(
M->getContext(), LocMembers, StructName,
false);
504 const auto ArrayType =
505 llvm::ArrayType::get(
Builder.getInt8Ty(), 23);
508 GlobalVariable *StrVar =
509 new GlobalVariable(*
M, ArrayType,
true, GlobalValue::PrivateLinkage,
510 nullptr,
".str.ident");
511 StrVar->setAlignment(llvm::Align(1));
513 SourceLocDummy =
new GlobalVariable(
514 *
M, IdentTy,
true, GlobalValue::PrivateLinkage,
nullptr, LocName);
515 SourceLocDummy->setAlignment(llvm::Align(8));
518 Constant *InitStr = ConstantDataArray::getString(
519 M->getContext(),
"Source location dummy.",
true);
521 Constant *StrPtr =
static_cast<Constant *
>(
Builder.CreateInBoundsGEP(
524 Constant *LocInitStruct = ConstantStruct::get(
529 StrVar->setInitializer(InitStr);
530 SourceLocDummy->setInitializer(LocInitStruct);
533 return SourceLocDummy;
Value * createLoop(Value *LowerBound, Value *UpperBound, Value *Stride, PollyIRBuilder &Builder, LoopInfo &LI, DominatorTree &DT, BasicBlock *&ExitBlock, ICmpInst::Predicate Predicate, ScopAnnotator *Annotator=nullptr, bool Parallel=false, bool UseGuard=true, bool LoopVectDisabled=false)
Create a scalar do/for-style loop.