diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2018-01-12 19:39:11 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2018-01-12 19:39:11 +0000 |
commit | 475a7440f193dda74291bfea7bb0179f83a07a61 (patch) | |
tree | f8793905a909f9fbf8fcba5672f7a2853654535b /clang/lib/CodeGen/CGOpenMPRuntime.cpp | |
parent | 2e052793997f231f14e819a81d6bc1941e10493d (diff) | |
download | bcm5719-llvm-475a7440f193dda74291bfea7bb0179f83a07a61.tar.gz bcm5719-llvm-475a7440f193dda74291bfea7bb0179f83a07a61.zip |
[OPENMP] Replace calls of getAssociatedStmt().
getAssociatedStmt() returns the outermost captured statement for the
OpenMP directive. It may return incorrect region in case of combined
constructs. Reworked the code to reduce the number of calls of
getAssociatedStmt() and used getInnermostCapturedStmt() and
getCapturedStmt() functions instead.
In case of firstprivate variables it may lead to an extra allocas
generation for private copies even if the variable is passed by value
into outlined function and could be used directly as private copy.
llvm-svn: 322393
Diffstat (limited to 'clang/lib/CodeGen/CGOpenMPRuntime.cpp')
-rw-r--r-- | clang/lib/CodeGen/CGOpenMPRuntime.cpp | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 9fa173b2e09..9cff2a35784 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -1371,7 +1371,10 @@ llvm::Value *CGOpenMPRuntime::emitTaskOutlinedFunction( CodeGen.setAction(Action); assert(!ThreadIDVar->getType()->isPointerType() && "thread id variable must be of type kmp_int32 for tasks"); - auto *CS = cast<CapturedStmt>(D.getAssociatedStmt()); + const OpenMPDirectiveKind Region = + isOpenMPTaskLoopDirective(D.getDirectiveKind()) ? OMPD_taskloop + : OMPD_task; + auto *CS = D.getCapturedStmt(Region); auto *TD = dyn_cast<OMPTaskDirective>(&D); CodeGenFunction CGF(CGM, true); CGOpenMPTaskOutlinedRegionInfo CGInfo(*CS, ThreadIDVar, CodeGen, @@ -5885,7 +5888,7 @@ void CGOpenMPRuntime::emitTargetOutlinedFunctionHelper( << llvm::format("_%x_", FileID) << ParentName << "_l" << Line; } - const CapturedStmt &CS = *cast<CapturedStmt>(D.getAssociatedStmt()); + const CapturedStmt &CS = *D.getCapturedStmt(OMPD_target); CodeGenFunction CGF(CGM, true); CGOpenMPTargetRegionInfo CGInfo(CS, CodeGen, EntryFnName); @@ -5979,7 +5982,7 @@ emitNumTeamsForTargetDirective(CGOpenMPRuntime &OMPRuntime, // the expression is captured in the enclosing target environment when the // teams directive is not combined with target. - const CapturedStmt &CS = *cast<CapturedStmt>(D.getAssociatedStmt()); + const CapturedStmt &CS = *D.getCapturedStmt(OMPD_target); if (auto *TeamsDir = dyn_cast_or_null<OMPExecutableDirective>( ignoreCompoundStmts(CS.getCapturedStmt()))) { @@ -6082,7 +6085,7 @@ emitNumThreadsForTargetDirective(CGOpenMPRuntime &OMPRuntime, // the expression is captured in the enclosing target environment when the // teams directive is not combined with target. - const CapturedStmt &CS = *cast<CapturedStmt>(D.getAssociatedStmt()); + const CapturedStmt &CS = *D.getCapturedStmt(OMPD_target); if (auto *TeamsDir = dyn_cast_or_null<OMPExecutableDirective>( ignoreCompoundStmts(CS.getCapturedStmt()))) { @@ -7059,7 +7062,7 @@ void CGOpenMPRuntime::emitTargetCall(CodeGenFunction &CGF, // Get mappable expression information. MappableExprsHandler MEHandler(D, CGF); - const CapturedStmt &CS = *cast<CapturedStmt>(D.getAssociatedStmt()); + const CapturedStmt &CS = *D.getCapturedStmt(OMPD_target); auto RI = CS.getCapturedRecordDecl()->field_begin(); auto CV = CapturedVars.begin(); for (CapturedStmt::const_capture_iterator CI = CS.capture_begin(), @@ -7314,12 +7317,11 @@ void CGOpenMPRuntime::scanForTargetRegionsFunctions(const Stmt *S, } if (const OMPExecutableDirective *E = dyn_cast<OMPExecutableDirective>(S)) { - if (!E->hasAssociatedStmt()) + if (!E->hasAssociatedStmt() || !E->getAssociatedStmt()) return; scanForTargetRegionsFunctions( - cast<CapturedStmt>(E->getAssociatedStmt())->getCapturedStmt(), - ParentName); + E->getInnermostCapturedStmt()->getCapturedStmt(), ParentName); return; } |