diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/CodeGen/CGOpenMPRuntime.cpp | 23 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGOpenMPRuntime.h | 10 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGStmtOpenMP.cpp | 16 |
3 files changed, 34 insertions, 15 deletions
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 19a58f06feb..ec939dd9db3 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -3777,7 +3777,8 @@ void CGOpenMPRuntime::emitTaskCall( void CGOpenMPRuntime::emitTaskLoopCall( CodeGenFunction &CGF, SourceLocation Loc, const OMPLoopDirective &D, - bool Tied, llvm::PointerIntPair<llvm::Value *, 1, bool> Final, bool Nogroup, + bool Tied, llvm::PointerIntPair<llvm::Value *, 1, bool> Final, + llvm::PointerIntPair<llvm::Value *, 1, bool> Schedule, bool Nogroup, unsigned NumberOfParts, llvm::Value *TaskFunction, QualType SharedsTy, Address Shareds, const Expr *IfCond, ArrayRef<const Expr *> PrivateVars, ArrayRef<const Expr *> PrivateCopies, @@ -3825,17 +3826,19 @@ void CGOpenMPRuntime::emitTaskLoopCall( cast<VarDecl>(cast<DeclRefExpr>(D.getStrideVariable())->getDecl()); CGF.EmitAnyExprToMem(StVar->getInit(), StLVal.getAddress(), StLVal.getQuals(), /*IsInitializer=*/true); + enum { NoSchedule = 0, Grainsize = 1, NumTasks = 2 }; llvm::Value *TaskArgs[] = { - UpLoc, - ThreadID, - Data.NewTask, - IfVal, - LBLVal.getPointer(), - UBLVal.getPointer(), - CGF.EmitLoadOfScalar(StLVal, SourceLocation()), + UpLoc, ThreadID, Data.NewTask, IfVal, LBLVal.getPointer(), + UBLVal.getPointer(), CGF.EmitLoadOfScalar(StLVal, SourceLocation()), llvm::ConstantInt::getSigned(CGF.IntTy, Nogroup ? 1 : 0), - llvm::ConstantInt::getSigned(CGF.IntTy, /*V=*/0), - llvm::ConstantInt::get(CGF.Int64Ty, /*V=*/0), + llvm::ConstantInt::getSigned( + CGF.IntTy, Schedule.getPointer() + ? Schedule.getInt() ? NumTasks : Grainsize + : NoSchedule), + Schedule.getPointer() + ? CGF.Builder.CreateIntCast(Schedule.getPointer(), CGF.Int64Ty, + /*isSigned=*/false) + : llvm::ConstantInt::get(CGF.Int64Ty, /*V=*/0), llvm::ConstantPointerNull::get(CGF.VoidPtrTy)}; CGF.EmitRuntimeCall(createRuntimeFunction(OMPRTL__kmpc_taskloop), TaskArgs); } diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.h b/clang/lib/CodeGen/CGOpenMPRuntime.h index 68fe1ccc981..19eb3622f0a 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.h +++ b/clang/lib/CodeGen/CGOpenMPRuntime.h @@ -858,6 +858,9 @@ public: /// \param Final Contains either constant bool value, or llvm::Value * of i1 /// type for final clause. If the value is true, the task forces all of its /// child tasks to become final and included tasks. + /// \param Schedule If Pointer is nullptr, no grainsize/num_tasks clauses were + /// specified. If IntVal is false - it is for grainsize clause, true - for + /// num_tasks clause. /// \param Nogroup true if nogroup clause was specified, false otherwise. /// \param NumberOfParts Number of parts in untied taskloops. /// \param TaskFunction An LLVM function with type void (*)(i32 /*gtid*/, i32 @@ -881,9 +884,10 @@ public: virtual void emitTaskLoopCall( CodeGenFunction &CGF, SourceLocation Loc, const OMPLoopDirective &D, bool Tied, llvm::PointerIntPair<llvm::Value *, 1, bool> Final, - bool Nogroup, unsigned NumberOfParts, llvm::Value *TaskFunction, - QualType SharedsTy, Address Shareds, const Expr *IfCond, - ArrayRef<const Expr *> PrivateVars, ArrayRef<const Expr *> PrivateCopies, + llvm::PointerIntPair<llvm::Value *, 1, bool> Schedule, bool Nogroup, + unsigned NumberOfParts, llvm::Value *TaskFunction, QualType SharedsTy, + Address Shareds, const Expr *IfCond, ArrayRef<const Expr *> PrivateVars, + ArrayRef<const Expr *> PrivateCopies, ArrayRef<const Expr *> FirstprivateVars, ArrayRef<const Expr *> FirstprivateCopies, ArrayRef<const Expr *> FirstprivateInits); diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp index 9a9fdfcb7f4..ae783f5dde7 100644 --- a/clang/lib/CodeGen/CGStmtOpenMP.cpp +++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -3362,6 +3362,18 @@ void CodeGenFunction::EmitOMPTaskLoopBasedDirective(const OMPLoopDirective &S) { // By default the task is not final. Final.setInt(/*IntVal=*/false); } + llvm::PointerIntPair<llvm::Value * /*no grainsize/num_tasks=nullptr*/, 1, + bool /*Grainsize=false, NumTasks=true*/> + Schedule; + if (const auto* Clause = S.getSingleClause<OMPGrainsizeClause>()) { + // grainsize clause + Schedule.setInt(/*IntVal=*/false); + Schedule.setPointer(EmitScalarExpr(Clause->getGrainsize())); + } else if (const auto* Clause = S.getSingleClause<OMPNumTasksClause>()) { + // num_tasks clause + Schedule.setInt(/*IntVal=*/true); + Schedule.setPointer(EmitScalarExpr(Clause->getNumTasks())); + } auto &&BodyGen = [CS, &S](CodeGenFunction &CGF, PrePostActionTy &) { // if (PreCond) { @@ -3433,13 +3445,13 @@ void CodeGenFunction::EmitOMPTaskLoopBasedDirective(const OMPLoopDirective &S) { CGF.EmitBlock(ContBlock, true); } }; - auto &&TaskGen = [&S, SharedsTy, CapturedStruct, IfCond, &Final, + auto &&TaskGen = [&S, SharedsTy, CapturedStruct, IfCond, &Final, &Schedule, Nogroup](CodeGenFunction &CGF, llvm::Value *OutlinedFn, const OMPPrivateDataTy &Data) { auto &&CodeGen = [&](CodeGenFunction &CGF, PrePostActionTy &) { OMPLoopScope PreInitScope(CGF, S); CGF.CGM.getOpenMPRuntime().emitTaskLoopCall( - CGF, S.getLocStart(), S, Data.Tied, Final, Nogroup, + CGF, S.getLocStart(), S, Data.Tied, Final, Schedule, Nogroup, Data.NumberOfParts, OutlinedFn, SharedsTy, CapturedStruct, IfCond, Data.PrivateVars, Data.PrivateCopies, Data.FirstprivateVars, Data.FirstprivateCopies, Data.FirstprivateInits); |