@@ -4979,7 +4979,7 @@ static void createTargetLoopWorkshareCall(OpenMPIRBuilder *OMPBuilder,
49794979 WorksharingLoopType LoopType,
49804980 BasicBlock *InsertBlock, Value *Ident,
49814981 Value *LoopBodyArg, Value *TripCount,
4982- Function &LoopBodyFn) {
4982+ Function &LoopBodyFn, bool NoLoop ) {
49834983 Type *TripCountTy = TripCount->getType ();
49844984 Module &M = OMPBuilder->M ;
49854985 IRBuilder<> &Builder = OMPBuilder->Builder ;
@@ -5007,16 +5007,18 @@ static void createTargetLoopWorkshareCall(OpenMPIRBuilder *OMPBuilder,
50075007 RealArgs.push_back (ConstantInt::get (TripCountTy, 0 ));
50085008 if (LoopType == WorksharingLoopType::DistributeForStaticLoop) {
50095009 RealArgs.push_back (ConstantInt::get (TripCountTy, 0 ));
5010+ RealArgs.push_back (ConstantInt::get (Builder.getInt8Ty (), NoLoop));
5011+ } else {
5012+ RealArgs.push_back (ConstantInt::get (Builder.getInt8Ty (), 0 ));
50105013 }
5011- RealArgs.push_back (ConstantInt::get (Builder.getInt8Ty (), 0 ));
50125014
50135015 Builder.CreateCall (RTLFn, RealArgs);
50145016}
50155017
50165018static void workshareLoopTargetCallback (
50175019 OpenMPIRBuilder *OMPIRBuilder, CanonicalLoopInfo *CLI, Value *Ident,
50185020 Function &OutlinedFn, const SmallVector<Instruction *, 4 > &ToBeDeleted,
5019- WorksharingLoopType LoopType) {
5021+ WorksharingLoopType LoopType, bool NoLoop ) {
50205022 IRBuilder<> &Builder = OMPIRBuilder->Builder ;
50215023 BasicBlock *Preheader = CLI->getPreheader ();
50225024 Value *TripCount = CLI->getTripCount ();
@@ -5063,17 +5065,16 @@ static void workshareLoopTargetCallback(
50635065 OutlinedFnCallInstruction->eraseFromParent ();
50645066
50655067 createTargetLoopWorkshareCall (OMPIRBuilder, LoopType, Preheader, Ident,
5066- LoopBodyArg, TripCount, OutlinedFn);
5068+ LoopBodyArg, TripCount, OutlinedFn, NoLoop );
50675069
50685070 for (auto &ToBeDeletedItem : ToBeDeleted)
50695071 ToBeDeletedItem->eraseFromParent ();
50705072 CLI->invalidate ();
50715073}
50725074
5073- OpenMPIRBuilder::InsertPointTy
5074- OpenMPIRBuilder::applyWorkshareLoopTarget (DebugLoc DL, CanonicalLoopInfo *CLI,
5075- InsertPointTy AllocaIP,
5076- WorksharingLoopType LoopType) {
5075+ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::applyWorkshareLoopTarget (
5076+ DebugLoc DL, CanonicalLoopInfo *CLI, InsertPointTy AllocaIP,
5077+ WorksharingLoopType LoopType, bool NoLoop) {
50775078 uint32_t SrcLocStrSize;
50785079 Constant *SrcLocStr = getOrCreateSrcLocStr (DL, SrcLocStrSize);
50795080 Value *Ident = getOrCreateIdent (SrcLocStr, SrcLocStrSize);
@@ -5156,7 +5157,7 @@ OpenMPIRBuilder::applyWorkshareLoopTarget(DebugLoc DL, CanonicalLoopInfo *CLI,
51565157 OI.PostOutlineCB = [=, ToBeDeletedVec =
51575158 std::move (ToBeDeleted)](Function &OutlinedFn) {
51585159 workshareLoopTargetCallback (this , CLI, Ident, OutlinedFn, ToBeDeletedVec,
5159- LoopType);
5160+ LoopType, NoLoop );
51605161 };
51615162 addOutlineInfo (std::move (OI));
51625163 return CLI->getAfterIP ();
@@ -5167,9 +5168,9 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::applyWorkshareLoop(
51675168 bool NeedsBarrier, omp::ScheduleKind SchedKind, Value *ChunkSize,
51685169 bool HasSimdModifier, bool HasMonotonicModifier,
51695170 bool HasNonmonotonicModifier, bool HasOrderedClause,
5170- WorksharingLoopType LoopType) {
5171+ WorksharingLoopType LoopType, bool NoLoop ) {
51715172 if (Config.isTargetDevice ())
5172- return applyWorkshareLoopTarget (DL, CLI, AllocaIP, LoopType);
5173+ return applyWorkshareLoopTarget (DL, CLI, AllocaIP, LoopType, NoLoop );
51735174 OMPScheduleType EffectiveScheduleType = computeOpenMPScheduleType (
51745175 SchedKind, ChunkSize, HasSimdModifier, HasMonotonicModifier,
51755176 HasNonmonotonicModifier, HasOrderedClause);
0 commit comments