@@ -747,105 +747,85 @@ void clang::getOpenMPCaptureRegions(
747
747
assert (unsigned (DKind) < llvm::omp::Directive_enumSize);
748
748
assert (isOpenMPCapturingDirective (DKind) && " Expecting capturing directive" );
749
749
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)
844
822
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" );
849
829
}
850
830
851
831
bool clang::checkFailClauseParameter (OpenMPClauseKind FailClauseParameter) {
0 commit comments