|
@@ -2394,6 +2394,8 @@ StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S,
|
|
return StmtError();
|
|
return StmtError();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ SmallVector<OpenMPDirectiveKind, 4> CaptureRegions;
|
|
|
|
+ getOpenMPCaptureRegions(CaptureRegions, DSAStack->getCurrentDirective());
|
|
OMPOrderedClause *OC = nullptr;
|
|
OMPOrderedClause *OC = nullptr;
|
|
OMPScheduleClause *SC = nullptr;
|
|
OMPScheduleClause *SC = nullptr;
|
|
SmallVector<OMPLinearClause *, 4> LCs;
|
|
SmallVector<OMPLinearClause *, 4> LCs;
|
|
@@ -2422,7 +2424,8 @@ StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
DSAStack->setForceVarCapturing(/*V=*/false);
|
|
DSAStack->setForceVarCapturing(/*V=*/false);
|
|
- } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective())) {
|
|
|
|
|
|
+ } else if (CaptureRegions.size() > 1 ||
|
|
|
|
+ CaptureRegions.back() != OMPD_unknown) {
|
|
if (auto *C = OMPClauseWithPreInit::get(Clause))
|
|
if (auto *C = OMPClauseWithPreInit::get(Clause))
|
|
PICs.push_back(C);
|
|
PICs.push_back(C);
|
|
if (auto *C = OMPClauseWithPostUpdate::get(Clause)) {
|
|
if (auto *C = OMPClauseWithPostUpdate::get(Clause)) {
|
|
@@ -2470,13 +2473,11 @@ StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S,
|
|
return StmtError();
|
|
return StmtError();
|
|
}
|
|
}
|
|
StmtResult SR = S;
|
|
StmtResult SR = S;
|
|
- SmallVector<OpenMPDirectiveKind, 4> CaptureRegions;
|
|
|
|
- getOpenMPCaptureRegions(CaptureRegions, DSAStack->getCurrentDirective());
|
|
|
|
- for (auto ThisCaptureRegion : llvm::reverse(CaptureRegions)) {
|
|
|
|
|
|
+ for (OpenMPDirectiveKind ThisCaptureRegion : llvm::reverse(CaptureRegions)) {
|
|
// Mark all variables in private list clauses as used in inner region.
|
|
// Mark all variables in private list clauses as used in inner region.
|
|
// Required for proper codegen of combined directives.
|
|
// Required for proper codegen of combined directives.
|
|
// TODO: add processing for other clauses.
|
|
// TODO: add processing for other clauses.
|
|
- if (isParallelOrTaskRegion(DSAStack->getCurrentDirective())) {
|
|
|
|
|
|
+ if (ThisCaptureRegion != OMPD_unknown) {
|
|
for (auto *C : PICs) {
|
|
for (auto *C : PICs) {
|
|
OpenMPDirectiveKind CaptureRegion = C->getCaptureRegion();
|
|
OpenMPDirectiveKind CaptureRegion = C->getCaptureRegion();
|
|
// Find the particular capture region for the clause if the
|
|
// Find the particular capture region for the clause if the
|
|
@@ -7533,19 +7534,21 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
OpenMPDirectiveKind DKind, OpenMPClauseKind CKind,
|
|
OpenMPDirectiveKind DKind, OpenMPClauseKind CKind,
|
|
OpenMPDirectiveKind NameModifier = OMPD_unknown) {
|
|
OpenMPDirectiveKind NameModifier = OMPD_unknown) {
|
|
OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
|
|
OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
|
|
-
|
|
|
|
switch (CKind) {
|
|
switch (CKind) {
|
|
case OMPC_if:
|
|
case OMPC_if:
|
|
switch (DKind) {
|
|
switch (DKind) {
|
|
case OMPD_target_parallel:
|
|
case OMPD_target_parallel:
|
|
case OMPD_target_parallel_for:
|
|
case OMPD_target_parallel_for:
|
|
case OMPD_target_parallel_for_simd:
|
|
case OMPD_target_parallel_for_simd:
|
|
|
|
+ case OMPD_target_teams_distribute_parallel_for:
|
|
|
|
+ case OMPD_target_teams_distribute_parallel_for_simd:
|
|
// If this clause applies to the nested 'parallel' region, capture within
|
|
// If this clause applies to the nested 'parallel' region, capture within
|
|
// the 'target' region, otherwise do not capture.
|
|
// the 'target' region, otherwise do not capture.
|
|
if (NameModifier == OMPD_unknown || NameModifier == OMPD_parallel)
|
|
if (NameModifier == OMPD_unknown || NameModifier == OMPD_parallel)
|
|
CaptureRegion = OMPD_target;
|
|
CaptureRegion = OMPD_target;
|
|
break;
|
|
break;
|
|
case OMPD_teams_distribute_parallel_for:
|
|
case OMPD_teams_distribute_parallel_for:
|
|
|
|
+ case OMPD_teams_distribute_parallel_for_simd:
|
|
CaptureRegion = OMPD_teams;
|
|
CaptureRegion = OMPD_teams;
|
|
break;
|
|
break;
|
|
case OMPD_cancel:
|
|
case OMPD_cancel:
|
|
@@ -7558,9 +7561,6 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
case OMPD_target_teams:
|
|
case OMPD_target_teams:
|
|
case OMPD_target_teams_distribute:
|
|
case OMPD_target_teams_distribute:
|
|
case OMPD_target_teams_distribute_simd:
|
|
case OMPD_target_teams_distribute_simd:
|
|
- case OMPD_target_teams_distribute_parallel_for:
|
|
|
|
- case OMPD_target_teams_distribute_parallel_for_simd:
|
|
|
|
- case OMPD_teams_distribute_parallel_for_simd:
|
|
|
|
case OMPD_distribute_parallel_for:
|
|
case OMPD_distribute_parallel_for:
|
|
case OMPD_distribute_parallel_for_simd:
|
|
case OMPD_distribute_parallel_for_simd:
|
|
case OMPD_task:
|
|
case OMPD_task:
|
|
@@ -7608,35 +7608,35 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
case OMPD_target_parallel:
|
|
case OMPD_target_parallel:
|
|
case OMPD_target_parallel_for:
|
|
case OMPD_target_parallel_for:
|
|
case OMPD_target_parallel_for_simd:
|
|
case OMPD_target_parallel_for_simd:
|
|
|
|
+ case OMPD_target_teams_distribute_parallel_for:
|
|
|
|
+ case OMPD_target_teams_distribute_parallel_for_simd:
|
|
CaptureRegion = OMPD_target;
|
|
CaptureRegion = OMPD_target;
|
|
break;
|
|
break;
|
|
case OMPD_teams_distribute_parallel_for:
|
|
case OMPD_teams_distribute_parallel_for:
|
|
|
|
+ case OMPD_teams_distribute_parallel_for_simd:
|
|
CaptureRegion = OMPD_teams;
|
|
CaptureRegion = OMPD_teams;
|
|
break;
|
|
break;
|
|
- case OMPD_cancel:
|
|
|
|
case OMPD_parallel:
|
|
case OMPD_parallel:
|
|
case OMPD_parallel_sections:
|
|
case OMPD_parallel_sections:
|
|
case OMPD_parallel_for:
|
|
case OMPD_parallel_for:
|
|
case OMPD_parallel_for_simd:
|
|
case OMPD_parallel_for_simd:
|
|
|
|
+ case OMPD_distribute_parallel_for:
|
|
|
|
+ case OMPD_distribute_parallel_for_simd:
|
|
|
|
+ // Do not capture num_threads-clause expressions.
|
|
|
|
+ break;
|
|
|
|
+ case OMPD_target_data:
|
|
|
|
+ case OMPD_target_enter_data:
|
|
|
|
+ case OMPD_target_exit_data:
|
|
|
|
+ case OMPD_target_update:
|
|
case OMPD_target:
|
|
case OMPD_target:
|
|
case OMPD_target_simd:
|
|
case OMPD_target_simd:
|
|
case OMPD_target_teams:
|
|
case OMPD_target_teams:
|
|
case OMPD_target_teams_distribute:
|
|
case OMPD_target_teams_distribute:
|
|
case OMPD_target_teams_distribute_simd:
|
|
case OMPD_target_teams_distribute_simd:
|
|
- case OMPD_target_teams_distribute_parallel_for:
|
|
|
|
- case OMPD_target_teams_distribute_parallel_for_simd:
|
|
|
|
- case OMPD_teams_distribute_parallel_for_simd:
|
|
|
|
- case OMPD_distribute_parallel_for:
|
|
|
|
- case OMPD_distribute_parallel_for_simd:
|
|
|
|
|
|
+ case OMPD_cancel:
|
|
case OMPD_task:
|
|
case OMPD_task:
|
|
case OMPD_taskloop:
|
|
case OMPD_taskloop:
|
|
case OMPD_taskloop_simd:
|
|
case OMPD_taskloop_simd:
|
|
- case OMPD_target_data:
|
|
|
|
- case OMPD_target_enter_data:
|
|
|
|
- case OMPD_target_exit_data:
|
|
|
|
- case OMPD_target_update:
|
|
|
|
- // Do not capture num_threads-clause expressions.
|
|
|
|
- break;
|
|
|
|
case OMPD_threadprivate:
|
|
case OMPD_threadprivate:
|
|
case OMPD_taskyield:
|
|
case OMPD_taskyield:
|
|
case OMPD_barrier:
|
|
case OMPD_barrier:
|
|
@@ -7671,24 +7671,19 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
case OMPC_num_teams:
|
|
case OMPC_num_teams:
|
|
switch (DKind) {
|
|
switch (DKind) {
|
|
case OMPD_target_teams:
|
|
case OMPD_target_teams:
|
|
- CaptureRegion = OMPD_target;
|
|
|
|
- break;
|
|
|
|
- case OMPD_cancel:
|
|
|
|
- case OMPD_parallel:
|
|
|
|
- case OMPD_parallel_sections:
|
|
|
|
- case OMPD_parallel_for:
|
|
|
|
- case OMPD_parallel_for_simd:
|
|
|
|
- case OMPD_target:
|
|
|
|
- case OMPD_target_simd:
|
|
|
|
- case OMPD_target_parallel:
|
|
|
|
- case OMPD_target_parallel_for:
|
|
|
|
- case OMPD_target_parallel_for_simd:
|
|
|
|
case OMPD_target_teams_distribute:
|
|
case OMPD_target_teams_distribute:
|
|
case OMPD_target_teams_distribute_simd:
|
|
case OMPD_target_teams_distribute_simd:
|
|
case OMPD_target_teams_distribute_parallel_for:
|
|
case OMPD_target_teams_distribute_parallel_for:
|
|
case OMPD_target_teams_distribute_parallel_for_simd:
|
|
case OMPD_target_teams_distribute_parallel_for_simd:
|
|
|
|
+ CaptureRegion = OMPD_target;
|
|
|
|
+ break;
|
|
case OMPD_teams_distribute_parallel_for:
|
|
case OMPD_teams_distribute_parallel_for:
|
|
case OMPD_teams_distribute_parallel_for_simd:
|
|
case OMPD_teams_distribute_parallel_for_simd:
|
|
|
|
+ case OMPD_teams:
|
|
|
|
+ case OMPD_teams_distribute:
|
|
|
|
+ case OMPD_teams_distribute_simd:
|
|
|
|
+ // Do not capture num_teams-clause expressions.
|
|
|
|
+ break;
|
|
case OMPD_distribute_parallel_for:
|
|
case OMPD_distribute_parallel_for:
|
|
case OMPD_distribute_parallel_for_simd:
|
|
case OMPD_distribute_parallel_for_simd:
|
|
case OMPD_task:
|
|
case OMPD_task:
|
|
@@ -7698,11 +7693,16 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
case OMPD_target_enter_data:
|
|
case OMPD_target_enter_data:
|
|
case OMPD_target_exit_data:
|
|
case OMPD_target_exit_data:
|
|
case OMPD_target_update:
|
|
case OMPD_target_update:
|
|
- case OMPD_teams:
|
|
|
|
- case OMPD_teams_distribute:
|
|
|
|
- case OMPD_teams_distribute_simd:
|
|
|
|
- // Do not capture num_teams-clause expressions.
|
|
|
|
- break;
|
|
|
|
|
|
+ case OMPD_cancel:
|
|
|
|
+ case OMPD_parallel:
|
|
|
|
+ case OMPD_parallel_sections:
|
|
|
|
+ case OMPD_parallel_for:
|
|
|
|
+ case OMPD_parallel_for_simd:
|
|
|
|
+ case OMPD_target:
|
|
|
|
+ case OMPD_target_simd:
|
|
|
|
+ case OMPD_target_parallel:
|
|
|
|
+ case OMPD_target_parallel_for:
|
|
|
|
+ case OMPD_target_parallel_for_simd:
|
|
case OMPD_threadprivate:
|
|
case OMPD_threadprivate:
|
|
case OMPD_taskyield:
|
|
case OMPD_taskyield:
|
|
case OMPD_barrier:
|
|
case OMPD_barrier:
|
|
@@ -7734,24 +7734,19 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
case OMPC_thread_limit:
|
|
case OMPC_thread_limit:
|
|
switch (DKind) {
|
|
switch (DKind) {
|
|
case OMPD_target_teams:
|
|
case OMPD_target_teams:
|
|
- CaptureRegion = OMPD_target;
|
|
|
|
- break;
|
|
|
|
- case OMPD_cancel:
|
|
|
|
- case OMPD_parallel:
|
|
|
|
- case OMPD_parallel_sections:
|
|
|
|
- case OMPD_parallel_for:
|
|
|
|
- case OMPD_parallel_for_simd:
|
|
|
|
- case OMPD_target:
|
|
|
|
- case OMPD_target_simd:
|
|
|
|
- case OMPD_target_parallel:
|
|
|
|
- case OMPD_target_parallel_for:
|
|
|
|
- case OMPD_target_parallel_for_simd:
|
|
|
|
case OMPD_target_teams_distribute:
|
|
case OMPD_target_teams_distribute:
|
|
case OMPD_target_teams_distribute_simd:
|
|
case OMPD_target_teams_distribute_simd:
|
|
case OMPD_target_teams_distribute_parallel_for:
|
|
case OMPD_target_teams_distribute_parallel_for:
|
|
case OMPD_target_teams_distribute_parallel_for_simd:
|
|
case OMPD_target_teams_distribute_parallel_for_simd:
|
|
|
|
+ CaptureRegion = OMPD_target;
|
|
|
|
+ break;
|
|
case OMPD_teams_distribute_parallel_for:
|
|
case OMPD_teams_distribute_parallel_for:
|
|
case OMPD_teams_distribute_parallel_for_simd:
|
|
case OMPD_teams_distribute_parallel_for_simd:
|
|
|
|
+ case OMPD_teams:
|
|
|
|
+ case OMPD_teams_distribute:
|
|
|
|
+ case OMPD_teams_distribute_simd:
|
|
|
|
+ // Do not capture thread_limit-clause expressions.
|
|
|
|
+ break;
|
|
case OMPD_distribute_parallel_for:
|
|
case OMPD_distribute_parallel_for:
|
|
case OMPD_distribute_parallel_for_simd:
|
|
case OMPD_distribute_parallel_for_simd:
|
|
case OMPD_task:
|
|
case OMPD_task:
|
|
@@ -7761,11 +7756,16 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
case OMPD_target_enter_data:
|
|
case OMPD_target_enter_data:
|
|
case OMPD_target_exit_data:
|
|
case OMPD_target_exit_data:
|
|
case OMPD_target_update:
|
|
case OMPD_target_update:
|
|
- case OMPD_teams:
|
|
|
|
- case OMPD_teams_distribute:
|
|
|
|
- case OMPD_teams_distribute_simd:
|
|
|
|
- // Do not capture thread_limit-clause expressions.
|
|
|
|
- break;
|
|
|
|
|
|
+ case OMPD_cancel:
|
|
|
|
+ case OMPD_parallel:
|
|
|
|
+ case OMPD_parallel_sections:
|
|
|
|
+ case OMPD_parallel_for:
|
|
|
|
+ case OMPD_parallel_for_simd:
|
|
|
|
+ case OMPD_target:
|
|
|
|
+ case OMPD_target_simd:
|
|
|
|
+ case OMPD_target_parallel:
|
|
|
|
+ case OMPD_target_parallel_for:
|
|
|
|
+ case OMPD_target_parallel_for_simd:
|
|
case OMPD_threadprivate:
|
|
case OMPD_threadprivate:
|
|
case OMPD_taskyield:
|
|
case OMPD_taskyield:
|
|
case OMPD_barrier:
|
|
case OMPD_barrier:
|
|
@@ -7798,21 +7798,23 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
switch (DKind) {
|
|
switch (DKind) {
|
|
case OMPD_target_parallel_for:
|
|
case OMPD_target_parallel_for:
|
|
case OMPD_target_parallel_for_simd:
|
|
case OMPD_target_parallel_for_simd:
|
|
|
|
+ case OMPD_target_teams_distribute_parallel_for:
|
|
|
|
+ case OMPD_target_teams_distribute_parallel_for_simd:
|
|
CaptureRegion = OMPD_target;
|
|
CaptureRegion = OMPD_target;
|
|
break;
|
|
break;
|
|
case OMPD_teams_distribute_parallel_for:
|
|
case OMPD_teams_distribute_parallel_for:
|
|
|
|
+ case OMPD_teams_distribute_parallel_for_simd:
|
|
CaptureRegion = OMPD_teams;
|
|
CaptureRegion = OMPD_teams;
|
|
break;
|
|
break;
|
|
|
|
+ case OMPD_parallel_for:
|
|
|
|
+ case OMPD_parallel_for_simd:
|
|
case OMPD_distribute_parallel_for:
|
|
case OMPD_distribute_parallel_for:
|
|
case OMPD_distribute_parallel_for_simd:
|
|
case OMPD_distribute_parallel_for_simd:
|
|
CaptureRegion = OMPD_parallel;
|
|
CaptureRegion = OMPD_parallel;
|
|
break;
|
|
break;
|
|
- case OMPD_parallel_for:
|
|
|
|
- case OMPD_parallel_for_simd:
|
|
|
|
- case OMPD_target_teams_distribute_parallel_for:
|
|
|
|
- case OMPD_target_teams_distribute_parallel_for_simd:
|
|
|
|
- case OMPD_teams_distribute_parallel_for_simd:
|
|
|
|
- // Do not capture schedule clause expressions.
|
|
|
|
|
|
+ case OMPD_for:
|
|
|
|
+ case OMPD_for_simd:
|
|
|
|
+ // Do not capture schedule-clause expressions.
|
|
break;
|
|
break;
|
|
case OMPD_task:
|
|
case OMPD_task:
|
|
case OMPD_taskloop:
|
|
case OMPD_taskloop:
|
|
@@ -7843,8 +7845,6 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
case OMPD_declare_target:
|
|
case OMPD_declare_target:
|
|
case OMPD_end_declare_target:
|
|
case OMPD_end_declare_target:
|
|
case OMPD_simd:
|
|
case OMPD_simd:
|
|
- case OMPD_for:
|
|
|
|
- case OMPD_for_simd:
|
|
|
|
case OMPD_sections:
|
|
case OMPD_sections:
|
|
case OMPD_section:
|
|
case OMPD_section:
|
|
case OMPD_single:
|
|
case OMPD_single:
|
|
@@ -7864,17 +7864,22 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
case OMPC_dist_schedule:
|
|
case OMPC_dist_schedule:
|
|
switch (DKind) {
|
|
switch (DKind) {
|
|
case OMPD_teams_distribute_parallel_for:
|
|
case OMPD_teams_distribute_parallel_for:
|
|
|
|
+ case OMPD_teams_distribute_parallel_for_simd:
|
|
|
|
+ case OMPD_teams_distribute:
|
|
|
|
+ case OMPD_teams_distribute_simd:
|
|
CaptureRegion = OMPD_teams;
|
|
CaptureRegion = OMPD_teams;
|
|
break;
|
|
break;
|
|
case OMPD_target_teams_distribute_parallel_for:
|
|
case OMPD_target_teams_distribute_parallel_for:
|
|
case OMPD_target_teams_distribute_parallel_for_simd:
|
|
case OMPD_target_teams_distribute_parallel_for_simd:
|
|
- case OMPD_teams_distribute_parallel_for_simd:
|
|
|
|
- case OMPD_distribute_parallel_for:
|
|
|
|
- case OMPD_distribute_parallel_for_simd:
|
|
|
|
- case OMPD_teams_distribute:
|
|
|
|
- case OMPD_teams_distribute_simd:
|
|
|
|
case OMPD_target_teams_distribute:
|
|
case OMPD_target_teams_distribute:
|
|
case OMPD_target_teams_distribute_simd:
|
|
case OMPD_target_teams_distribute_simd:
|
|
|
|
+ CaptureRegion = OMPD_target;
|
|
|
|
+ break;
|
|
|
|
+ case OMPD_distribute_parallel_for:
|
|
|
|
+ case OMPD_distribute_parallel_for_simd:
|
|
|
|
+ CaptureRegion = OMPD_parallel;
|
|
|
|
+ break;
|
|
|
|
+ case OMPD_distribute:
|
|
case OMPD_distribute_simd:
|
|
case OMPD_distribute_simd:
|
|
// Do not capture thread_limit-clause expressions.
|
|
// Do not capture thread_limit-clause expressions.
|
|
break;
|
|
break;
|
|
@@ -7915,7 +7920,6 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
case OMPD_master:
|
|
case OMPD_master:
|
|
case OMPD_critical:
|
|
case OMPD_critical:
|
|
case OMPD_taskgroup:
|
|
case OMPD_taskgroup:
|
|
- case OMPD_distribute:
|
|
|
|
case OMPD_ordered:
|
|
case OMPD_ordered:
|
|
case OMPD_atomic:
|
|
case OMPD_atomic:
|
|
case OMPD_target_teams:
|
|
case OMPD_target_teams:
|
|
@@ -7924,6 +7928,67 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
llvm_unreachable("Unknown OpenMP directive");
|
|
llvm_unreachable("Unknown OpenMP directive");
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
|
|
+ case OMPC_device:
|
|
|
|
+ switch (DKind) {
|
|
|
|
+ case OMPD_target_teams:
|
|
|
|
+ case OMPD_target_teams_distribute:
|
|
|
|
+ case OMPD_target_teams_distribute_simd:
|
|
|
|
+ case OMPD_target_teams_distribute_parallel_for:
|
|
|
|
+ case OMPD_target_teams_distribute_parallel_for_simd:
|
|
|
|
+ case OMPD_target_data:
|
|
|
|
+ case OMPD_target_enter_data:
|
|
|
|
+ case OMPD_target_exit_data:
|
|
|
|
+ case OMPD_target_update:
|
|
|
|
+ case OMPD_target:
|
|
|
|
+ case OMPD_target_simd:
|
|
|
|
+ case OMPD_target_parallel:
|
|
|
|
+ case OMPD_target_parallel_for:
|
|
|
|
+ case OMPD_target_parallel_for_simd:
|
|
|
|
+ // Do not capture device-clause expressions.
|
|
|
|
+ break;
|
|
|
|
+ case OMPD_teams_distribute_parallel_for:
|
|
|
|
+ case OMPD_teams_distribute_parallel_for_simd:
|
|
|
|
+ case OMPD_teams:
|
|
|
|
+ case OMPD_teams_distribute:
|
|
|
|
+ case OMPD_teams_distribute_simd:
|
|
|
|
+ case OMPD_distribute_parallel_for:
|
|
|
|
+ case OMPD_distribute_parallel_for_simd:
|
|
|
|
+ case OMPD_task:
|
|
|
|
+ case OMPD_taskloop:
|
|
|
|
+ case OMPD_taskloop_simd:
|
|
|
|
+ case OMPD_cancel:
|
|
|
|
+ case OMPD_parallel:
|
|
|
|
+ case OMPD_parallel_sections:
|
|
|
|
+ case OMPD_parallel_for:
|
|
|
|
+ case OMPD_parallel_for_simd:
|
|
|
|
+ case OMPD_threadprivate:
|
|
|
|
+ case OMPD_taskyield:
|
|
|
|
+ case OMPD_barrier:
|
|
|
|
+ case OMPD_taskwait:
|
|
|
|
+ case OMPD_cancellation_point:
|
|
|
|
+ case OMPD_flush:
|
|
|
|
+ case OMPD_declare_reduction:
|
|
|
|
+ case OMPD_declare_simd:
|
|
|
|
+ case OMPD_declare_target:
|
|
|
|
+ case OMPD_end_declare_target:
|
|
|
|
+ case OMPD_simd:
|
|
|
|
+ case OMPD_for:
|
|
|
|
+ case OMPD_for_simd:
|
|
|
|
+ case OMPD_sections:
|
|
|
|
+ case OMPD_section:
|
|
|
|
+ case OMPD_single:
|
|
|
|
+ case OMPD_master:
|
|
|
|
+ case OMPD_critical:
|
|
|
|
+ case OMPD_taskgroup:
|
|
|
|
+ case OMPD_distribute:
|
|
|
|
+ case OMPD_ordered:
|
|
|
|
+ case OMPD_atomic:
|
|
|
|
+ case OMPD_distribute_simd:
|
|
|
|
+ llvm_unreachable("Unexpected OpenMP directive with num_teams-clause");
|
|
|
|
+ case OMPD_unknown:
|
|
|
|
+ llvm_unreachable("Unknown OpenMP directive");
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
case OMPC_firstprivate:
|
|
case OMPC_firstprivate:
|
|
case OMPC_lastprivate:
|
|
case OMPC_lastprivate:
|
|
case OMPC_reduction:
|
|
case OMPC_reduction:
|
|
@@ -7953,7 +8018,6 @@ static OpenMPDirectiveKind getOpenMPCaptureRegionForClause(
|
|
case OMPC_capture:
|
|
case OMPC_capture:
|
|
case OMPC_seq_cst:
|
|
case OMPC_seq_cst:
|
|
case OMPC_depend:
|
|
case OMPC_depend:
|
|
- case OMPC_device:
|
|
|
|
case OMPC_threads:
|
|
case OMPC_threads:
|
|
case OMPC_simd:
|
|
case OMPC_simd:
|
|
case OMPC_map:
|
|
case OMPC_map:
|
|
@@ -7995,7 +8059,7 @@ OMPClause *Sema::ActOnOpenMPIfClause(OpenMPDirectiveKind NameModifier,
|
|
OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
|
|
OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
|
|
CaptureRegion =
|
|
CaptureRegion =
|
|
getOpenMPCaptureRegionForClause(DKind, OMPC_if, NameModifier);
|
|
getOpenMPCaptureRegionForClause(DKind, OMPC_if, NameModifier);
|
|
- if (CaptureRegion != OMPD_unknown) {
|
|
|
|
|
|
+ if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
HelperValStmt = buildPreInits(Context, Captures);
|
|
HelperValStmt = buildPreInits(Context, Captures);
|
|
@@ -8101,7 +8165,6 @@ OMPClause *Sema::ActOnOpenMPNumThreadsClause(Expr *NumThreads,
|
|
SourceLocation EndLoc) {
|
|
SourceLocation EndLoc) {
|
|
Expr *ValExpr = NumThreads;
|
|
Expr *ValExpr = NumThreads;
|
|
Stmt *HelperValStmt = nullptr;
|
|
Stmt *HelperValStmt = nullptr;
|
|
- OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
|
|
|
|
|
|
|
|
// OpenMP [2.5, Restrictions]
|
|
// OpenMP [2.5, Restrictions]
|
|
// The num_threads expression must evaluate to a positive integer value.
|
|
// The num_threads expression must evaluate to a positive integer value.
|
|
@@ -8110,8 +8173,9 @@ OMPClause *Sema::ActOnOpenMPNumThreadsClause(Expr *NumThreads,
|
|
return nullptr;
|
|
return nullptr;
|
|
|
|
|
|
OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
|
|
OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
|
|
- CaptureRegion = getOpenMPCaptureRegionForClause(DKind, OMPC_num_threads);
|
|
|
|
- if (CaptureRegion != OMPD_unknown) {
|
|
|
|
|
|
+ OpenMPDirectiveKind CaptureRegion =
|
|
|
|
+ getOpenMPCaptureRegionForClause(DKind, OMPC_num_threads);
|
|
|
|
+ if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
HelperValStmt = buildPreInits(Context, Captures);
|
|
HelperValStmt = buildPreInits(Context, Captures);
|
|
@@ -8535,7 +8599,9 @@ OMPClause *Sema::ActOnOpenMPScheduleClause(
|
|
<< "schedule" << 1 << ChunkSize->getSourceRange();
|
|
<< "schedule" << 1 << ChunkSize->getSourceRange();
|
|
return nullptr;
|
|
return nullptr;
|
|
}
|
|
}
|
|
- } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective()) &&
|
|
|
|
|
|
+ } else if (getOpenMPCaptureRegionForClause(
|
|
|
|
+ DSAStack->getCurrentDirective(), OMPC_schedule) !=
|
|
|
|
+ OMPD_unknown &&
|
|
!CurContext->isDependentContext()) {
|
|
!CurContext->isDependentContext()) {
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
@@ -11214,8 +11280,9 @@ OMPClause *Sema::ActOnOpenMPDeviceClause(Expr *Device, SourceLocation StartLoc,
|
|
return nullptr;
|
|
return nullptr;
|
|
|
|
|
|
OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
|
|
OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
|
|
- if (isOpenMPTargetExecutionDirective(DKind) &&
|
|
|
|
- !CurContext->isDependentContext()) {
|
|
|
|
|
|
+ OpenMPDirectiveKind CaptureRegion =
|
|
|
|
+ getOpenMPCaptureRegionForClause(DKind, OMPC_device);
|
|
|
|
+ if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
HelperValStmt = buildPreInits(Context, Captures);
|
|
HelperValStmt = buildPreInits(Context, Captures);
|
|
@@ -12222,7 +12289,6 @@ OMPClause *Sema::ActOnOpenMPNumTeamsClause(Expr *NumTeams,
|
|
SourceLocation EndLoc) {
|
|
SourceLocation EndLoc) {
|
|
Expr *ValExpr = NumTeams;
|
|
Expr *ValExpr = NumTeams;
|
|
Stmt *HelperValStmt = nullptr;
|
|
Stmt *HelperValStmt = nullptr;
|
|
- OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
|
|
|
|
|
|
|
|
// OpenMP [teams Constrcut, Restrictions]
|
|
// OpenMP [teams Constrcut, Restrictions]
|
|
// The num_teams expression must evaluate to a positive integer value.
|
|
// The num_teams expression must evaluate to a positive integer value.
|
|
@@ -12231,8 +12297,9 @@ OMPClause *Sema::ActOnOpenMPNumTeamsClause(Expr *NumTeams,
|
|
return nullptr;
|
|
return nullptr;
|
|
|
|
|
|
OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
|
|
OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
|
|
- CaptureRegion = getOpenMPCaptureRegionForClause(DKind, OMPC_num_teams);
|
|
|
|
- if (CaptureRegion != OMPD_unknown) {
|
|
|
|
|
|
+ OpenMPDirectiveKind CaptureRegion =
|
|
|
|
+ getOpenMPCaptureRegionForClause(DKind, OMPC_num_teams);
|
|
|
|
+ if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
HelperValStmt = buildPreInits(Context, Captures);
|
|
HelperValStmt = buildPreInits(Context, Captures);
|
|
@@ -12248,7 +12315,6 @@ OMPClause *Sema::ActOnOpenMPThreadLimitClause(Expr *ThreadLimit,
|
|
SourceLocation EndLoc) {
|
|
SourceLocation EndLoc) {
|
|
Expr *ValExpr = ThreadLimit;
|
|
Expr *ValExpr = ThreadLimit;
|
|
Stmt *HelperValStmt = nullptr;
|
|
Stmt *HelperValStmt = nullptr;
|
|
- OpenMPDirectiveKind CaptureRegion = OMPD_unknown;
|
|
|
|
|
|
|
|
// OpenMP [teams Constrcut, Restrictions]
|
|
// OpenMP [teams Constrcut, Restrictions]
|
|
// The thread_limit expression must evaluate to a positive integer value.
|
|
// The thread_limit expression must evaluate to a positive integer value.
|
|
@@ -12257,8 +12323,9 @@ OMPClause *Sema::ActOnOpenMPThreadLimitClause(Expr *ThreadLimit,
|
|
return nullptr;
|
|
return nullptr;
|
|
|
|
|
|
OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
|
|
OpenMPDirectiveKind DKind = DSAStack->getCurrentDirective();
|
|
- CaptureRegion = getOpenMPCaptureRegionForClause(DKind, OMPC_thread_limit);
|
|
|
|
- if (CaptureRegion != OMPD_unknown) {
|
|
|
|
|
|
+ OpenMPDirectiveKind CaptureRegion =
|
|
|
|
+ getOpenMPCaptureRegionForClause(DKind, OMPC_thread_limit);
|
|
|
|
+ if (CaptureRegion != OMPD_unknown && !CurContext->isDependentContext()) {
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
HelperValStmt = buildPreInits(Context, Captures);
|
|
HelperValStmt = buildPreInits(Context, Captures);
|
|
@@ -12365,7 +12432,9 @@ OMPClause *Sema::ActOnOpenMPDistScheduleClause(
|
|
<< "dist_schedule" << ChunkSize->getSourceRange();
|
|
<< "dist_schedule" << ChunkSize->getSourceRange();
|
|
return nullptr;
|
|
return nullptr;
|
|
}
|
|
}
|
|
- } else if (isParallelOrTaskRegion(DSAStack->getCurrentDirective()) &&
|
|
|
|
|
|
+ } else if (getOpenMPCaptureRegionForClause(
|
|
|
|
+ DSAStack->getCurrentDirective(), OMPC_dist_schedule) !=
|
|
|
|
+ OMPD_unknown &&
|
|
!CurContext->isDependentContext()) {
|
|
!CurContext->isDependentContext()) {
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
llvm::MapVector<Expr *, DeclRefExpr *> Captures;
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|
|
ValExpr = tryBuildCapture(*this, ValExpr, Captures).get();
|