diff options
Diffstat (limited to 'clang/lib/CodeGen/CGStmtOpenMP.cpp')
| -rw-r--r-- | clang/lib/CodeGen/CGStmtOpenMP.cpp | 66 |
1 files changed, 43 insertions, 23 deletions
diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp index f6a0ca574a19..d72cd8fbfd60 100644 --- a/clang/lib/CodeGen/CGStmtOpenMP.cpp +++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -471,12 +471,13 @@ struct FunctionOptions { const StringRef FunctionName; /// Location of the non-debug version of the outlined function. SourceLocation Loc; + const bool IsDeviceKernel = false; explicit FunctionOptions(const CapturedStmt *S, bool UIntPtrCastRequired, bool RegisterCastedArgsOnly, StringRef FunctionName, - SourceLocation Loc) + SourceLocation Loc, bool IsDeviceKernel) : S(S), UIntPtrCastRequired(UIntPtrCastRequired), RegisterCastedArgsOnly(UIntPtrCastRequired && RegisterCastedArgsOnly), - FunctionName(FunctionName), Loc(Loc) {} + FunctionName(FunctionName), Loc(Loc), IsDeviceKernel(IsDeviceKernel) {} }; } // namespace @@ -570,7 +571,11 @@ static llvm::Function *emitOutlinedFunctionPrologue( // Create the function declaration. const CGFunctionInfo &FuncInfo = - CGM.getTypes().arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, TargetArgs); + FO.IsDeviceKernel + ? CGM.getTypes().arrangeDeviceKernelCallerDeclaration(Ctx.VoidTy, + TargetArgs) + : CGM.getTypes().arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, + TargetArgs); llvm::FunctionType *FuncLLVMTy = CGM.getTypes().GetFunctionType(FuncInfo); auto *F = @@ -664,9 +669,9 @@ static llvm::Function *emitOutlinedFunctionPrologue( return F; } -llvm::Function * -CodeGenFunction::GenerateOpenMPCapturedStmtFunction(const CapturedStmt &S, - SourceLocation Loc) { +llvm::Function *CodeGenFunction::GenerateOpenMPCapturedStmtFunction( + const CapturedStmt &S, const OMPExecutableDirective &D) { + SourceLocation Loc = D.getBeginLoc(); assert( CapturedStmtInfo && "CapturedStmtInfo should be set when generating the captured function"); @@ -682,7 +687,10 @@ CodeGenFunction::GenerateOpenMPCapturedStmtFunction(const CapturedStmt &S, SmallString<256> Buffer; llvm::raw_svector_ostream Out(Buffer); Out << CapturedStmtInfo->getHelperName(); - + OpenMPDirectiveKind EKind = getEffectiveDirectiveKind(D); + bool IsDeviceKernel = CGM.getOpenMPRuntime().isGPU() && + isOpenMPTargetExecutionDirective(EKind) && + D.getCapturedStmt(OMPD_target) == &S; CodeGenFunction WrapperCGF(CGM, /*suppressNewContext=*/true); llvm::Function *WrapperF = nullptr; if (NeedWrapperFunction) { @@ -690,7 +698,8 @@ CodeGenFunction::GenerateOpenMPCapturedStmtFunction(const CapturedStmt &S, // OpenMPI-IR-Builder. FunctionOptions WrapperFO(&S, /*UIntPtrCastRequired=*/true, /*RegisterCastedArgsOnly=*/true, - CapturedStmtInfo->getHelperName(), Loc); + CapturedStmtInfo->getHelperName(), Loc, + IsDeviceKernel); WrapperCGF.CapturedStmtInfo = CapturedStmtInfo; WrapperF = emitOutlinedFunctionPrologue(WrapperCGF, Args, LocalAddrs, VLASizes, @@ -698,7 +707,7 @@ CodeGenFunction::GenerateOpenMPCapturedStmtFunction(const CapturedStmt &S, Out << "_debug__"; } FunctionOptions FO(&S, !NeedWrapperFunction, /*RegisterCastedArgsOnly=*/false, - Out.str(), Loc); + Out.str(), Loc, !NeedWrapperFunction && IsDeviceKernel); llvm::Function *F = emitOutlinedFunctionPrologue( *this, WrapperArgs, WrapperLocalAddrs, WrapperVLASizes, CXXThisValue, FO); CodeGenFunction::OMPPrivateScope LocalScope(*this); @@ -1608,6 +1617,11 @@ static void emitCommonOMPParallelDirective( const CodeGenBoundParametersTy &CodeGenBoundParameters) { const CapturedStmt *CS = S.getCapturedStmt(OMPD_parallel); llvm::Value *NumThreads = nullptr; + OpenMPNumThreadsClauseModifier Modifier = OMPC_NUMTHREADS_unknown; + // OpenMP 6.0, 10.4: "If no severity clause is specified then the effect is as + // if sev-level is fatal." + OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal; + clang::Expr *Message = nullptr; llvm::Function *OutlinedFn = CGF.CGM.getOpenMPRuntime().emitParallelOutlinedFunction( CGF, S, *CS->getCapturedDecl()->param_begin(), InnermostKind, @@ -1616,8 +1630,14 @@ static void emitCommonOMPParallelDirective( CodeGenFunction::RunCleanupsScope NumThreadsScope(CGF); NumThreads = CGF.EmitScalarExpr(NumThreadsClause->getNumThreads(), /*IgnoreResultAssign=*/true); + Modifier = NumThreadsClause->getModifier(); + if (const auto *MessageClause = S.getSingleClause<OMPMessageClause>()) + Message = MessageClause->getMessageString(); + if (const auto *SeverityClause = S.getSingleClause<OMPSeverityClause>()) + Severity = SeverityClause->getSeverityKind(); CGF.CGM.getOpenMPRuntime().emitNumThreadsClause( - CGF, NumThreads, NumThreadsClause->getBeginLoc()); + CGF, NumThreads, NumThreadsClause->getBeginLoc(), Modifier, Severity, + Message); } if (const auto *ProcBindClause = S.getSingleClause<OMPProcBindClause>()) { CodeGenFunction::RunCleanupsScope ProcBindScope(CGF); @@ -1642,7 +1662,8 @@ static void emitCommonOMPParallelDirective( CodeGenBoundParameters(CGF, S, CapturedVars); CGF.GenerateOpenMPCapturedVars(*CS, CapturedVars); CGF.CGM.getOpenMPRuntime().emitParallelCall(CGF, S.getBeginLoc(), OutlinedFn, - CapturedVars, IfCond, NumThreads); + CapturedVars, IfCond, NumThreads, + Modifier, Severity, Message); } static bool isAllocatableDecl(const VarDecl *VD) { @@ -1927,7 +1948,8 @@ static void emitBody(CodeGenFunction &CGF, const Stmt *S, const Stmt *NextLoop, return; } if (SimplifiedS == NextLoop) { - if (auto *Dir = dyn_cast<OMPLoopTransformationDirective>(SimplifiedS)) + if (auto *Dir = + dyn_cast<OMPCanonicalLoopNestTransformationDirective>(SimplifiedS)) SimplifiedS = Dir->getTransformedStmt(); if (const auto *CanonLoop = dyn_cast<OMPCanonicalLoop>(SimplifiedS)) SimplifiedS = CanonLoop->getLoopStmt(); @@ -1969,7 +1991,7 @@ void CodeGenFunction::EmitOMPLoopBody(const OMPLoopDirective &D, // On a continue in the body, jump to the end. JumpDest Continue = getJumpDestInCurrentScope("omp.body.continue"); - BreakContinueStack.push_back(BreakContinue(LoopExit, Continue)); + BreakContinueStack.push_back(BreakContinue(D, LoopExit, Continue)); for (const Expr *E : D.finals_conditions()) { if (!E) continue; @@ -2198,7 +2220,7 @@ void CodeGenFunction::EmitOMPInnerLoop( // Create a block for the increment. JumpDest Continue = getJumpDestInCurrentScope("omp.inner.for.inc"); - BreakContinueStack.push_back(BreakContinue(LoopExit, Continue)); + BreakContinueStack.push_back(BreakContinue(S, LoopExit, Continue)); BodyGen(*this); @@ -3043,7 +3065,7 @@ void CodeGenFunction::EmitOMPOuterLoop( // Create a block for the increment. JumpDest Continue = getJumpDestInCurrentScope("omp.dispatch.inc"); - BreakContinueStack.push_back(BreakContinue(LoopExit, Continue)); + BreakContinueStack.push_back(BreakContinue(S, LoopExit, Continue)); OpenMPDirectiveKind EKind = getEffectiveDirectiveKind(S); emitCommonSimdLoop( @@ -6106,13 +6128,13 @@ void CodeGenFunction::EmitOMPDistributeDirective( emitOMPDistributeDirective(S, *this, CGM); } -static llvm::Function *emitOutlinedOrderedFunction(CodeGenModule &CGM, - const CapturedStmt *S, - SourceLocation Loc) { +static llvm::Function * +emitOutlinedOrderedFunction(CodeGenModule &CGM, const CapturedStmt *S, + const OMPExecutableDirective &D) { CodeGenFunction CGF(CGM, /*suppressNewContext=*/true); CodeGenFunction::CGCapturedStmtInfo CapStmtInfo; CGF.CapturedStmtInfo = &CapStmtInfo; - llvm::Function *Fn = CGF.GenerateOpenMPCapturedStmtFunction(*S, Loc); + llvm::Function *Fn = CGF.GenerateOpenMPCapturedStmtFunction(*S, D); Fn->setDoesNotRecurse(); return Fn; } @@ -6177,8 +6199,7 @@ void CodeGenFunction::EmitOMPOrderedDirective(const OMPOrderedDirective &S) { Builder, /*CreateBranch=*/false, ".ordered.after"); llvm::SmallVector<llvm::Value *, 16> CapturedVars; GenerateOpenMPCapturedVars(*CS, CapturedVars); - llvm::Function *OutlinedFn = - emitOutlinedOrderedFunction(CGM, CS, S.getBeginLoc()); + llvm::Function *OutlinedFn = emitOutlinedOrderedFunction(CGM, CS, S); assert(S.getBeginLoc().isValid() && "Outlined function call location must be valid."); ApplyDebugLocation::CreateDefaultArtificial(*this, S.getBeginLoc()); @@ -6220,8 +6241,7 @@ void CodeGenFunction::EmitOMPOrderedDirective(const OMPOrderedDirective &S) { if (C) { llvm::SmallVector<llvm::Value *, 16> CapturedVars; CGF.GenerateOpenMPCapturedVars(*CS, CapturedVars); - llvm::Function *OutlinedFn = - emitOutlinedOrderedFunction(CGM, CS, S.getBeginLoc()); + llvm::Function *OutlinedFn = emitOutlinedOrderedFunction(CGM, CS, S); CGM.getOpenMPRuntime().emitOutlinedFunctionCall(CGF, S.getBeginLoc(), OutlinedFn, CapturedVars); } else { |
