Skip to content

Commit 9a7248a

Browse files
[clang][OpenMP] Rewrite getOpenMPCaptureRegions in terms of leafs (#97110)
Replace the switch in `getOpenMPCaptureRegions` with a loop collecting capture regions based on the constituent directives. --------- Co-authored-by: Alexey Bataev <[email protected]>
1 parent 62a967d commit 9a7248a

File tree

1 file changed

+78
-98
lines changed

1 file changed

+78
-98
lines changed

clang/lib/Basic/OpenMPKinds.cpp

Lines changed: 78 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -747,105 +747,85 @@ void clang::getOpenMPCaptureRegions(
747747
assert(unsigned(DKind) < llvm::omp::Directive_enumSize);
748748
assert(isOpenMPCapturingDirective(DKind) && "Expecting capturing directive");
749749

750-
switch (DKind) {
751-
case OMPD_metadirective:
752-
CaptureRegions.push_back(OMPD_metadirective);
753-
break;
754-
case OMPD_parallel:
755-
case OMPD_parallel_for:
756-
case OMPD_parallel_for_simd:
757-
case OMPD_parallel_master:
758-
case OMPD_parallel_masked:
759-
case OMPD_parallel_sections:
760-
case OMPD_distribute_parallel_for:
761-
case OMPD_distribute_parallel_for_simd:
762-
case OMPD_parallel_loop:
763-
CaptureRegions.push_back(OMPD_parallel);
764-
break;
765-
case OMPD_target_teams:
766-
case OMPD_target_teams_distribute:
767-
case OMPD_target_teams_distribute_simd:
768-
CaptureRegions.push_back(OMPD_task);
769-
CaptureRegions.push_back(OMPD_target);
770-
CaptureRegions.push_back(OMPD_teams);
771-
break;
772-
case OMPD_teams:
773-
case OMPD_teams_distribute:
774-
case OMPD_teams_distribute_simd:
775-
CaptureRegions.push_back(OMPD_teams);
776-
break;
777-
case OMPD_target:
778-
case OMPD_target_simd:
779-
CaptureRegions.push_back(OMPD_task);
780-
CaptureRegions.push_back(OMPD_target);
781-
break;
782-
case OMPD_teams_loop:
783-
case OMPD_teams_distribute_parallel_for:
784-
case OMPD_teams_distribute_parallel_for_simd:
785-
CaptureRegions.push_back(OMPD_teams);
786-
CaptureRegions.push_back(OMPD_parallel);
787-
break;
788-
case OMPD_target_parallel:
789-
case OMPD_target_parallel_for:
790-
case OMPD_target_parallel_for_simd:
791-
case OMPD_target_parallel_loop:
792-
CaptureRegions.push_back(OMPD_task);
793-
CaptureRegions.push_back(OMPD_target);
794-
CaptureRegions.push_back(OMPD_parallel);
795-
break;
796-
case OMPD_task:
797-
case OMPD_target_enter_data:
798-
case OMPD_target_exit_data:
799-
case OMPD_target_update:
800-
CaptureRegions.push_back(OMPD_task);
801-
break;
802-
case OMPD_taskloop:
803-
case OMPD_taskloop_simd:
804-
case OMPD_master_taskloop:
805-
case OMPD_master_taskloop_simd:
806-
case OMPD_masked_taskloop:
807-
case OMPD_masked_taskloop_simd:
808-
CaptureRegions.push_back(OMPD_taskloop);
809-
break;
810-
case OMPD_parallel_masked_taskloop:
811-
case OMPD_parallel_masked_taskloop_simd:
812-
case OMPD_parallel_master_taskloop:
813-
case OMPD_parallel_master_taskloop_simd:
814-
CaptureRegions.push_back(OMPD_parallel);
815-
CaptureRegions.push_back(OMPD_taskloop);
816-
break;
817-
case OMPD_target_teams_loop:
818-
case OMPD_target_teams_distribute_parallel_for:
819-
case OMPD_target_teams_distribute_parallel_for_simd:
820-
CaptureRegions.push_back(OMPD_task);
821-
CaptureRegions.push_back(OMPD_target);
822-
CaptureRegions.push_back(OMPD_teams);
823-
CaptureRegions.push_back(OMPD_parallel);
824-
break;
825-
case OMPD_nothing:
826-
CaptureRegions.push_back(OMPD_nothing);
827-
break;
828-
case OMPD_loop:
829-
// TODO: 'loop' may require different capture regions depending on the bind
830-
// clause or the parent directive when there is no bind clause. Use
831-
// OMPD_unknown for now.
832-
case OMPD_simd:
833-
case OMPD_for:
834-
case OMPD_for_simd:
835-
case OMPD_sections:
836-
case OMPD_single:
837-
case OMPD_taskgroup:
838-
case OMPD_distribute:
839-
case OMPD_ordered:
840-
case OMPD_target_data:
841-
case OMPD_distribute_simd:
842-
case OMPD_scope:
843-
case OMPD_dispatch:
750+
auto GetRegionsForLeaf = [&](OpenMPDirectiveKind LKind) {
751+
assert(isLeafConstruct(LKind) && "Epecting leaf directive");
752+
// Whether a leaf would require OMPD_unknown if it occured on its own.
753+
switch (LKind) {
754+
case OMPD_metadirective:
755+
CaptureRegions.push_back(OMPD_metadirective);
756+
break;
757+
case OMPD_nothing:
758+
CaptureRegions.push_back(OMPD_nothing);
759+
break;
760+
case OMPD_parallel:
761+
CaptureRegions.push_back(OMPD_parallel);
762+
break;
763+
case OMPD_target:
764+
CaptureRegions.push_back(OMPD_task);
765+
CaptureRegions.push_back(OMPD_target);
766+
break;
767+
case OMPD_task:
768+
case OMPD_target_enter_data:
769+
case OMPD_target_exit_data:
770+
case OMPD_target_update:
771+
CaptureRegions.push_back(OMPD_task);
772+
break;
773+
case OMPD_teams:
774+
CaptureRegions.push_back(OMPD_teams);
775+
break;
776+
case OMPD_taskloop:
777+
CaptureRegions.push_back(OMPD_taskloop);
778+
break;
779+
case OMPD_loop:
780+
// TODO: 'loop' may require different capture regions depending on the
781+
// bind clause or the parent directive when there is no bind clause.
782+
// If any of the directives that push regions here are parents of 'loop',
783+
// assume 'parallel'. Otherwise do nothing.
784+
if (!CaptureRegions.empty() &&
785+
!llvm::is_contained(CaptureRegions, OMPD_parallel))
786+
CaptureRegions.push_back(OMPD_parallel);
787+
else
788+
return true;
789+
break;
790+
case OMPD_dispatch:
791+
case OMPD_distribute:
792+
case OMPD_for:
793+
case OMPD_masked:
794+
case OMPD_master:
795+
case OMPD_ordered:
796+
case OMPD_scope:
797+
case OMPD_sections:
798+
case OMPD_simd:
799+
case OMPD_single:
800+
case OMPD_target_data:
801+
case OMPD_taskgroup:
802+
// These directives (when standalone) use OMPD_unknown as the region,
803+
// but when they're constituents of a compound directive, and other
804+
// leafs from that directive have specific regions, then these directives
805+
// add no additional regions.
806+
return true;
807+
default:
808+
llvm::errs() << getOpenMPDirectiveName(LKind) << '\n';
809+
llvm_unreachable("Unexpected directive");
810+
}
811+
return false;
812+
};
813+
814+
bool MayNeedUnknownRegion = false;
815+
for (OpenMPDirectiveKind L : getLeafConstructsOrSelf(DKind))
816+
MayNeedUnknownRegion |= GetRegionsForLeaf(L);
817+
818+
// We need OMPD_unknown when no regions were added, and specific leaf
819+
// constructs were present. Push a single OMPD_unknown as the capture
820+
/// region.
821+
if (CaptureRegions.empty() && MayNeedUnknownRegion)
844822
CaptureRegions.push_back(OMPD_unknown);
845-
break;
846-
default:
847-
llvm_unreachable("Unhandled OpenMP directive");
848-
}
823+
824+
// OMPD_unknown is only expected as the only region. If other regions
825+
// are present OMPD_unknown should not be present.
826+
assert((CaptureRegions[0] == OMPD_unknown ||
827+
!llvm::is_contained(CaptureRegions, OMPD_unknown)) &&
828+
"Misplaced OMPD_unknown");
849829
}
850830

851831
bool clang::checkFailClauseParameter(OpenMPClauseKind FailClauseParameter) {

0 commit comments

Comments
 (0)