127 AllocaInst *StructData,
128 SetVector<Value *> Data,
ValueMapT &Map) {
130 LLVMContext &Context = SubFn->getContext();
133 BasicBlock *HeaderBB = BasicBlock::Create(Context,
"polly.par.setup", SubFn);
134 SubFnDT = std::make_unique<DominatorTree>(*SubFn);
137 BasicBlock *ExitBB = BasicBlock::Create(Context,
"polly.par.exit", SubFn);
138 BasicBlock *CheckNextBB =
139 BasicBlock::Create(Context,
"polly.par.checkNext", SubFn);
140 BasicBlock *PreHeaderBB =
141 BasicBlock::Create(Context,
"polly.par.loadIVBounds", SubFn);
143 SubFnDT->addNewBlock(ExitBB, HeaderBB);
144 SubFnDT->addNewBlock(CheckNextBB, HeaderBB);
145 SubFnDT->addNewBlock(PreHeaderBB, HeaderBB);
148 Builder.SetInsertPoint(HeaderBB);
152 "polly.par.lastIterPtr");
157 Function::arg_iterator AI = SubFn->arg_begin();
167 Value *Stride = &*AI;
169 Value *Shared = &*AI;
173 const auto Alignment = llvm::Align(
is64BitArch() ? 8 : 4);
175 "polly.par.global_tid");
177 Builder.CreateAlignedStore(LB, LBPtr, Alignment);
178 Builder.CreateAlignedStore(UB, UBPtr, Alignment);
179 Builder.CreateAlignedStore(
Builder.getInt32(0), IsLastPtr, Alignment);
180 Builder.CreateAlignedStore(Stride, StridePtr, Alignment);
185 "polly.indvar.UBAdjusted");
193 switch (Scheduling) {
203 Value *HasIteration =
204 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_EQ, HasWork,
205 Builder.getInt32(1),
"polly.hasIteration");
206 Builder.CreateCondBr(HasIteration, PreHeaderBB, ExitBB);
208 Builder.SetInsertPoint(CheckNextBB);
211 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_EQ, HasWork,
212 Builder.getInt32(1),
"polly.hasWork");
213 Builder.CreateCondBr(HasIteration, PreHeaderBB, ExitBB);
215 Builder.SetInsertPoint(PreHeaderBB);
226 Builder.CreateAlignedStore(AdjustedUB, UBPtr, Alignment);
230 LongType, StridePtr, Alignment,
"polly.kmpc.stride");
235 "polly.indvar.UB.temp");
238 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_SLE, UB, AdjustedUB,
239 "polly.indvar.UB.inRange");
240 UB =
Builder.CreateSelect(UBInRange, UB, AdjustedUB,
"polly.indvar.UB");
241 Builder.CreateAlignedStore(UB, UBPtr, Alignment);
244 llvm::CmpInst::Predicate::ICMP_SLE, LB, UB,
"polly.hasIteration");
245 Builder.CreateCondBr(HasIteration, PreHeaderBB, ExitBB);
248 Builder.SetInsertPoint(PreHeaderBB);
250 "polly.indvar.LB.entry");
252 "polly.indvar.UB.entry");
255 Builder.SetInsertPoint(CheckNextBB);
259 Builder.CreateAdd(LB, ChunkedStride,
"polly.indvar.nextLB");
262 Value *NextUBOutOfBounds =
263 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_SGT, NextUB,
264 AdjustedUB,
"polly.indvar.nextUB.outOfBounds");
265 NextUB =
Builder.CreateSelect(NextUBOutOfBounds, AdjustedUB, NextUB,
266 "polly.indvar.nextUB");
268 Builder.CreateAlignedStore(NextLB, LBPtr, Alignment);
269 Builder.CreateAlignedStore(NextUB, UBPtr, Alignment);
272 Builder.CreateICmp(llvm::CmpInst::Predicate::ICMP_SLE, NextLB,
273 AdjustedUB,
"polly.hasWork");
274 Builder.CreateCondBr(HasWork, PreHeaderBB, ExitBB);
279 Builder.SetInsertPoint(PreHeaderBB);
288 *
SubFnDT, AfterBB, ICmpInst::ICMP_SLE,
nullptr,
true,
291 BasicBlock::iterator LoopBody =
Builder.GetInsertPoint();
294 Builder.SetInsertPoint(ExitBB);
301 Builder.SetInsertPoint(LoopBody);
307 return std::make_tuple(IV, SubFn);
482 const std::string LocName =
".loc.dummy";
483 GlobalVariable *SourceLocDummy =
M->getGlobalVariable(LocName);
485 if (SourceLocDummy ==
nullptr) {
486 const std::string StructName =
"struct.ident_t";
487 StructType *IdentTy =
488 StructType::getTypeByName(
M->getContext(), StructName);
498 StructType::create(
M->getContext(), LocMembers, StructName,
false);
501 const auto ArrayType =
502 llvm::ArrayType::get(
Builder.getInt8Ty(), 23);
505 GlobalVariable *StrVar =
506 new GlobalVariable(*
M, ArrayType,
true, GlobalValue::PrivateLinkage,
507 nullptr,
".str.ident");
508 StrVar->setAlignment(llvm::Align(1));
510 SourceLocDummy =
new GlobalVariable(
511 *
M, IdentTy,
true, GlobalValue::PrivateLinkage,
nullptr, LocName);
512 SourceLocDummy->setAlignment(llvm::Align(8));
515 Constant *InitStr = ConstantDataArray::getString(
516 M->getContext(),
"Source location dummy.",
true);
518 Constant *StrPtr =
static_cast<Constant *
>(
Builder.CreateInBoundsGEP(
521 Constant *LocInitStruct = ConstantStruct::get(
526 StrVar->setInitializer(InitStr);
527 SourceLocDummy->setInitializer(LocInitStruct);
530 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.