@@ -4979,7 +4979,7 @@ static void createTargetLoopWorkshareCall(OpenMPIRBuilder *OMPBuilder,
4979
4979
WorksharingLoopType LoopType,
4980
4980
BasicBlock *InsertBlock, Value *Ident,
4981
4981
Value *LoopBodyArg, Value *TripCount,
4982
- Function &LoopBodyFn) {
4982
+ Function &LoopBodyFn, bool NoLoop ) {
4983
4983
Type *TripCountTy = TripCount->getType ();
4984
4984
Module &M = OMPBuilder->M ;
4985
4985
IRBuilder<> &Builder = OMPBuilder->Builder ;
@@ -5007,16 +5007,18 @@ static void createTargetLoopWorkshareCall(OpenMPIRBuilder *OMPBuilder,
5007
5007
RealArgs.push_back (ConstantInt::get (TripCountTy, 0 ));
5008
5008
if (LoopType == WorksharingLoopType::DistributeForStaticLoop) {
5009
5009
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 ));
5010
5013
}
5011
- RealArgs.push_back (ConstantInt::get (Builder.getInt8Ty (), 0 ));
5012
5014
5013
5015
Builder.CreateCall (RTLFn, RealArgs);
5014
5016
}
5015
5017
5016
5018
static void workshareLoopTargetCallback (
5017
5019
OpenMPIRBuilder *OMPIRBuilder, CanonicalLoopInfo *CLI, Value *Ident,
5018
5020
Function &OutlinedFn, const SmallVector<Instruction *, 4 > &ToBeDeleted,
5019
- WorksharingLoopType LoopType) {
5021
+ WorksharingLoopType LoopType, bool NoLoop ) {
5020
5022
IRBuilder<> &Builder = OMPIRBuilder->Builder ;
5021
5023
BasicBlock *Preheader = CLI->getPreheader ();
5022
5024
Value *TripCount = CLI->getTripCount ();
@@ -5063,17 +5065,16 @@ static void workshareLoopTargetCallback(
5063
5065
OutlinedFnCallInstruction->eraseFromParent ();
5064
5066
5065
5067
createTargetLoopWorkshareCall (OMPIRBuilder, LoopType, Preheader, Ident,
5066
- LoopBodyArg, TripCount, OutlinedFn);
5068
+ LoopBodyArg, TripCount, OutlinedFn, NoLoop );
5067
5069
5068
5070
for (auto &ToBeDeletedItem : ToBeDeleted)
5069
5071
ToBeDeletedItem->eraseFromParent ();
5070
5072
CLI->invalidate ();
5071
5073
}
5072
5074
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) {
5077
5078
uint32_t SrcLocStrSize;
5078
5079
Constant *SrcLocStr = getOrCreateSrcLocStr (DL, SrcLocStrSize);
5079
5080
Value *Ident = getOrCreateIdent (SrcLocStr, SrcLocStrSize);
@@ -5156,7 +5157,7 @@ OpenMPIRBuilder::applyWorkshareLoopTarget(DebugLoc DL, CanonicalLoopInfo *CLI,
5156
5157
OI.PostOutlineCB = [=, ToBeDeletedVec =
5157
5158
std::move (ToBeDeleted)](Function &OutlinedFn) {
5158
5159
workshareLoopTargetCallback (this , CLI, Ident, OutlinedFn, ToBeDeletedVec,
5159
- LoopType);
5160
+ LoopType, NoLoop );
5160
5161
};
5161
5162
addOutlineInfo (std::move (OI));
5162
5163
return CLI->getAfterIP ();
@@ -5167,9 +5168,9 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::applyWorkshareLoop(
5167
5168
bool NeedsBarrier, omp::ScheduleKind SchedKind, Value *ChunkSize,
5168
5169
bool HasSimdModifier, bool HasMonotonicModifier,
5169
5170
bool HasNonmonotonicModifier, bool HasOrderedClause,
5170
- WorksharingLoopType LoopType) {
5171
+ WorksharingLoopType LoopType, bool NoLoop ) {
5171
5172
if (Config.isTargetDevice ())
5172
- return applyWorkshareLoopTarget (DL, CLI, AllocaIP, LoopType);
5173
+ return applyWorkshareLoopTarget (DL, CLI, AllocaIP, LoopType, NoLoop );
5173
5174
OMPScheduleType EffectiveScheduleType = computeOpenMPScheduleType (
5174
5175
SchedKind, ChunkSize, HasSimdModifier, HasMonotonicModifier,
5175
5176
HasNonmonotonicModifier, HasOrderedClause);
0 commit comments