@@ -5009,7 +5009,7 @@ static void createTargetLoopWorkshareCall(OpenMPIRBuilder *OMPBuilder,
50095009 WorksharingLoopType LoopType,
50105010 BasicBlock *InsertBlock, Value *Ident,
50115011 Value *LoopBodyArg, Value *TripCount,
5012- Function &LoopBodyFn) {
5012+ Function &LoopBodyFn, bool NoLoop ) {
50135013 Type *TripCountTy = TripCount->getType ();
50145014 Module &M = OMPBuilder->M ;
50155015 IRBuilder<> &Builder = OMPBuilder->Builder ;
@@ -5037,16 +5037,18 @@ static void createTargetLoopWorkshareCall(OpenMPIRBuilder *OMPBuilder,
50375037 RealArgs.push_back (ConstantInt::get (TripCountTy, 0 ));
50385038 if (LoopType == WorksharingLoopType::DistributeForStaticLoop) {
50395039 RealArgs.push_back (ConstantInt::get (TripCountTy, 0 ));
5040+ RealArgs.push_back (ConstantInt::get (Builder.getInt8Ty (), NoLoop));
5041+ } else {
5042+ RealArgs.push_back (ConstantInt::get (Builder.getInt8Ty (), 0 ));
50405043 }
5041- RealArgs.push_back (ConstantInt::get (Builder.getInt8Ty (), 0 ));
50425044
50435045 Builder.CreateCall (RTLFn, RealArgs);
50445046}
50455047
50465048static void workshareLoopTargetCallback (
50475049 OpenMPIRBuilder *OMPIRBuilder, CanonicalLoopInfo *CLI, Value *Ident,
50485050 Function &OutlinedFn, const SmallVector<Instruction *, 4 > &ToBeDeleted,
5049- WorksharingLoopType LoopType) {
5051+ WorksharingLoopType LoopType, bool NoLoop ) {
50505052 IRBuilder<> &Builder = OMPIRBuilder->Builder ;
50515053 BasicBlock *Preheader = CLI->getPreheader ();
50525054 Value *TripCount = CLI->getTripCount ();
@@ -5093,17 +5095,16 @@ static void workshareLoopTargetCallback(
50935095 OutlinedFnCallInstruction->eraseFromParent ();
50945096
50955097 createTargetLoopWorkshareCall (OMPIRBuilder, LoopType, Preheader, Ident,
5096- LoopBodyArg, TripCount, OutlinedFn);
5098+ LoopBodyArg, TripCount, OutlinedFn, NoLoop );
50975099
50985100 for (auto &ToBeDeletedItem : ToBeDeleted)
50995101 ToBeDeletedItem->eraseFromParent ();
51005102 CLI->invalidate ();
51015103}
51025104
5103- OpenMPIRBuilder::InsertPointTy
5104- OpenMPIRBuilder::applyWorkshareLoopTarget (DebugLoc DL, CanonicalLoopInfo *CLI,
5105- InsertPointTy AllocaIP,
5106- WorksharingLoopType LoopType) {
5105+ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::applyWorkshareLoopTarget (
5106+ DebugLoc DL, CanonicalLoopInfo *CLI, InsertPointTy AllocaIP,
5107+ WorksharingLoopType LoopType, bool NoLoop) {
51075108 uint32_t SrcLocStrSize;
51085109 Constant *SrcLocStr = getOrCreateSrcLocStr (DL, SrcLocStrSize);
51095110 Value *Ident = getOrCreateIdent (SrcLocStr, SrcLocStrSize);
@@ -5186,7 +5187,7 @@ OpenMPIRBuilder::applyWorkshareLoopTarget(DebugLoc DL, CanonicalLoopInfo *CLI,
51865187 OI.PostOutlineCB = [=, ToBeDeletedVec =
51875188 std::move (ToBeDeleted)](Function &OutlinedFn) {
51885189 workshareLoopTargetCallback (this , CLI, Ident, OutlinedFn, ToBeDeletedVec,
5189- LoopType);
5190+ LoopType, NoLoop );
51905191 };
51915192 addOutlineInfo (std::move (OI));
51925193 return CLI->getAfterIP ();
@@ -5197,9 +5198,9 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::applyWorkshareLoop(
51975198 bool NeedsBarrier, omp::ScheduleKind SchedKind, Value *ChunkSize,
51985199 bool HasSimdModifier, bool HasMonotonicModifier,
51995200 bool HasNonmonotonicModifier, bool HasOrderedClause,
5200- WorksharingLoopType LoopType) {
5201+ WorksharingLoopType LoopType, bool NoLoop ) {
52015202 if (Config.isTargetDevice ())
5202- return applyWorkshareLoopTarget (DL, CLI, AllocaIP, LoopType);
5203+ return applyWorkshareLoopTarget (DL, CLI, AllocaIP, LoopType, NoLoop );
52035204 OMPScheduleType EffectiveScheduleType = computeOpenMPScheduleType (
52045205 SchedKind, ChunkSize, HasSimdModifier, HasMonotonicModifier,
52055206 HasNonmonotonicModifier, HasOrderedClause);
0 commit comments