summaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2019-04-16 15:39:12 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2019-04-16 15:39:12 +0000
commit49e3eaedc344ee619c2895ce81ed70809f96b55c (patch)
tree28192b5d6ef5fa993818f633ed9dc31955cef7ed /lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp
parent2201cc83eb9f6c7f2deb6010ed19a7e216e28681 (diff)
[OPENMP][NVPTX]Run combined constructs with if clause in SPMD mode.
Combined constructs with parallel and if clauses without modifiers may be executed in SPMD mode since if the condition is true for the target region, it is also true for parallel region and the threads must be run in parallel. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@358503 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp')
-rw-r--r--lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp14
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp b/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp
index 1ca9cd0549..0085b01458 100644
--- a/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp
+++ b/lib/CodeGen/CGOpenMPRuntimeNVPTX.cpp
@@ -717,10 +717,12 @@ getDataSharingMode(CodeGenModule &CGM) {
/// Check if the parallel directive has an 'if' clause with non-constant or
/// false condition.
static bool hasParallelIfClause(ASTContext &Ctx,
- const OMPExecutableDirective &D) {
+ const OMPExecutableDirective &D,
+ bool StandaloneParallel) {
for (const auto *C : D.getClausesOfKind<OMPIfClause>()) {
OpenMPDirectiveKind NameModifier = C->getNameModifier();
- if (NameModifier != OMPD_parallel && NameModifier != OMPD_unknown)
+ if (NameModifier != OMPD_parallel &&
+ (!StandaloneParallel || NameModifier != OMPD_unknown))
continue;
const Expr *Cond = C->getCondition();
bool Result;
@@ -744,7 +746,7 @@ static bool hasNestedSPMDDirective(ASTContext &Ctx,
switch (D.getDirectiveKind()) {
case OMPD_target:
if (isOpenMPParallelDirective(DKind) &&
- !hasParallelIfClause(Ctx, *NestedDir))
+ !hasParallelIfClause(Ctx, *NestedDir, /*StandaloneParallel=*/true))
return true;
if (DKind == OMPD_teams) {
Body = NestedDir->getInnermostCapturedStmt()->IgnoreContainers(
@@ -756,14 +758,14 @@ static bool hasNestedSPMDDirective(ASTContext &Ctx,
dyn_cast_or_null<OMPExecutableDirective>(ChildStmt)) {
DKind = NND->getDirectiveKind();
if (isOpenMPParallelDirective(DKind) &&
- !hasParallelIfClause(Ctx, *NND))
+ !hasParallelIfClause(Ctx, *NND, /*StandaloneParallel=*/true))
return true;
}
}
return false;
case OMPD_target_teams:
return isOpenMPParallelDirective(DKind) &&
- !hasParallelIfClause(Ctx, *NestedDir);
+ !hasParallelIfClause(Ctx, *NestedDir, /*StandaloneParallel=*/true);
case OMPD_target_simd:
case OMPD_target_parallel:
case OMPD_target_parallel_for:
@@ -837,7 +839,7 @@ static bool supportsSPMDExecutionMode(ASTContext &Ctx,
case OMPD_target_parallel_for_simd:
case OMPD_target_teams_distribute_parallel_for:
case OMPD_target_teams_distribute_parallel_for_simd:
- return !hasParallelIfClause(Ctx, D);
+ return !hasParallelIfClause(Ctx, D, /*StandaloneParallel=*/false);
case OMPD_target_simd:
case OMPD_target_teams_distribute:
case OMPD_target_teams_distribute_simd: