@@ -5010,7 +5010,7 @@ static void createTargetLoopWorkshareCall(OpenMPIRBuilder *OMPBuilder,
50105010 WorksharingLoopType LoopType,
50115011 BasicBlock *InsertBlock, Value *Ident,
50125012 Value *LoopBodyArg, Value *TripCount,
5013- Function &LoopBodyFn) {
5013+ Function &LoopBodyFn, bool NoLoop ) {
50145014 Type *TripCountTy = TripCount->getType ();
50155015 Module &M = OMPBuilder->M ;
50165016 IRBuilder<> &Builder = OMPBuilder->Builder ;
@@ -5038,16 +5038,18 @@ static void createTargetLoopWorkshareCall(OpenMPIRBuilder *OMPBuilder,
50385038 RealArgs.push_back (ConstantInt::get (TripCountTy, 0 ));
50395039 if (LoopType == WorksharingLoopType::DistributeForStaticLoop) {
50405040 RealArgs.push_back (ConstantInt::get (TripCountTy, 0 ));
5041+ RealArgs.push_back (ConstantInt::get (Builder.getInt8Ty (), NoLoop));
5042+ } else {
5043+ RealArgs.push_back (ConstantInt::get (Builder.getInt8Ty (), 0 ));
50415044 }
5042- RealArgs.push_back (ConstantInt::get (Builder.getInt8Ty (), 0 ));
50435045
50445046 Builder.CreateCall (RTLFn, RealArgs);
50455047}
50465048
50475049static void workshareLoopTargetCallback (
50485050 OpenMPIRBuilder *OMPIRBuilder, CanonicalLoopInfo *CLI, Value *Ident,
50495051 Function &OutlinedFn, const SmallVector<Instruction *, 4 > &ToBeDeleted,
5050- WorksharingLoopType LoopType) {
5052+ WorksharingLoopType LoopType, bool NoLoop ) {
50515053 IRBuilder<> &Builder = OMPIRBuilder->Builder ;
50525054 BasicBlock *Preheader = CLI->getPreheader ();
50535055 Value *TripCount = CLI->getTripCount ();
@@ -5094,17 +5096,16 @@ static void workshareLoopTargetCallback(
50945096 OutlinedFnCallInstruction->eraseFromParent ();
50955097
50965098 createTargetLoopWorkshareCall (OMPIRBuilder, LoopType, Preheader, Ident,
5097- LoopBodyArg, TripCount, OutlinedFn);
5099+ LoopBodyArg, TripCount, OutlinedFn, NoLoop );
50985100
50995101 for (auto &ToBeDeletedItem : ToBeDeleted)
51005102 ToBeDeletedItem->eraseFromParent ();
51015103 CLI->invalidate ();
51025104}
51035105
5104- OpenMPIRBuilder::InsertPointTy
5105- OpenMPIRBuilder::applyWorkshareLoopTarget (DebugLoc DL, CanonicalLoopInfo *CLI,
5106- InsertPointTy AllocaIP,
5107- WorksharingLoopType LoopType) {
5106+ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::applyWorkshareLoopTarget (
5107+ DebugLoc DL, CanonicalLoopInfo *CLI, InsertPointTy AllocaIP,
5108+ WorksharingLoopType LoopType, bool NoLoop) {
51085109 uint32_t SrcLocStrSize;
51095110 Constant *SrcLocStr = getOrCreateSrcLocStr (DL, SrcLocStrSize);
51105111 Value *Ident = getOrCreateIdent (SrcLocStr, SrcLocStrSize);
@@ -5187,7 +5188,7 @@ OpenMPIRBuilder::applyWorkshareLoopTarget(DebugLoc DL, CanonicalLoopInfo *CLI,
51875188 OI.PostOutlineCB = [=, ToBeDeletedVec =
51885189 std::move (ToBeDeleted)](Function &OutlinedFn) {
51895190 workshareLoopTargetCallback (this , CLI, Ident, OutlinedFn, ToBeDeletedVec,
5190- LoopType);
5191+ LoopType, NoLoop );
51915192 };
51925193 addOutlineInfo (std::move (OI));
51935194 return CLI->getAfterIP ();
@@ -5198,9 +5199,9 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::applyWorkshareLoop(
51985199 bool NeedsBarrier, omp::ScheduleKind SchedKind, Value *ChunkSize,
51995200 bool HasSimdModifier, bool HasMonotonicModifier,
52005201 bool HasNonmonotonicModifier, bool HasOrderedClause,
5201- WorksharingLoopType LoopType) {
5202+ WorksharingLoopType LoopType, bool NoLoop ) {
52025203 if (Config.isTargetDevice ())
5203- return applyWorkshareLoopTarget (DL, CLI, AllocaIP, LoopType);
5204+ return applyWorkshareLoopTarget (DL, CLI, AllocaIP, LoopType, NoLoop );
52045205 OMPScheduleType EffectiveScheduleType = computeOpenMPScheduleType (
52055206 SchedKind, ChunkSize, HasSimdModifier, HasMonotonicModifier,
52065207 HasNonmonotonicModifier, HasOrderedClause);
0 commit comments