llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-codegen

Author: Joseph Huber (jhuber6)

<details>
<summary>Changes</summary>

Summary:
This PR changes the handling of the emitted kernels when targeting a CPU
to be a pointer struct.

The old handling emitted a standard function prototype, this
necessitated a target specific ABI to call it because the signature
differed with the number of arguments. Instead, this PR emits a void
pointer to a naturally aligned struct, this is what APIs like `pthreads`
assert.

This allows us to remove all the complexity around launching host
kernels and just pass the argument list.


---

Patch is 30.14 MiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/186261.diff


363 Files Affected:

- (modified) clang/lib/CodeGen/CGOpenMPRuntime.cpp (+23-2) 
- (modified) clang/lib/CodeGen/CGStmtOpenMP.cpp (+235) 
- (modified) clang/lib/CodeGen/CodeGenFunction.h (+3) 
- (modified) clang/lib/Sema/SemaOpenMP.cpp (+4-4) 
- (modified) clang/test/AST/ast-dump-openmp-target-parallel-for-simd.c (+10) 
- (modified) clang/test/AST/ast-dump-openmp-target-parallel-for.c (+10) 
- (modified) clang/test/AST/ast-dump-openmp-target-parallel.c (+2) 
- (modified) clang/test/AST/ast-dump-openmp-target-simd.c (+10) 
- (modified) 
clang/test/AST/ast-dump-openmp-target-teams-distribute-parallel-for-simd.c 
(+10) 
- (modified) 
clang/test/AST/ast-dump-openmp-target-teams-distribute-parallel-for.c (+10) 
- (modified) clang/test/AST/ast-dump-openmp-target-teams-distribute-simd.c 
(+10) 
- (modified) clang/test/AST/ast-dump-openmp-target-teams-distribute.c (+10) 
- (modified) clang/test/AST/ast-dump-openmp-target-teams.c (+2) 
- (modified) clang/test/AST/ast-dump-openmp-target.c (+4-2) 
- (modified) 
clang/test/AST/ast-dump-openmp-teams-distribute-parallel-for-simd.c (+10) 
- (modified) clang/test/AST/ast-dump-openmp-teams-distribute-parallel-for.c 
(+10) 
- (modified) clang/test/AST/ast-dump-openmp-teams-distribute-simd.c (+10) 
- (modified) clang/test/AST/ast-dump-openmp-teams-distribute.c (+10) 
- (modified) clang/test/AST/ast-dump-openmp-teams.c (+2) 
- (modified) clang/test/OpenMP/amdgcn_target_codegen.cpp (+19-19) 
- (modified) clang/test/OpenMP/amdgcn_target_device_vla.cpp (+34-34) 
- (modified) clang/test/OpenMP/amdgpu_target_with_aligned_attribute.c (+4-4) 
- (modified) clang/test/OpenMP/bug59160.c (+2-2) 
- (modified) clang/test/OpenMP/bug60602.cpp (+179-163) 
- (modified) clang/test/OpenMP/constexpr_capture.cpp (+2-2) 
- (modified) clang/test/OpenMP/copy-gaps-1.cpp (+6-6) 
- (modified) clang/test/OpenMP/copy-gaps-2.cpp (+7-7) 
- (modified) clang/test/OpenMP/copy-gaps-3.cpp (+6-6) 
- (modified) clang/test/OpenMP/copy-gaps-4.cpp (+7-7) 
- (modified) clang/test/OpenMP/copy-gaps-5.cpp (+7-7) 
- (modified) clang/test/OpenMP/copy-gaps-6.cpp (+12-12) 
- (modified) clang/test/OpenMP/declare_mapper_codegen.cpp (+43-43) 
- (modified) clang/test/OpenMP/declare_target_codegen.cpp (+6-6) 
- (modified) clang/test/OpenMP/declare_target_codegen_globalization.cpp (+6-6) 
- (modified) clang/test/OpenMP/declare_target_link_codegen.cpp (+15-15) 
- (modified) clang/test/OpenMP/declare_variant_mixed_codegen.c (+2-2) 
- (modified) clang/test/OpenMP/distribute_codegen.cpp (+828-714) 
- (modified) clang/test/OpenMP/distribute_firstprivate_codegen.cpp (+337-301) 
- (modified) clang/test/OpenMP/distribute_lastprivate_codegen.cpp (+337-301) 
- (modified) clang/test/OpenMP/distribute_parallel_for_codegen.cpp (+2880-2628) 
- (modified) clang/test/OpenMP/distribute_parallel_for_firstprivate_codegen.cpp 
(+360-324) 
- (modified) clang/test/OpenMP/distribute_parallel_for_if_codegen.cpp 
(+385-291) 
- (modified) clang/test/OpenMP/distribute_parallel_for_lastprivate_codegen.cpp 
(+375-339) 
- (modified) clang/test/OpenMP/distribute_parallel_for_num_threads_codegen.cpp 
(+1200-908) 
- (modified) clang/test/OpenMP/distribute_parallel_for_private_codegen.cpp 
(+206-150) 
- (modified) clang/test/OpenMP/distribute_parallel_for_proc_bind_codegen.cpp 
(+132-93) 
- (modified) 
clang/test/OpenMP/distribute_parallel_for_reduction_task_codegen.cpp (+25-23) 
- (modified) clang/test/OpenMP/distribute_parallel_for_simd_codegen.cpp 
(+4350-4098) 
- (modified) 
clang/test/OpenMP/distribute_parallel_for_simd_firstprivate_codegen.cpp 
(+603-567) 
- (modified) clang/test/OpenMP/distribute_parallel_for_simd_if_codegen.cpp 
(+2360-1984) 
- (modified) 
clang/test/OpenMP/distribute_parallel_for_simd_lastprivate_codegen.cpp 
(+583-547) 
- (modified) 
clang/test/OpenMP/distribute_parallel_for_simd_num_threads_codegen.cpp 
(+1778-1486) 
- (modified) clang/test/OpenMP/distribute_parallel_for_simd_private_codegen.cpp 
(+392-336) 
- (modified) 
clang/test/OpenMP/distribute_parallel_for_simd_proc_bind_codegen.cpp (+204-165) 
- (modified) clang/test/OpenMP/distribute_private_codegen.cpp (+302-220) 
- (modified) clang/test/OpenMP/distribute_simd_codegen.cpp (+2150-1914) 
- (modified) clang/test/OpenMP/distribute_simd_firstprivate_codegen.cpp 
(+495-459) 
- (modified) clang/test/OpenMP/distribute_simd_lastprivate_codegen.cpp 
(+491-455) 
- (modified) clang/test/OpenMP/distribute_simd_private_codegen.cpp (+488-416) 
- (modified) clang/test/OpenMP/distribute_simd_reduction_codegen.cpp (+288-254) 
- (modified) clang/test/OpenMP/force-usm.c (+10-10) 
- (modified) clang/test/OpenMP/map_struct_ordering.cpp (+59-51) 
- (modified) clang/test/OpenMP/nvptx_SPMD_codegen.cpp (+2025-2025) 
- (modified) clang/test/OpenMP/nvptx_declare_target_var_ctor_dtor_codegen.cpp 
(+2-2) 
- (modified) 
clang/test/OpenMP/nvptx_distribute_parallel_generic_mode_codegen.cpp (+32-32) 
- (modified) clang/test/OpenMP/nvptx_lambda_capturing.cpp (+546-506) 
- (modified) clang/test/OpenMP/nvptx_lambda_pointer_capturing.cpp (+28-28) 
- (modified) clang/test/OpenMP/nvptx_nested_parallel_codegen.cpp (+12-12) 
- (modified) clang/test/OpenMP/nvptx_parallel_codegen.cpp (+22-22) 
- (modified) clang/test/OpenMP/nvptx_parallel_for_codegen.cpp (+6-6) 
- (modified) clang/test/OpenMP/nvptx_target_codegen.cpp (+66-66) 
- (modified) clang/test/OpenMP/nvptx_target_firstprivate_codegen.cpp (+12-12) 
- (modified) clang/test/OpenMP/nvptx_target_parallel_codegen.cpp (+28-28) 
- (modified) clang/test/OpenMP/nvptx_target_parallel_num_threads_codegen.cpp 
(+28-28) 
- (modified) clang/test/OpenMP/nvptx_target_parallel_proc_bind_codegen.cpp 
(+48-48) 
- (modified) clang/test/OpenMP/nvptx_target_parallel_reduction_codegen.cpp 
(+423-423) 
- (modified) clang/test/OpenMP/nvptx_target_requires_unified_shared_memory.cpp 
(+10-10) 
- (modified) clang/test/OpenMP/nvptx_target_simd_codegen.cpp (+324-324) 
- (modified) clang/test/OpenMP/nvptx_target_teams_codegen.cpp (+22-22) 
- (modified) 
clang/test/OpenMP/nvptx_target_teams_distribute_parallel_for_codegen.cpp 
(+108-108) 
- (modified) 
clang/test/OpenMP/nvptx_target_teams_distribute_parallel_for_generic_mode_codegen.cpp
 (+12-12) 
- (modified) 
clang/test/OpenMP/nvptx_target_teams_distribute_parallel_for_simd_codegen.cpp 
(+380-380) 
- (modified) clang/test/OpenMP/nvptx_target_teams_distribute_simd_codegen.cpp 
(+414-414) 
- (modified) clang/test/OpenMP/nvptx_target_teams_generic_loop_codegen.cpp 
(+99-99) 
- (modified) 
clang/test/OpenMP/nvptx_target_teams_generic_loop_generic_mode_codegen.cpp 
(+16-16) 
- (modified) clang/test/OpenMP/nvptx_target_teams_ompx_bare_codegen.cpp (+3-3) 
- (modified) clang/test/OpenMP/nvptx_teams_codegen.cpp (+32-32) 
- (modified) clang/test/OpenMP/nvptx_teams_reduction_codegen.cpp (+825-825) 
- (modified) clang/test/OpenMP/openmp_offload_codegen.cpp (+1-1) 
- (modified) clang/test/OpenMP/openmp_offload_registration.cpp (+1-1) 
- (modified) clang/test/OpenMP/reduction_implicit_map.cpp (+402-354) 
- (modified) clang/test/OpenMP/scope_codegen.cpp (+441-437) 
- (modified) clang/test/OpenMP/spirv_kernel_addrspace.cpp (+1-1) 
- (modified) clang/test/OpenMP/target_codegen.cpp (+131-131) 
- (modified) clang/test/OpenMP/target_codegen_global_capture.cpp (+507-459) 
- (modified) clang/test/OpenMP/target_codegen_registration.cpp (+24-24) 
- (modified) clang/test/OpenMP/target_data_member_codegen.cpp (+2-2) 
- (modified) clang/test/OpenMP/target_data_use_device_ptr_if_codegen.cpp (+2-2) 
- (modified) clang/test/OpenMP/target_default_codegen.cpp (+810-682) 
- (modified) clang/test/OpenMP/target_defaultmap_codegen_01.cpp (+117-117) 
- (modified) clang/test/OpenMP/target_defaultmap_codegen_02.cpp (+11-11) 
- (modified) clang/test/OpenMP/target_defaultmap_codegen_03.cpp (+385-321) 
- (modified) clang/test/OpenMP/target_depend_codegen.cpp (+33-34) 
- (modified) clang/test/OpenMP/target_device_codegen.cpp (+3-3) 
- (modified) clang/test/OpenMP/target_dyn_groupprivate_codegen.cpp (+1032-834) 
- (modified) clang/test/OpenMP/target_firstprivate_codegen.cpp (+2426-2126) 
- (modified) clang/test/OpenMP/target_firstprivate_pointer_codegen.cpp (+13-13) 
- (modified) clang/test/OpenMP/target_has_device_addr_codegen.cpp (+794-674) 
- (modified) clang/test/OpenMP/target_has_device_addr_codegen_01.cpp (+144-128) 
- (modified) clang/test/OpenMP/target_in_reduction_codegen.cpp (+4-2) 
- (modified) clang/test/OpenMP/target_is_device_ptr_codegen.cpp (+2532-2180) 
- (modified) 
clang/test/OpenMP/target_map_array_of_structs_with_nested_mapper_codegen.cpp 
(+50-42) 
- (modified) clang/test/OpenMP/target_map_array_section_no_length_codegen.cpp 
(+288-256) 
- (modified) 
clang/test/OpenMP/target_map_array_section_of_structs_with_nested_mapper_codegen.cpp
 (+48-40) 
- (modified) clang/test/OpenMP/target_map_both_pointer_pointee_codegen.cpp 
(+105-70) 
- (modified) 
clang/test/OpenMP/target_map_both_pointer_pointee_codegen_global.cpp (+105-70) 
- (modified) clang/test/OpenMP/target_map_codegen_00.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_01.cpp (+10-8) 
- (modified) clang/test/OpenMP/target_map_codegen_02.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_03.cpp (+98-82) 
- (modified) clang/test/OpenMP/target_map_codegen_04.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_05.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_06.cpp (+7-7) 
- (modified) clang/test/OpenMP/target_map_codegen_07.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_08.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_09.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_10.cpp (+6-6) 
- (modified) clang/test/OpenMP/target_map_codegen_11.cpp (+7-7) 
- (modified) clang/test/OpenMP/target_map_codegen_12.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_13.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_14.cpp (+8-8) 
- (modified) clang/test/OpenMP/target_map_codegen_15.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_16.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_17.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_18.inc (+235-235) 
- (modified) clang/test/OpenMP/target_map_codegen_19.cpp (+12-12) 
- (modified) clang/test/OpenMP/target_map_codegen_20.cpp (+31-31) 
- (modified) clang/test/OpenMP/target_map_codegen_21.cpp (+45-45) 
- (modified) clang/test/OpenMP/target_map_codegen_22.cpp (+18-18) 
- (modified) clang/test/OpenMP/target_map_codegen_23.cpp (+39-39) 
- (modified) clang/test/OpenMP/target_map_codegen_24.cpp (+8-8) 
- (modified) clang/test/OpenMP/target_map_codegen_25.cpp (+16-16) 
- (modified) clang/test/OpenMP/target_map_codegen_26.cpp (+24-24) 
- (modified) clang/test/OpenMP/target_map_codegen_27.cpp (+6-6) 
- (modified) clang/test/OpenMP/target_map_codegen_28.cpp (+9-9) 
- (modified) clang/test/OpenMP/target_map_codegen_29.cpp (+14-14) 
- (modified) clang/test/OpenMP/target_map_codegen_30.cpp (+6-6) 
- (modified) clang/test/OpenMP/target_map_codegen_31.cpp (+13-13) 
- (modified) clang/test/OpenMP/target_map_codegen_32.cpp (+8-8) 
- (modified) clang/test/OpenMP/target_map_codegen_33.cpp (+2-2) 
- (modified) clang/test/OpenMP/target_map_codegen_34.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_35.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_map_codegen_hold.cpp (+740-644) 
- (modified) clang/test/OpenMP/target_map_deref_array_codegen.cpp (+214-190) 
- (modified) clang/test/OpenMP/target_map_member_expr_codegen.cpp (+229-205) 
- (modified) clang/test/OpenMP/target_map_names.cpp (+1-1) 
- (modified) clang/test/OpenMP/target_map_names_attr.cpp (+1-1) 
- (modified) clang/test/OpenMP/target_map_pointer_defalut_mapper_codegen.cpp 
(+6-6) 
- (modified) clang/test/OpenMP/target_map_ptr_and_star_global.cpp (+82-54) 
- (modified) clang/test/OpenMP/target_map_ptr_and_star_local.cpp (+82-54) 
- (modified) clang/test/OpenMP/target_map_structptr_and_member_global.cpp 
(+114-79) 
- (modified) clang/test/OpenMP/target_map_structptr_and_member_local.cpp 
(+114-79) 
- (modified) clang/test/OpenMP/target_offload_mandatory_codegen.cpp (+120-87) 
- (modified) clang/test/OpenMP/target_ompx_dyn_cgroup_mem_codegen.cpp 
(+1030-832) 
- (modified) clang/test/OpenMP/target_parallel_codegen.cpp (+1456-1166) 
- (modified) clang/test/OpenMP/target_parallel_codegen_registration.cpp 
(+24-24) 
- (modified) clang/test/OpenMP/target_parallel_debug_codegen.cpp (+444-444) 
- (modified) clang/test/OpenMP/target_parallel_depend_codegen.cpp (+20-22) 
- (modified) clang/test/OpenMP/target_parallel_for_codegen.cpp (+2696-2350) 
- (modified) clang/test/OpenMP/target_parallel_for_codegen_registration.cpp 
(+24-24) 
- (modified) clang/test/OpenMP/target_parallel_for_debug_codegen.cpp (+613-613) 
- (modified) clang/test/OpenMP/target_parallel_for_depend_codegen.cpp (+20-21) 
- (modified) clang/test/OpenMP/target_parallel_for_reduction_task_codegen.cpp 
(+26-24) 
- (modified) clang/test/OpenMP/target_parallel_for_simd_codegen.cpp 
(+4238-3626) 
- (modified) 
clang/test/OpenMP/target_parallel_for_simd_codegen_registration.cpp (+24-24) 
- (modified) clang/test/OpenMP/target_parallel_for_simd_depend_codegen.cpp 
(+20-21) 
- (modified) clang/test/OpenMP/target_parallel_for_simd_tl_codegen.cpp (+23-21) 
- (modified) 
clang/test/OpenMP/target_parallel_for_simd_uses_allocators_codegen.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_parallel_for_tl_codegen.cpp (+16-14) 
- (modified) clang/test/OpenMP/target_parallel_for_uses_allocators_codegen.cpp 
(+4-4) 
- (modified) clang/test/OpenMP/target_parallel_generic_loop_codegen-1.cpp 
(+722-572) 
- (modified) clang/test/OpenMP/target_parallel_generic_loop_codegen-2.cpp 
(+176-128) 
- (modified) clang/test/OpenMP/target_parallel_generic_loop_codegen-3.cpp 
(+613-613) 
- (modified) clang/test/OpenMP/target_parallel_generic_loop_codegen.cpp 
(+18-14) 
- (modified) clang/test/OpenMP/target_parallel_generic_loop_depend_codegen.cpp 
(+1-81) 
- (modified) clang/test/OpenMP/target_parallel_generic_loop_tl_codegen.cpp 
(+16-14) 
- (modified) 
clang/test/OpenMP/target_parallel_generic_loop_uses_allocators_codegen.cpp 
(+49-41) 
- (modified) clang/test/OpenMP/target_parallel_if_codegen.cpp (+912-710) 
- (modified) clang/test/OpenMP/target_parallel_num_threads_codegen.cpp 
(+882-692) 
- (modified) clang/test/OpenMP/target_parallel_num_threads_strict_codegen.cpp 
(+782-594) 
- (modified) clang/test/OpenMP/target_parallel_reduction_task_codegen.cpp 
(+26-24) 
- (modified) clang/test/OpenMP/target_parallel_tl_codegen.cpp (+16-14) 
- (modified) clang/test/OpenMP/target_parallel_uses_allocators_codegen.cpp 
(+4-4) 
- (modified) clang/test/OpenMP/target_private_codegen.cpp (+9-20) 
- (modified) clang/test/OpenMP/target_simd_codegen.cpp (+112-112) 
- (modified) clang/test/OpenMP/target_simd_codegen_registration.cpp (+24-24) 
- (modified) clang/test/OpenMP/target_simd_depend_codegen.cpp (+20-21) 
- (modified) clang/test/OpenMP/target_simd_tl_codegen.cpp (+22-20) 
- (modified) clang/test/OpenMP/target_simd_uses_allocators_codegen.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_task_affinity_codegen.cpp (+290-268) 
- (modified) clang/test/OpenMP/target_teams_codegen.cpp (+2334-1938) 
- (modified) clang/test/OpenMP/target_teams_codegen_registration.cpp (+24-24) 
- (modified) clang/test/OpenMP/target_teams_depend_codegen.cpp (+20-21) 
- (modified) clang/test/OpenMP/target_teams_distribute_codegen.cpp (+1590-1372) 
- (modified) clang/test/OpenMP/target_teams_distribute_codegen_registration.cpp 
(+24-24) 
- (modified) clang/test/OpenMP/target_teams_distribute_collapse_codegen.cpp 
(+358-310) 
- (modified) clang/test/OpenMP/target_teams_distribute_depend_codegen.cpp 
(+20-21) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_dist_schedule_codegen.cpp (+1140-996) 
- (modified) clang/test/OpenMP/target_teams_distribute_firstprivate_codegen.cpp 
(+282-248) 
- (modified) clang/test/OpenMP/target_teams_distribute_lastprivate_codegen.cpp 
(+310-274) 
- (modified) clang/test/OpenMP/target_teams_distribute_parallel_for_codegen.cpp 
(+412-346) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_collapse_codegen.cpp 
(+362-314) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_depend_codegen.cpp 
(+20-21) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_dist_schedule_codegen.cpp
 (+1120-976) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_firstprivate_codegen.cpp 
(+476-411) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_if_codegen.cpp 
(+316-244) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_lastprivate_codegen.cpp 
(+336-300) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_order_codegen.cpp 
(+43-30) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_private_codegen.cpp 
(+233-154) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_proc_bind_codegen.cpp 
(+132-93) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_reduction_codegen.cpp 
(+206-172) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_reduction_task_codegen.cpp
 (+27-25) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_schedule_codegen.cpp 
(+4000-3520) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_codegen.cpp 
(+758-668) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_codegen_registration.cpp
 (+24-24) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_collapse_codegen.cpp
 (+552-504) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_depend_codegen.cpp 
(+20-21) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_dist_schedule_codegen.cpp
 (+1702-1558) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_firstprivate_codegen.cpp
 (+820-755) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_if_codegen.cpp 
(+2120-1852) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_lastprivate_codegen.cpp
 (+578-542) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_private_codegen.cpp 
(+515-436) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_proc_bind_codegen.cpp
 (+204-165) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_reduction_codegen.cpp
 (+343-309) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_schedule_codegen.cpp
 (+5294-4814) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_simd_uses_allocators_codegen.cpp
 (+4-4) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_parallel_for_uses_allocators_codegen.cpp
 (+4-4) 
- (modified) clang/test/OpenMP/target_teams_distribute_private_codegen.cpp 
(+189-135) 
- (modified) clang/test/OpenMP/target_teams_distribute_reduction_codegen.cpp 
(+2244-1904) 
- (modified) clang/test/OpenMP/target_teams_distribute_simd_codegen.cpp 
(+4078-3642) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_simd_codegen_registration.cpp 
(+24-24) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_simd_collapse_codegen.cpp (+500-452) 
- (modified) clang/test/OpenMP/target_teams_distribute_simd_depend_codegen.cpp 
(+34-36) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_simd_dist_schedule_codegen.cpp 
(+1410-1266) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_simd_firstprivate_codegen.cpp 
(+412-378) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_simd_lastprivate_codegen.cpp 
(+460-424) 
- (modified) clang/test/OpenMP/target_teams_distribute_simd_private_codegen.cpp 
(+313-259) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_simd_reduction_codegen.cpp (+293-259) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_simd_uses_allocators_codegen.cpp 
(+4-4) 
- (modified) 
clang/test/OpenMP/target_teams_distribute_uses_allocators_codegen.cpp (+4-4) 
- (modified) clang/test/OpenMP/target_teams_generic_loop_codegen-1.cpp 
(+408-342) 
- (modified) clang/test/OpenMP/target_teams_generic_loop_codegen.cpp (+67-63) 
- (modified) 
clang/test/OpenMP/target_teams_generic_loop_codegen_as_distribute.cpp (+26-22) 
- (modified) 
clang/test/OpenMP/target_teams_generic_loop_codegen_as_parallel_for.cpp 
(+123-107) 
- (modified) clang/test/OpenMP/target_teams_generic_loop_collapse_codegen.cpp 
(+362-314) 
- (modified) clang/test/OpenMP/target_teams_generic_loop_depend_codegen.cpp 
(+1-101) 
- (modified) clang/test/OpenMP/target_teams_generic_loop_if_codegen.cpp 
(+273-212) 


``````````diff
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp 
b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 3ec09b4e8c630..dbe255117de3f 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -6371,11 +6371,13 @@ void CGOpenMPRuntime::emitTargetOutlinedFunctionHelper(
 
   CodeGenFunction CGF(CGM, true);
   llvm::OpenMPIRBuilder::FunctionGenCallback &&GenerateOutlinedFunction =
-      [&CGF, &D, &CodeGen](StringRef EntryFnName) {
+      [&CGF, &D, &CodeGen, this](StringRef EntryFnName) {
         const CapturedStmt &CS = *D.getCapturedStmt(OMPD_target);
 
         CGOpenMPTargetRegionInfo CGInfo(CS, CodeGen, EntryFnName);
         CodeGenFunction::CGCapturedStmtRAII CapInfoRAII(CGF, &CGInfo);
+        if (CGM.getLangOpts().OpenMPIsTargetDevice && !isGPU())
+          return CGF.GenerateOpenMPCapturedStmtFunctionAggregate(CS, D);
         return CGF.GenerateOpenMPCapturedStmtFunction(CS, D);
       };
 
@@ -10639,8 +10641,11 @@ emitTargetCallFallback(CGOpenMPRuntime *OMPRuntime, 
llvm::Function *OutlinedFn,
       CapturedVars.clear();
       CGF.GenerateOpenMPCapturedVars(CS, CapturedVars);
     }
+    llvm::SmallVector<llvm::Value *, 16> Args(CapturedVars.begin(),
+                                              CapturedVars.end());
+    Args.push_back(llvm::Constant::getNullValue(CGF.Builder.getPtrTy()));
     OMPRuntime->emitOutlinedFunctionCall(CGF, D.getBeginLoc(), OutlinedFn,
-                                         CapturedVars);
+                                         Args);
   }
 }
 
@@ -10877,6 +10882,22 @@ static void emitTargetCallKernelLaunch(
   CGOpenMPRuntime::TargetDataInfo Info;
   genMapInfo(D, CGF, CS, CapturedVars, OMPBuilder, CombinedInfo);
 
+  // Append a null entry for the implicit dyn_ptr argument.
+  using OpenMPOffloadMappingFlags = llvm::omp::OpenMPOffloadMappingFlags;
+  auto *NullPtr = llvm::Constant::getNullValue(CGF.Builder.getPtrTy());
+  CombinedInfo.BasePointers.push_back(NullPtr);
+  CombinedInfo.Pointers.push_back(NullPtr);
+  CombinedInfo.DevicePointers.push_back(
+      llvm::OpenMPIRBuilder::DeviceInfoTy::None);
+  CombinedInfo.Sizes.push_back(CGF.Builder.getInt64(0));
+  CombinedInfo.Types.push_back(OpenMPOffloadMappingFlags::OMP_MAP_TARGET_PARAM 
|
+                               OpenMPOffloadMappingFlags::OMP_MAP_LITERAL);
+  if (!CombinedInfo.Names.empty())
+    CombinedInfo.Names.push_back(NullPtr);
+  CombinedInfo.Exprs.push_back(nullptr);
+  CombinedInfo.Mappers.push_back(nullptr);
+  CombinedInfo.DevicePtrDecls.push_back(nullptr);
+
   emitOffloadingArraysAndArgs(CGF, CombinedInfo, Info, OMPBuilder,
                               /*IsNonContiguous=*/true, /*ForEndCall=*/false);
 
diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp 
b/clang/lib/CodeGen/CGStmtOpenMP.cpp
index cc85de9221eef..ebfeb33b54c1a 100644
--- a/clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp
@@ -695,6 +695,116 @@ static llvm::Function *emitOutlinedFunctionPrologue(
   return F;
 }
 
+static llvm::Function *emitOutlinedFunctionPrologueAggregate(
+    CodeGenFunction &CGF, FunctionArgList &Args,
+    llvm::MapVector<const Decl *, std::pair<const VarDecl *, Address>>
+        &LocalAddrs,
+    llvm::DenseMap<const Decl *, std::pair<const Expr *, llvm::Value *>>
+        &VLASizes,
+    llvm::Value *&CXXThisValue, llvm::Value *&ContextV,
+    unsigned &AggregateFieldCount, const CapturedStmt &CS, SourceLocation Loc,
+    StringRef FunctionName) {
+  const CapturedDecl *CD = CS.getCapturedDecl();
+  const RecordDecl *RD = CS.getCapturedRecordDecl();
+
+  CXXThisValue = nullptr;
+  CodeGenModule &CGM = CGF.CGM;
+  ASTContext &Ctx = CGM.getContext();
+  Args.push_back(CD->getContextParam());
+
+  const CGFunctionInfo &FuncInfo =
+      CGM.getTypes().arrangeBuiltinFunctionDeclaration(Ctx.VoidTy, Args);
+  llvm::FunctionType *FuncLLVMTy = CGM.getTypes().GetFunctionType(FuncInfo);
+
+  auto *F =
+      llvm::Function::Create(FuncLLVMTy, llvm::GlobalValue::InternalLinkage,
+                             FunctionName, &CGM.getModule());
+  CGM.SetInternalFunctionAttributes(CD, F, FuncInfo);
+  if (CD->isNothrow())
+    F->setDoesNotThrow();
+  F->setDoesNotRecurse();
+
+  CGF.StartFunction(CD, Ctx.VoidTy, F, FuncInfo, Args, Loc, Loc);
+  Address ContextAddr = CGF.GetAddrOfLocalVar(CD->getContextParam());
+  ContextV = CGF.Builder.CreateLoad(ContextAddr);
+
+  // The runtime passes arguments as a flat array of promoted intptr_t values.
+  llvm::Type *IntPtrTy = CGF.IntPtrTy;
+  llvm::Type *PtrTy = CGF.Builder.getPtrTy();
+  llvm::Align PtrAlign = CGM.getDataLayout().getPointerABIAlignment(0);
+  CharUnits SlotAlign = CharUnits::fromQuantity(PtrAlign.value());
+
+  unsigned FieldIdx = 0;
+  auto I = CS.captures().begin();
+  for (const FieldDecl *FD : RD->fields()) {
+    llvm::Value *Slot =
+        CGF.Builder.CreateConstInBoundsGEP1_32(IntPtrTy, ContextV, FieldIdx);
+
+    // Generate the appropriate load from the GEP into the __context struct.
+    // This includes all of the user arguments as well as the implicit kernel
+    // argument pointer.
+    if (I->capturesVariableByCopy() && FD->getType()->isAnyPointerType()) {
+      const VarDecl *CurVD = I->getCapturedVar();
+      Slot->setName(CurVD->getName());
+      Address SlotAddr(Slot, PtrTy, SlotAlign);
+      LocalAddrs.insert({FD, {CurVD, SlotAddr}});
+    } else if (FD->hasCapturedVLAType()) {
+      // VLA size is stored as intptr_t directly in the slot.
+      Address SlotAddr(Slot, CGF.ConvertTypeForMem(FD->getType()), SlotAlign);
+      LValue ArgLVal =
+          CGF.MakeAddrLValue(SlotAddr, FD->getType(), AlignmentSource::Decl);
+      llvm::Value *ExprArg = CGF.EmitLoadOfScalar(ArgLVal, I->getLocation());
+      const VariableArrayType *VAT = FD->getCapturedVLAType();
+      VLASizes.try_emplace(FD, VAT->getSizeExpr(), ExprArg);
+    } else if (I->capturesVariable()) {
+      const VarDecl *Var = I->getCapturedVar();
+      QualType VarTy = Var->getType();
+
+      if (VarTy->isVariablyModifiedType() && VarTy->isPointerType()) {
+        Slot->setName(Var->getName() + ".addr");
+        Address SlotAddr(Slot, PtrTy, SlotAlign);
+        LocalAddrs.insert({FD, {Var, SlotAddr}});
+      } else {
+        llvm::Value *VarAddr = CGF.Builder.CreateAlignedLoad(
+            PtrTy, Slot, PtrAlign, Var->getName());
+        LocalAddrs.insert({FD,
+                           {Var, Address(VarAddr, CGF.ConvertTypeForMem(VarTy),
+                                         Ctx.getDeclAlign(Var))}});
+      }
+    } else if (I->capturesVariableByCopy()) {
+      assert(!FD->getType()->isAnyPointerType() &&
+             "Not expecting a captured pointer.");
+      const VarDecl *Var = I->getCapturedVar();
+      QualType FieldTy = FD->getType();
+
+      // Scalar values are promoted and stored directly in the slot.
+      Address SlotAddr(Slot, CGF.ConvertTypeForMem(FieldTy), SlotAlign);
+      Address CopyAddr =
+          CGF.CreateMemTemp(FieldTy, Ctx.getDeclAlign(FD), Var->getName());
+      LValue SrcLVal =
+          CGF.MakeAddrLValue(SlotAddr, FieldTy, AlignmentSource::Decl);
+      LValue CopyLVal =
+          CGF.MakeAddrLValue(CopyAddr, FieldTy, AlignmentSource::Decl);
+
+      RValue ArgRVal = CGF.EmitLoadOfLValue(SrcLVal, I->getLocation());
+      CGF.EmitStoreThroughLValue(ArgRVal, CopyLVal);
+
+      LocalAddrs.insert({FD, {Var, CopyAddr}});
+    } else {
+      assert(I->capturesThis());
+      CXXThisValue =
+          CGF.Builder.CreateAlignedLoad(PtrTy, Slot, PtrAlign, "this");
+      Address SlotAddr(Slot, PtrTy, SlotAlign);
+      LocalAddrs.insert({FD, {nullptr, SlotAddr}});
+    }
+    ++FieldIdx;
+    ++I;
+  }
+
+  AggregateFieldCount = FieldIdx;
+  return F;
+}
+
 llvm::Function *CodeGenFunction::GenerateOpenMPCapturedStmtFunction(
     const CapturedStmt &S, const OMPExecutableDirective &D) {
   SourceLocation Loc = D.getBeginLoc();
@@ -789,6 +899,131 @@ llvm::Function 
*CodeGenFunction::GenerateOpenMPCapturedStmtFunction(
   return WrapperF;
 }
 
+llvm::Function *CodeGenFunction::GenerateOpenMPCapturedStmtFunctionAggregate(
+    const CapturedStmt &S, const OMPExecutableDirective &D) {
+  SourceLocation Loc = D.getBeginLoc();
+  assert(
+      CapturedStmtInfo &&
+      "CapturedStmtInfo should be set when generating the captured function");
+  const CapturedDecl *CD = S.getCapturedDecl();
+  const RecordDecl *RD = S.getCapturedRecordDecl();
+  StringRef FunctionName = CapturedStmtInfo->getHelperName();
+  bool NeedWrapperFunction =
+      getDebugInfo() && CGM.getCodeGenOpts().hasReducedDebugInfo();
+
+  CodeGenFunction WrapperCGF(CGM, /*suppressNewContext=*/true);
+  llvm::Function *WrapperF = nullptr;
+  llvm::Value *WrapperContextV = nullptr;
+  if (NeedWrapperFunction) {
+    WrapperCGF.CapturedStmtInfo = CapturedStmtInfo;
+    FunctionArgList WrapperArgs;
+    llvm::MapVector<const Decl *, std::pair<const VarDecl *, Address>>
+        WrapperLocalAddrs;
+    llvm::DenseMap<const Decl *, std::pair<const Expr *, llvm::Value *>>
+        WrapperVLASizes;
+    unsigned WrapperFieldIdx = 0;
+    WrapperF = emitOutlinedFunctionPrologueAggregate(
+        WrapperCGF, WrapperArgs, WrapperLocalAddrs, WrapperVLASizes,
+        WrapperCGF.CXXThisValue, WrapperContextV, WrapperFieldIdx, S, Loc,
+        FunctionName);
+  }
+
+  FunctionArgList Args;
+  llvm::MapVector<const Decl *, std::pair<const VarDecl *, Address>> 
LocalAddrs;
+  llvm::DenseMap<const Decl *, std::pair<const Expr *, llvm::Value *>> 
VLASizes;
+  llvm::Function *F;
+
+  if (NeedWrapperFunction) {
+    SmallString<256> Buffer;
+    llvm::raw_svector_ostream Out(Buffer);
+    Out << FunctionName << "_debug__";
+
+    FunctionOptions FO(&S, /*UIntPtrCastRequired=*/false,
+                       /*RegisterCastedArgsOnly=*/false, Out.str(), Loc,
+                       /*IsDeviceKernel=*/false);
+    F = emitOutlinedFunctionPrologue(*this, Args, LocalAddrs, VLASizes,
+                                     CXXThisValue, FO);
+  } else {
+    llvm::Value *ContextV = nullptr;
+    unsigned FieldIdx = 0;
+    F = emitOutlinedFunctionPrologueAggregate(*this, Args, LocalAddrs, 
VLASizes,
+                                              CXXThisValue, ContextV, FieldIdx,
+                                              S, Loc, FunctionName);
+
+    for (unsigned I = 0; I < CD->getNumParams(); ++I) {
+      const ImplicitParamDecl *Param = CD->getParam(I);
+      if (Param == CD->getContextParam())
+        continue;
+      llvm::Value *ParamAddr = Builder.CreateConstInBoundsGEP1_32(
+          IntPtrTy, ContextV, FieldIdx, Twine(Param->getName()) + ".addr");
+      llvm::Value *ParamVal = Builder.CreateAlignedLoad(
+          Builder.getPtrTy(), ParamAddr,
+          CGM.getDataLayout().getPointerABIAlignment(0), Param->getName());
+      Address ParamLocalAddr =
+          CreateMemTemp(Param->getType(), Param->getName());
+      Builder.CreateStore(ParamVal, ParamLocalAddr);
+      LocalAddrs.insert({Param, {Param, ParamLocalAddr}});
+      ++FieldIdx;
+    }
+  }
+
+  CodeGenFunction::OMPPrivateScope LocalScope(*this);
+  for (const auto &LocalAddrPair : LocalAddrs) {
+    if (LocalAddrPair.second.first)
+      LocalScope.addPrivate(LocalAddrPair.second.first,
+                            LocalAddrPair.second.second);
+  }
+  (void)LocalScope.Privatize();
+  for (const auto &VLASizePair : VLASizes)
+    VLASizeMap[VLASizePair.second.first] = VLASizePair.second.second;
+  PGO->assignRegionCounters(GlobalDecl(CD), F);
+  CapturedStmtInfo->EmitBody(*this, CD->getBody());
+  (void)LocalScope.ForceCleanup();
+  FinishFunction(CD->getBodyRBrace());
+
+  if (!NeedWrapperFunction)
+    return F;
+
+  // Reverse the order.
+  WrapperF->removeFromParent();
+  F->getParent()->getFunctionList().insertAfter(F->getIterator(), WrapperF);
+
+  llvm::Align PtrAlign = CGM.getDataLayout().getPointerABIAlignment(0);
+  llvm::SmallVector<llvm::Value *, 16> CallArgs;
+  unsigned SlotIdx = 0;
+  auto *InnerParam = F->arg_begin();
+
+  assert(CD->getContextParamPosition() == 0 &&
+         "Expected context param at position 0 for target regions");
+
+  for (const FieldDecl *FD : RD->fields()) {
+    (void)FD;
+    llvm::Value *Slot = WrapperCGF.Builder.CreateConstInBoundsGEP1_32(
+        WrapperCGF.IntPtrTy, WrapperContextV, SlotIdx);
+    llvm::Value *Val = WrapperCGF.Builder.CreateAlignedLoad(
+        InnerParam->getType(), Slot, PtrAlign, InnerParam->getName());
+    CallArgs.push_back(Val);
+    ++SlotIdx;
+    ++InnerParam;
+  }
+
+  for (unsigned I = CD->getContextParamPosition() + 1; I < CD->getNumParams();
+       ++I) {
+    llvm::Value *Slot = WrapperCGF.Builder.CreateConstInBoundsGEP1_32(
+        WrapperCGF.IntPtrTy, WrapperContextV, SlotIdx);
+    llvm::Value *Val = WrapperCGF.Builder.CreateAlignedLoad(
+        InnerParam->getType(), Slot, PtrAlign, InnerParam->getName());
+    CallArgs.push_back(Val);
+    ++SlotIdx;
+    ++InnerParam;
+  }
+
+  assert(InnerParam == F->arg_end() && "Argument count mismatch");
+  CGM.getOpenMPRuntime().emitOutlinedFunctionCall(WrapperCGF, Loc, F, 
CallArgs);
+  WrapperCGF.FinishFunction();
+  return WrapperF;
+}
+
 
//===----------------------------------------------------------------------===//
 //                              OpenMP Directive Emission
 
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/CodeGen/CodeGenFunction.h 
b/clang/lib/CodeGen/CodeGenFunction.h
index 9771b89b55aae..7bc5aaad1c024 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -3756,6 +3756,9 @@ class CodeGenFunction : public CodeGenTypeCache {
   llvm::Function *
   GenerateOpenMPCapturedStmtFunction(const CapturedStmt &S,
                                      const OMPExecutableDirective &D);
+  llvm::Function *
+  GenerateOpenMPCapturedStmtFunctionAggregate(const CapturedStmt &S,
+                                              const OMPExecutableDirective &D);
   void GenerateOpenMPCapturedVars(const CapturedStmt &S,
                                   SmallVectorImpl<llvm::Value *> 
&CapturedVars);
   void emitOMPSimpleStore(LValue LVal, RValue RVal, QualType RValTy,
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index bbb4f939028ec..ce0a092fffb42 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -4473,12 +4473,12 @@ static SmallVector<SemaOpenMP::CapturedParamNameType>
 getTargetRegionParams(Sema &SemaRef) {
   ASTContext &Context = SemaRef.getASTContext();
   SmallVector<SemaOpenMP::CapturedParamNameType> Params;
-  if (SemaRef.getLangOpts().OpenMPIsTargetDevice) {
-    QualType VoidPtrTy = Context.VoidPtrTy.withConst().withRestrict();
-    Params.push_back(std::make_pair(StringRef("dyn_ptr"), VoidPtrTy));
-  }
   // __context with shared vars
   Params.push_back(std::make_pair(StringRef(), QualType()));
+  // Implicit dyn_ptr argument, appended as the last parameter. Present on both
+  // host and device so argument counts match without runtime manipulation.
+  QualType VoidPtrTy = Context.VoidPtrTy.withConst().withRestrict();
+  Params.push_back(std::make_pair(StringRef("dyn_ptr"), VoidPtrTy));
   return Params;
 }
 
diff --git a/clang/test/AST/ast-dump-openmp-target-parallel-for-simd.c 
b/clang/test/AST/ast-dump-openmp-target-parallel-for-simd.c
index cae1f0e018c59..e483f215d2577 100644
--- a/clang/test/AST/ast-dump-openmp-target-parallel-for-simd.c
+++ b/clang/test/AST/ast-dump-openmp-target-parallel-for-simd.c
@@ -68,6 +68,7 @@ void test_five(int x, int y, int z) {
 // CHECK-NEXT: |       | | | | |   `-IntegerLiteral {{.*}} <col:16> 'int' 0
 // CHECK-NEXT: |       | | | | `-DeclRefExpr {{.*}} <col:23> 'int' lvalue 
ParmVar {{.*}} 'x' 'int' refers_to_enclosing_variable_or_capture
 // CHECK-NEXT: |       | | | |-ImplicitParamDecl {{.*}} <line:4:1> col:1 
implicit __context 'struct (unnamed at 
{{.*}}ast-dump-openmp-target-parallel-for-simd.c:4:1) *const restrict'
+// CHECK-NEXT: |       | | | |-ImplicitParamDecl {{.*}} <col:1> col:1 implicit 
dyn_ptr 'void *const restrict'
 // CHECK-NEXT: |       | | | |-RecordDecl {{.*}} <col:1> col:1 implicit struct 
definition
 // CHECK-NEXT: |       | | | | |-CapturedRecordAttr {{.*}} <<invalid sloc>> 
Implicit
 // CHECK-NEXT: |       | | | | `-FieldDecl {{.*}} <line:5:23> col:23 implicit 
'int'
@@ -126,6 +127,7 @@ void test_five(int x, int y, int z) {
 // CHECK-NEXT: |       |   | |   `-IntegerLiteral {{.*}} <col:16> 'int' 0
 // CHECK-NEXT: |       |   | `-DeclRefExpr {{.*}} <col:23> 'int' lvalue 
ParmVar {{.*}} 'x' 'int' refers_to_enclosing_variable_or_capture
 // CHECK-NEXT: |       |   |-ImplicitParamDecl {{.*}} <line:4:1> col:1 
implicit __context 'struct (unnamed at 
{{.*}}ast-dump-openmp-target-parallel-for-simd.c:4:1) *const restrict'
+// CHECK-NEXT: |       |   |-ImplicitParamDecl {{.*}} <col:1> col:1 implicit 
dyn_ptr 'void *const restrict'
 // CHECK-NEXT: |       |   |-RecordDecl {{.*}} <col:1> col:1 implicit struct 
definition
 // CHECK-NEXT: |       |   | |-CapturedRecordAttr {{.*}} <<invalid sloc>> 
Implicit
 // CHECK-NEXT: |       |   | `-FieldDecl {{.*}} <line:5:23> col:23 implicit 
'int'
@@ -199,6 +201,7 @@ void test_five(int x, int y, int z) {
 // CHECK-NEXT: |       | | | | |-DeclRefExpr {{.*}} <line:11:23> 'int' lvalue 
ParmVar {{.*}} 'x' 'int' refers_to_enclosing_variable_or_capture
 // CHECK-NEXT: |       | | | | `-DeclRefExpr {{.*}} <line:12:25> 'int' lvalue 
ParmVar {{.*}} 'y' 'int' refers_to_enclosing_variable_or_capture
 // CHECK-NEXT: |       | | | |-ImplicitParamDecl {{.*}} <line:10:1> col:1 
implicit __context 'struct (unnamed at 
{{.*}}ast-dump-openmp-target-parallel-for-simd.c:10:1) *const restrict'
+// CHECK-NEXT: |       | | | |-ImplicitParamDecl {{.*}} <col:1> col:1 implicit 
dyn_ptr 'void *const restrict'
 // CHECK-NEXT: |       | | | |-RecordDecl {{.*}} <col:1> col:1 implicit struct 
definition
 // CHECK-NEXT: |       | | | | |-CapturedRecordAttr {{.*}} <<invalid sloc>> 
Implicit
 // CHECK-NEXT: |       | | | | |-FieldDecl {{.*}} <line:11:23> col:23 implicit 
'int'
@@ -291,6 +294,7 @@ void test_five(int x, int y, int z) {
 // CHECK-NEXT: |       |   | |-DeclRefExpr {{.*}} <line:11:23> 'int' lvalue 
ParmVar {{.*}} 'x' 'int' refers_to_enclosing_variable_or_capture
 // CHECK-NEXT: |       |   | `-DeclRefExpr {{.*}} <line:12:25> 'int' lvalue 
ParmVar {{.*}} 'y' 'int' refers_to_enclosing_variable_or_capture
 // CHECK-NEXT: |       |   |-ImplicitParamDecl {{.*}} <line:10:1> col:1 
implicit __context 'struct (unnamed at 
{{.*}}ast-dump-openmp-target-parallel-for-simd.c:10:1) *const restrict'
+// CHECK-NEXT: |       |   |-ImplicitParamDecl {{.*}} <col:1> col:1 implicit 
dyn_ptr 'void *const restrict'
 // CHECK-NEXT: |       |   |-RecordDecl {{.*}} <col:1> col:1 implicit struct 
definition
 // CHECK-NEXT: |       |   | |-CapturedRecordAttr {{.*}} <<invalid sloc>> 
Implicit
 // CHECK-NEXT: |       |   | |-FieldDecl {{.*}} <line:11:23> col:23 implicit 
'int'
@@ -385,6 +389,7 @@ void test_five(int x, int y, int z) {
 // CHECK-NEXT: |       | | | | |-DeclRefExpr {{.*}} <line:18:23> 'int' lvalue 
ParmVar {{.*}} 'x' 'int' refers_to_enclosing_variable_or_capture
 // CHECK-NEXT: |       | | | | `-DeclRefExpr {{.*}} <line:19:25> 'int' lvalue 
ParmVar {{.*}} 'y' 'int' refers_to_enclosing_variable_or_capture
 // CHECK-NEXT: |       | | | |-ImplicitParamDecl {{.*}} <line:17:1> col:1 
implicit __context 'struct (unnamed at 
{{.*}}ast-dump-openmp-target-parallel-for-simd.c:17:1) *const restrict'
+// CHECK-NEXT: |       | | | |-ImplicitParamDecl {{.*}} <col:1> col:1 implicit 
dyn_ptr 'void *const restrict'
 // CHECK-NEXT: |       | | | |-RecordDecl {{.*}} <col:1> col:1 implicit struct 
definition
 // CHECK-NEXT: |       | | | | |-CapturedRecordAttr {{.*}} <<invalid sloc>> 
Implicit
 // CHECK-NEXT: |       | | | | |-FieldDecl {{.*}} <line:18:23> col:23 implicit 
'int'
@@ -477,6 +482,7 @@ void test_five(int x, int y, int z) {
 // CHECK-NEXT: |       |   | |-DeclRefExpr {{.*}} <line:18:23> 'int' lvalue 
ParmVar {{.*}} 'x' 'int' refers_to_enclosing_variable_or_capture
 // CHECK-NEXT: |       |   | `-DeclRefExpr {{.*}} <line:19:25> 'int' lvalue 
ParmVar {{.*}} 'y' 'int' refers_to_enclosing_variable_or_capture
 // CHECK-NEXT: |       |   |-ImplicitParamDecl {{.*}} <line:17:1> col:1 
implicit __context 'struct (unnamed at 
{{.*}}ast-dump-openmp-target-parallel-for-simd.c:17:1) *const restrict'
+// CHECK-NEXT: |       |   |-ImplicitParamDecl...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/186261
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to