3643 lines · cpp
1// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _2// Test target codegen - host bc file has to be created first.3// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc4// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - | FileCheck %s --check-prefix=CHECK15// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc6// RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix=CHECK27// RUN: %clang_cc1 -verify -fopenmp -fexceptions -fcxx-exceptions -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -fopenmp-cuda-teams-reduction-recs-num=2048 -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - | FileCheck %s --check-prefix=CHECK38// expected-no-diagnostics9#ifndef HEADER10#define HEADER11 12template<typename tx>13tx ftemplate(int n) {14 int a;15 short b;16 tx c;17 float d;18 double e;19 20 #pragma omp target21 #pragma omp teams reduction(+: e)22 {23 e += 5;24 }25 26 #pragma omp target27 #pragma omp teams reduction(^: c) reduction(*: d)28 {29 c ^= 2;30 d *= 33;31 }32 33 #pragma omp target34 #pragma omp teams reduction(|: a) reduction(max: b)35 #pragma omp parallel reduction(|: a) reduction(max: b)36 {37 a |= 1;38 b = 99 > b ? 99 : b;39 }40 41 return a+b+c+d+e;42}43 44int bar(int n){45 int a = 0;46 47 a += ftemplate<char>(n);48 49 return a;50}51 52#endif53// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l2054// CHECK1-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i64 noundef [[E:%.*]]) #[[ATTR0:[0-9]+]] {55// CHECK1-NEXT: entry:56// CHECK1-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 857// CHECK1-NEXT: [[E_ADDR:%.*]] = alloca i64, align 858// CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 459// CHECK1-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 460// CHECK1-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 861// CHECK1-NEXT: store i64 [[E]], ptr [[E_ADDR]], align 862// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_kernel_environment, ptr [[DYN_PTR]])63// CHECK1-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -164// CHECK1-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]65// CHECK1: user_code.entry:66// CHECK1-NEXT: [[TMP1:%.*]] = load double, ptr [[E_ADDR]], align 867// CHECK1-NEXT: [[E1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 8)68// CHECK1-NEXT: store double [[TMP1]], ptr [[E1]], align 869// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])70// CHECK1-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 471// CHECK1-NEXT: store i32 [[TMP2]], ptr [[DOTTHREADID_TEMP_]], align 472// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], ptr [[E1]]) #[[ATTR4:[0-9]+]]73// CHECK1-NEXT: call void @__kmpc_free_shared(ptr [[E1]], i64 8)74// CHECK1-NEXT: call void @__kmpc_target_deinit()75// CHECK1-NEXT: ret void76// CHECK1: worker.exit:77// CHECK1-NEXT: ret void78//79//80// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined81// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[E:%.*]]) #[[ATTR2:[0-9]+]] {82// CHECK1-NEXT: entry:83// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 884// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 885// CHECK1-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 886// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 887// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 888// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 889// CHECK1-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 890// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 891// CHECK1-NEXT: [[E1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 8)92// CHECK1-NEXT: store double 0.000000e+00, ptr [[E1]], align 893// CHECK1-NEXT: [[TMP1:%.*]] = load double, ptr [[E1]], align 894// CHECK1-NEXT: [[ADD:%.*]] = fadd double [[TMP1]], 5.000000e+0095// CHECK1-NEXT: store double [[ADD]], ptr [[E1]], align 896// CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 097// CHECK1-NEXT: store ptr [[E1]], ptr [[TMP2]], align 898// CHECK1-NEXT: %"_openmp_teams_reductions_buffer_$_$ptr" = call ptr @__kmpc_reduction_get_fixed_buffer()99// CHECK1-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_nvptx_teams_reduce_nowait_v2(ptr @[[GLOB1]], ptr %"_openmp_teams_reductions_buffer_$_$ptr", i32 1024, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func, ptr @_omp_reduction_inter_warp_copy_func, ptr @_omp_reduction_list_to_global_copy_func, ptr @_omp_reduction_list_to_global_reduce_func, ptr @_omp_reduction_global_to_list_copy_func, ptr @_omp_reduction_global_to_list_reduce_func)100// CHECK1-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 1101// CHECK1-NEXT: br i1 [[TMP4]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]102// CHECK1: .omp.reduction.then:103// CHECK1-NEXT: [[TMP5:%.*]] = load double, ptr [[TMP0]], align 8104// CHECK1-NEXT: [[TMP6:%.*]] = load double, ptr [[E1]], align 8105// CHECK1-NEXT: [[ADD2:%.*]] = fadd double [[TMP5]], [[TMP6]]106// CHECK1-NEXT: store double [[ADD2]], ptr [[TMP0]], align 8107// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DONE]]108// CHECK1: .omp.reduction.done:109// CHECK1-NEXT: call void @__kmpc_free_shared(ptr [[E1]], i64 8)110// CHECK1-NEXT: ret void111//112//113// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func114// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3:[0-9]+]] {115// CHECK1-NEXT: entry:116// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8117// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 2118// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 2119// CHECK1-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 2120// CHECK1-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [1 x ptr], align 8121// CHECK1-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca double, align 8122// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8123// CHECK1-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 2124// CHECK1-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 2125// CHECK1-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 2126// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 8127// CHECK1-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 2128// CHECK1-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 2129// CHECK1-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 2130// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0131// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 8132// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0133// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr double, ptr [[TMP9]], i64 1134// CHECK1-NEXT: [[TMP12:%.*]] = load i64, ptr [[TMP9]], align 8135// CHECK1-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_get_warp_size()136// CHECK1-NEXT: [[TMP14:%.*]] = trunc i32 [[TMP13]] to i16137// CHECK1-NEXT: [[TMP15:%.*]] = call i64 @__kmpc_shuffle_int64(i64 [[TMP12]], i16 [[TMP6]], i16 [[TMP14]])138// CHECK1-NEXT: store i64 [[TMP15]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 8139// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr i64, ptr [[TMP9]], i64 1140// CHECK1-NEXT: [[TMP17:%.*]] = getelementptr i64, ptr [[DOTOMP_REDUCTION_ELEMENT]], i64 1141// CHECK1-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 8142// CHECK1-NEXT: [[TMP18:%.*]] = icmp eq i16 [[TMP7]], 0143// CHECK1-NEXT: [[TMP19:%.*]] = icmp eq i16 [[TMP7]], 1144// CHECK1-NEXT: [[TMP20:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]145// CHECK1-NEXT: [[TMP21:%.*]] = and i1 [[TMP19]], [[TMP20]]146// CHECK1-NEXT: [[TMP22:%.*]] = icmp eq i16 [[TMP7]], 2147// CHECK1-NEXT: [[TMP23:%.*]] = and i16 [[TMP5]], 1148// CHECK1-NEXT: [[TMP24:%.*]] = icmp eq i16 [[TMP23]], 0149// CHECK1-NEXT: [[TMP25:%.*]] = and i1 [[TMP22]], [[TMP24]]150// CHECK1-NEXT: [[TMP26:%.*]] = icmp sgt i16 [[TMP6]], 0151// CHECK1-NEXT: [[TMP27:%.*]] = and i1 [[TMP25]], [[TMP26]]152// CHECK1-NEXT: [[TMP28:%.*]] = or i1 [[TMP18]], [[TMP21]]153// CHECK1-NEXT: [[TMP29:%.*]] = or i1 [[TMP28]], [[TMP27]]154// CHECK1-NEXT: br i1 [[TMP29]], label [[THEN:%.*]], label [[ELSE:%.*]]155// CHECK1: then:156// CHECK1-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]157// CHECK1-NEXT: br label [[IFCONT:%.*]]158// CHECK1: else:159// CHECK1-NEXT: br label [[IFCONT]]160// CHECK1: ifcont:161// CHECK1-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 1162// CHECK1-NEXT: [[TMP31:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]163// CHECK1-NEXT: [[TMP32:%.*]] = and i1 [[TMP30]], [[TMP31]]164// CHECK1-NEXT: br i1 [[TMP32]], label [[THEN4:%.*]], label [[ELSE5:%.*]]165// CHECK1: then4:166// CHECK1-NEXT: [[TMP33:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0167// CHECK1-NEXT: [[TMP34:%.*]] = load ptr, ptr [[TMP33]], align 8168// CHECK1-NEXT: [[TMP35:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i64 0, i64 0169// CHECK1-NEXT: [[TMP36:%.*]] = load ptr, ptr [[TMP35]], align 8170// CHECK1-NEXT: [[TMP37:%.*]] = load double, ptr [[TMP34]], align 8171// CHECK1-NEXT: store double [[TMP37]], ptr [[TMP36]], align 8172// CHECK1-NEXT: br label [[IFCONT6:%.*]]173// CHECK1: else5:174// CHECK1-NEXT: br label [[IFCONT6]]175// CHECK1: ifcont6:176// CHECK1-NEXT: ret void177//178//179// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func180// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {181// CHECK1-NEXT: entry:182// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8183// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4184// CHECK1-NEXT: [[DOTCNT_ADDR:%.*]] = alloca i32, align 4185// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8186// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4187// CHECK1-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()188// CHECK1-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()189// CHECK1-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 31190// CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()191// CHECK1-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 5192// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 8193// CHECK1-NEXT: store i32 0, ptr [[DOTCNT_ADDR]], align 4194// CHECK1-NEXT: br label [[PRECOND:%.*]]195// CHECK1: precond:196// CHECK1-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTCNT_ADDR]], align 4197// CHECK1-NEXT: [[TMP8:%.*]] = icmp ult i32 [[TMP7]], 2198// CHECK1-NEXT: br i1 [[TMP8]], label [[BODY:%.*]], label [[EXIT:%.*]]199// CHECK1: body:200// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])201// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP2]])202// CHECK1-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 0203// CHECK1-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]204// CHECK1: then:205// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP6]], i64 0, i64 0206// CHECK1-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 8207// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr [[TMP10]], i32 [[TMP7]]208// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]209// CHECK1-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP11]], align 4210// CHECK1-NEXT: store volatile i32 [[TMP13]], ptr addrspace(3) [[TMP12]], align 4211// CHECK1-NEXT: br label [[IFCONT:%.*]]212// CHECK1: else:213// CHECK1-NEXT: br label [[IFCONT]]214// CHECK1: ifcont:215// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])216// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])217// CHECK1-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTADDR1]], align 4218// CHECK1-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP14]]219// CHECK1-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]220// CHECK1: then3:221// CHECK1-NEXT: [[TMP15:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]222// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP6]], i64 0, i64 0223// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8224// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr i32, ptr [[TMP17]], i32 [[TMP7]]225// CHECK1-NEXT: [[TMP19:%.*]] = load volatile i32, ptr addrspace(3) [[TMP15]], align 4226// CHECK1-NEXT: store i32 [[TMP19]], ptr [[TMP18]], align 4227// CHECK1-NEXT: br label [[IFCONT4:%.*]]228// CHECK1: else4:229// CHECK1-NEXT: br label [[IFCONT4]]230// CHECK1: ifcont5:231// CHECK1-NEXT: [[TMP20:%.*]] = add nsw i32 [[TMP7]], 1232// CHECK1-NEXT: store i32 [[TMP20]], ptr [[DOTCNT_ADDR]], align 4233// CHECK1-NEXT: br label [[PRECOND]]234// CHECK1: exit:235// CHECK1-NEXT: ret void236//237//238// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_copy_func239// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {240// CHECK1-NEXT: entry:241// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8242// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4243// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 8244// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8245// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4246// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 8247// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 8248// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 8249// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 4250// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0251// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8252// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP4]], i32 [[TMP5]]253// CHECK1-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP8]], i32 0, i32 0254// CHECK1-NEXT: [[TMP9:%.*]] = load double, ptr [[TMP7]], align 8255// CHECK1-NEXT: store double [[TMP9]], ptr [[E]], align 8256// CHECK1-NEXT: ret void257//258//259// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_reduce_func260// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {261// CHECK1-NEXT: entry:262// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8263// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4264// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 8265// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8266// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8267// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4268// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 8269// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8270// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 4271// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0272// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP3]], i32 [[TMP4]]273// CHECK1-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP6]], i32 0, i32 0274// CHECK1-NEXT: store ptr [[E]], ptr [[TMP5]], align 8275// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTADDR2]], align 8276// CHECK1-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined_omp$reduction$reduction_func"(ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr [[TMP7]]) #[[ATTR4]]277// CHECK1-NEXT: ret void278//279//280// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_copy_func281// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {282// CHECK1-NEXT: entry:283// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8284// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4285// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 8286// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8287// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4288// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 8289// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 8290// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 8291// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 4292// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i64 0, i64 0293// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8294// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP4]], i32 [[TMP5]]295// CHECK1-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP8]], i32 0, i32 0296// CHECK1-NEXT: [[TMP9:%.*]] = load double, ptr [[E]], align 8297// CHECK1-NEXT: store double [[TMP9]], ptr [[TMP7]], align 8298// CHECK1-NEXT: ret void299//300//301// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_reduce_func302// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {303// CHECK1-NEXT: entry:304// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8305// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4306// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 8307// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 8308// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8309// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4310// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 8311// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8312// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 4313// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0314// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP3]], i32 [[TMP4]]315// CHECK1-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP6]], i32 0, i32 0316// CHECK1-NEXT: store ptr [[E]], ptr [[TMP5]], align 8317// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTADDR2]], align 8318// CHECK1-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP7]], ptr [[DOTOMP_REDUCTION_RED_LIST]]) #[[ATTR4]]319// CHECK1-NEXT: ret void320//321//322// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26323// CHECK1-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i64 noundef [[C:%.*]], i64 noundef [[D:%.*]]) #[[ATTR0]] {324// CHECK1-NEXT: entry:325// CHECK1-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 8326// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca i64, align 8327// CHECK1-NEXT: [[D_ADDR:%.*]] = alloca i64, align 8328// CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4329// CHECK1-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 4330// CHECK1-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 8331// CHECK1-NEXT: store i64 [[C]], ptr [[C_ADDR]], align 8332// CHECK1-NEXT: store i64 [[D]], ptr [[D_ADDR]], align 8333// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_kernel_environment, ptr [[DYN_PTR]])334// CHECK1-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1335// CHECK1-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]336// CHECK1: user_code.entry:337// CHECK1-NEXT: [[TMP1:%.*]] = load i8, ptr [[C_ADDR]], align 1338// CHECK1-NEXT: [[C1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 1)339// CHECK1-NEXT: store i8 [[TMP1]], ptr [[C1]], align 1340// CHECK1-NEXT: [[TMP2:%.*]] = load float, ptr [[D_ADDR]], align 4341// CHECK1-NEXT: [[D2:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 4)342// CHECK1-NEXT: store float [[TMP2]], ptr [[D2]], align 4343// CHECK1-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])344// CHECK1-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 4345// CHECK1-NEXT: store i32 [[TMP3]], ptr [[DOTTHREADID_TEMP_]], align 4346// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], ptr [[C1]], ptr [[D2]]) #[[ATTR4]]347// CHECK1-NEXT: call void @__kmpc_free_shared(ptr [[D2]], i64 4)348// CHECK1-NEXT: call void @__kmpc_free_shared(ptr [[C1]], i64 1)349// CHECK1-NEXT: call void @__kmpc_target_deinit()350// CHECK1-NEXT: ret void351// CHECK1: worker.exit:352// CHECK1-NEXT: ret void353//354//355// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined356// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 1 dereferenceable(1) [[C:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) #[[ATTR2]] {357// CHECK1-NEXT: entry:358// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8359// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8360// CHECK1-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 8361// CHECK1-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 8362// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 8363// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8364// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8365// CHECK1-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 8366// CHECK1-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 8367// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 8368// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D_ADDR]], align 8369// CHECK1-NEXT: [[C1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 1)370// CHECK1-NEXT: [[D2:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i64 4)371// CHECK1-NEXT: store i8 0, ptr [[C1]], align 1372// CHECK1-NEXT: store float 1.000000e+00, ptr [[D2]], align 4373// CHECK1-NEXT: [[TMP2:%.*]] = load i8, ptr [[C1]], align 1374// CHECK1-NEXT: [[CONV:%.*]] = sext i8 [[TMP2]] to i32375// CHECK1-NEXT: [[XOR:%.*]] = xor i32 [[CONV]], 2376// CHECK1-NEXT: [[CONV3:%.*]] = trunc i32 [[XOR]] to i8377// CHECK1-NEXT: store i8 [[CONV3]], ptr [[C1]], align 1378// CHECK1-NEXT: [[TMP3:%.*]] = load float, ptr [[D2]], align 4379// CHECK1-NEXT: [[MUL:%.*]] = fmul float [[TMP3]], 3.300000e+01380// CHECK1-NEXT: store float [[MUL]], ptr [[D2]], align 4381// CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0382// CHECK1-NEXT: store ptr [[C1]], ptr [[TMP4]], align 8383// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 1384// CHECK1-NEXT: store ptr [[D2]], ptr [[TMP5]], align 8385// CHECK1-NEXT: %"_openmp_teams_reductions_buffer_$_$ptr" = call ptr @__kmpc_reduction_get_fixed_buffer()386// CHECK1-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_nvptx_teams_reduce_nowait_v2(ptr @[[GLOB1]], ptr %"_openmp_teams_reductions_buffer_$_$ptr", i32 1024, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func1, ptr @_omp_reduction_inter_warp_copy_func2, ptr @_omp_reduction_list_to_global_copy_func3, ptr @_omp_reduction_list_to_global_reduce_func4, ptr @_omp_reduction_global_to_list_copy_func5, ptr @_omp_reduction_global_to_list_reduce_func6)387// CHECK1-NEXT: [[TMP7:%.*]] = icmp eq i32 [[TMP6]], 1388// CHECK1-NEXT: br i1 [[TMP7]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]389// CHECK1: .omp.reduction.then:390// CHECK1-NEXT: [[TMP8:%.*]] = load i8, ptr [[TMP0]], align 1391// CHECK1-NEXT: [[CONV4:%.*]] = sext i8 [[TMP8]] to i32392// CHECK1-NEXT: [[TMP9:%.*]] = load i8, ptr [[C1]], align 1393// CHECK1-NEXT: [[CONV5:%.*]] = sext i8 [[TMP9]] to i32394// CHECK1-NEXT: [[XOR6:%.*]] = xor i32 [[CONV4]], [[CONV5]]395// CHECK1-NEXT: [[CONV7:%.*]] = trunc i32 [[XOR6]] to i8396// CHECK1-NEXT: store i8 [[CONV7]], ptr [[TMP0]], align 1397// CHECK1-NEXT: [[TMP10:%.*]] = load float, ptr [[TMP1]], align 4398// CHECK1-NEXT: [[TMP11:%.*]] = load float, ptr [[D2]], align 4399// CHECK1-NEXT: [[MUL8:%.*]] = fmul float [[TMP10]], [[TMP11]]400// CHECK1-NEXT: store float [[MUL8]], ptr [[TMP1]], align 4401// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DONE]]402// CHECK1: .omp.reduction.done:403// CHECK1-NEXT: call void @__kmpc_free_shared(ptr [[D2]], i64 4)404// CHECK1-NEXT: call void @__kmpc_free_shared(ptr [[C1]], i64 1)405// CHECK1-NEXT: ret void406//407//408// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func1409// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3]] {410// CHECK1-NEXT: entry:411// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8412// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 2413// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 2414// CHECK1-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 2415// CHECK1-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [2 x ptr], align 8416// CHECK1-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca i8, align 1417// CHECK1-NEXT: [[DOTOMP_REDUCTION_ELEMENT4:%.*]] = alloca float, align 4418// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8419// CHECK1-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 2420// CHECK1-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 2421// CHECK1-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 2422// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 8423// CHECK1-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 2424// CHECK1-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 2425// CHECK1-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 2426// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 0427// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 8428// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0429// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP9]], i64 1430// CHECK1-NEXT: [[TMP12:%.*]] = load i8, ptr [[TMP9]], align 1431// CHECK1-NEXT: [[TMP13:%.*]] = sext i8 [[TMP12]] to i32432// CHECK1-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_get_warp_size()433// CHECK1-NEXT: [[TMP15:%.*]] = trunc i32 [[TMP14]] to i16434// CHECK1-NEXT: [[TMP16:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP13]], i16 [[TMP6]], i16 [[TMP15]])435// CHECK1-NEXT: [[TMP17:%.*]] = trunc i32 [[TMP16]] to i8436// CHECK1-NEXT: store i8 [[TMP17]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 1437// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP9]], i64 1438// CHECK1-NEXT: [[TMP19:%.*]] = getelementptr i8, ptr [[DOTOMP_REDUCTION_ELEMENT]], i64 1439// CHECK1-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 8440// CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 1441// CHECK1-NEXT: [[TMP21:%.*]] = load ptr, ptr [[TMP20]], align 8442// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 1443// CHECK1-NEXT: [[TMP23:%.*]] = getelementptr float, ptr [[TMP21]], i64 1444// CHECK1-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP21]], align 4445// CHECK1-NEXT: [[TMP25:%.*]] = call i32 @__kmpc_get_warp_size()446// CHECK1-NEXT: [[TMP26:%.*]] = trunc i32 [[TMP25]] to i16447// CHECK1-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP24]], i16 [[TMP6]], i16 [[TMP26]])448// CHECK1-NEXT: store i32 [[TMP27]], ptr [[DOTOMP_REDUCTION_ELEMENT4]], align 4449// CHECK1-NEXT: [[TMP28:%.*]] = getelementptr i32, ptr [[TMP21]], i64 1450// CHECK1-NEXT: [[TMP29:%.*]] = getelementptr i32, ptr [[DOTOMP_REDUCTION_ELEMENT4]], i64 1451// CHECK1-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT4]], ptr [[TMP22]], align 8452// CHECK1-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 0453// CHECK1-NEXT: [[TMP31:%.*]] = icmp eq i16 [[TMP7]], 1454// CHECK1-NEXT: [[TMP32:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]455// CHECK1-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]]456// CHECK1-NEXT: [[TMP34:%.*]] = icmp eq i16 [[TMP7]], 2457// CHECK1-NEXT: [[TMP35:%.*]] = and i16 [[TMP5]], 1458// CHECK1-NEXT: [[TMP36:%.*]] = icmp eq i16 [[TMP35]], 0459// CHECK1-NEXT: [[TMP37:%.*]] = and i1 [[TMP34]], [[TMP36]]460// CHECK1-NEXT: [[TMP38:%.*]] = icmp sgt i16 [[TMP6]], 0461// CHECK1-NEXT: [[TMP39:%.*]] = and i1 [[TMP37]], [[TMP38]]462// CHECK1-NEXT: [[TMP40:%.*]] = or i1 [[TMP30]], [[TMP33]]463// CHECK1-NEXT: [[TMP41:%.*]] = or i1 [[TMP40]], [[TMP39]]464// CHECK1-NEXT: br i1 [[TMP41]], label [[THEN:%.*]], label [[ELSE:%.*]]465// CHECK1: then:466// CHECK1-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]467// CHECK1-NEXT: br label [[IFCONT:%.*]]468// CHECK1: else:469// CHECK1-NEXT: br label [[IFCONT]]470// CHECK1: ifcont:471// CHECK1-NEXT: [[TMP42:%.*]] = icmp eq i16 [[TMP7]], 1472// CHECK1-NEXT: [[TMP43:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]473// CHECK1-NEXT: [[TMP44:%.*]] = and i1 [[TMP42]], [[TMP43]]474// CHECK1-NEXT: br i1 [[TMP44]], label [[THEN5:%.*]], label [[ELSE6:%.*]]475// CHECK1: then5:476// CHECK1-NEXT: [[TMP45:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0477// CHECK1-NEXT: [[TMP46:%.*]] = load ptr, ptr [[TMP45]], align 8478// CHECK1-NEXT: [[TMP47:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 0479// CHECK1-NEXT: [[TMP48:%.*]] = load ptr, ptr [[TMP47]], align 8480// CHECK1-NEXT: [[TMP49:%.*]] = load i8, ptr [[TMP46]], align 1481// CHECK1-NEXT: store i8 [[TMP49]], ptr [[TMP48]], align 1482// CHECK1-NEXT: [[TMP50:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 1483// CHECK1-NEXT: [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 8484// CHECK1-NEXT: [[TMP52:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 1485// CHECK1-NEXT: [[TMP53:%.*]] = load ptr, ptr [[TMP52]], align 8486// CHECK1-NEXT: [[TMP54:%.*]] = load float, ptr [[TMP51]], align 4487// CHECK1-NEXT: store float [[TMP54]], ptr [[TMP53]], align 4488// CHECK1-NEXT: br label [[IFCONT7:%.*]]489// CHECK1: else6:490// CHECK1-NEXT: br label [[IFCONT7]]491// CHECK1: ifcont7:492// CHECK1-NEXT: ret void493//494//495// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func2496// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {497// CHECK1-NEXT: entry:498// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8499// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4500// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8501// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4502// CHECK1-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()503// CHECK1-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()504// CHECK1-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 31505// CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()506// CHECK1-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 5507// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 8508// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])509// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])510// CHECK1-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 0511// CHECK1-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]512// CHECK1: then:513// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 0514// CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8515// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]516// CHECK1-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP8]], align 1517// CHECK1-NEXT: store volatile i8 [[TMP10]], ptr addrspace(3) [[TMP9]], align 1518// CHECK1-NEXT: br label [[IFCONT:%.*]]519// CHECK1: else:520// CHECK1-NEXT: br label [[IFCONT]]521// CHECK1: ifcont:522// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])523// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])524// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTADDR1]], align 4525// CHECK1-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP11]]526// CHECK1-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]527// CHECK1: then3:528// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]529// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 0530// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 8531// CHECK1-NEXT: [[TMP15:%.*]] = load volatile i8, ptr addrspace(3) [[TMP12]], align 1532// CHECK1-NEXT: store i8 [[TMP15]], ptr [[TMP14]], align 1533// CHECK1-NEXT: br label [[IFCONT4:%.*]]534// CHECK1: else4:535// CHECK1-NEXT: br label [[IFCONT4]]536// CHECK1: ifcont5537// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])538// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])539// CHECK1-NEXT: [[WARP_MASTER5:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 0540// CHECK1-NEXT: br i1 [[WARP_MASTER5]], label [[THEN6:%.*]], label [[ELSE7:%.*]]541// CHECK1: then8:542// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 1543// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8544// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]545// CHECK1-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP17]], align 4546// CHECK1-NEXT: store volatile i32 [[TMP19]], ptr addrspace(3) [[TMP18]], align 4547// CHECK1-NEXT: br label [[IFCONT8:%.*]]548// CHECK1: else9:549// CHECK1-NEXT: br label [[IFCONT8]]550// CHECK1: ifcont10:551// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])552// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])553// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTADDR1]], align 4554// CHECK1-NEXT: [[IS_ACTIVE_THREAD9:%.*]] = icmp ult i32 [[TMP3]], [[TMP20]]555// CHECK1-NEXT: br i1 [[IS_ACTIVE_THREAD9]], label [[THEN10:%.*]], label [[ELSE11:%.*]]556// CHECK1: then13:557// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]558// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 1559// CHECK1-NEXT: [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 8560// CHECK1-NEXT: [[TMP24:%.*]] = load volatile i32, ptr addrspace(3) [[TMP21]], align 4561// CHECK1-NEXT: store i32 [[TMP24]], ptr [[TMP23]], align 4562// CHECK1-NEXT: br label [[IFCONT12:%.*]]563// CHECK1: else14:564// CHECK1-NEXT: br label [[IFCONT12]]565// CHECK1: ifcont15:566// CHECK1-NEXT: ret void567//568//569// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_copy_func3570// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {571// CHECK1-NEXT: entry:572// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8573// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4574// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 8575// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8576// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4577// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 8578// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 8579// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 8580// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 4581// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 0582// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8583// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP4]], i32 [[TMP5]]584// CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 0585// CHECK1-NEXT: [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 1586// CHECK1-NEXT: store i8 [[TMP9]], ptr [[C]], align 1587// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 1588// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 8589// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP4]], i32 [[TMP5]]590// CHECK1-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP12]], i32 0, i32 1591// CHECK1-NEXT: [[TMP13:%.*]] = load float, ptr [[TMP11]], align 4592// CHECK1-NEXT: store float [[TMP13]], ptr [[D]], align 4593// CHECK1-NEXT: ret void594//595//596// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_reduce_func4597// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {598// CHECK1-NEXT: entry:599// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8600// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4601// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 8602// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 8603// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8604// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4605// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 8606// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8607// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 4608// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0609// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP3]], i32 [[TMP4]]610// CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP6]], i32 0, i32 0611// CHECK1-NEXT: store ptr [[C]], ptr [[TMP5]], align 8612// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 1613// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP3]], i32 [[TMP4]]614// CHECK1-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 1615// CHECK1-NEXT: store ptr [[D]], ptr [[TMP7]], align 8616// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 8617// CHECK1-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined_omp$reduction$reduction_func"(ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr [[TMP9]]) #[[ATTR4]]618// CHECK1-NEXT: ret void619//620//621// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_copy_func5622// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {623// CHECK1-NEXT: entry:624// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8625// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4626// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 8627// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8628// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4629// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 8630// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 8631// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 8632// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 4633// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 0634// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 8635// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP4]], i32 [[TMP5]]636// CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 0637// CHECK1-NEXT: [[TMP9:%.*]] = load i8, ptr [[C]], align 1638// CHECK1-NEXT: store i8 [[TMP9]], ptr [[TMP7]], align 1639// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 1640// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 8641// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP4]], i32 [[TMP5]]642// CHECK1-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP12]], i32 0, i32 1643// CHECK1-NEXT: [[TMP13:%.*]] = load float, ptr [[D]], align 4644// CHECK1-NEXT: store float [[TMP13]], ptr [[TMP11]], align 4645// CHECK1-NEXT: ret void646//647//648// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_reduce_func6649// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {650// CHECK1-NEXT: entry:651// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8652// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4653// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 8654// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 8655// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8656// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4657// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 8658// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 8659// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 4660// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0661// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP3]], i32 [[TMP4]]662// CHECK1-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP6]], i32 0, i32 0663// CHECK1-NEXT: store ptr [[C]], ptr [[TMP5]], align 8664// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 1665// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP3]], i32 [[TMP4]]666// CHECK1-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 1667// CHECK1-NEXT: store ptr [[D]], ptr [[TMP7]], align 8668// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 8669// CHECK1-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP9]], ptr [[DOTOMP_REDUCTION_RED_LIST]]) #[[ATTR4]]670// CHECK1-NEXT: ret void671//672//673// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33674// CHECK1-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i64 noundef [[A:%.*]], i64 noundef [[B:%.*]]) #[[ATTR0]] {675// CHECK1-NEXT: entry:676// CHECK1-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 8677// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca i64, align 8678// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca i64, align 8679// CHECK1-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 4680// CHECK1-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 4681// CHECK1-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 8682// CHECK1-NEXT: store i64 [[A]], ptr [[A_ADDR]], align 8683// CHECK1-NEXT: store i64 [[B]], ptr [[B_ADDR]], align 8684// CHECK1-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_kernel_environment, ptr [[DYN_PTR]])685// CHECK1-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1686// CHECK1-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]687// CHECK1: user_code.entry:688// CHECK1-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])689// CHECK1-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 4690// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 4691// CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], ptr [[A_ADDR]], ptr [[B_ADDR]]) #[[ATTR4]]692// CHECK1-NEXT: call void @__kmpc_target_deinit()693// CHECK1-NEXT: ret void694// CHECK1: worker.exit:695// CHECK1-NEXT: ret void696//697//698// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined699// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 2 dereferenceable(2) [[B:%.*]]) #[[ATTR2]] {700// CHECK1-NEXT: entry:701// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8702// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8703// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8704// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 8705// CHECK1-NEXT: [[A1:%.*]] = alloca i32, align 4706// CHECK1-NEXT: [[B2:%.*]] = alloca i16, align 2707// CHECK1-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 8708// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 8709// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8710// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8711// CHECK1-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8712// CHECK1-NEXT: store ptr [[B]], ptr [[B_ADDR]], align 8713// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8714// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[B_ADDR]], align 8715// CHECK1-NEXT: store i32 0, ptr [[A1]], align 4716// CHECK1-NEXT: store i16 -32768, ptr [[B2]], align 2717// CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 0718// CHECK1-NEXT: store ptr [[A1]], ptr [[TMP2]], align 8719// CHECK1-NEXT: [[TMP3:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i64 0, i64 1720// CHECK1-NEXT: store ptr [[B2]], ptr [[TMP3]], align 8721// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 8722// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 4723// CHECK1-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP5]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i64 2)724// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0725// CHECK1-NEXT: store ptr [[A1]], ptr [[TMP6]], align 8726// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 1727// CHECK1-NEXT: store ptr [[B2]], ptr [[TMP7]], align 8728// CHECK1-NEXT: %"_openmp_teams_reductions_buffer_$_$ptr" = call ptr @__kmpc_reduction_get_fixed_buffer()729// CHECK1-NEXT: [[TMP8:%.*]] = call i32 @__kmpc_nvptx_teams_reduce_nowait_v2(ptr @[[GLOB1]], ptr %"_openmp_teams_reductions_buffer_$_$ptr", i32 1024, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func9, ptr @_omp_reduction_inter_warp_copy_func10, ptr @_omp_reduction_list_to_global_copy_func11, ptr @_omp_reduction_list_to_global_reduce_func12, ptr @_omp_reduction_global_to_list_copy_func13, ptr @_omp_reduction_global_to_list_reduce_func14)730// CHECK1-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 1731// CHECK1-NEXT: br i1 [[TMP9]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]732// CHECK1: .omp.reduction.then:733// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP0]], align 4734// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[A1]], align 4735// CHECK1-NEXT: [[OR:%.*]] = or i32 [[TMP10]], [[TMP11]]736// CHECK1-NEXT: store i32 [[OR]], ptr [[TMP0]], align 4737// CHECK1-NEXT: [[TMP12:%.*]] = load i16, ptr [[TMP1]], align 2738// CHECK1-NEXT: [[CONV:%.*]] = sext i16 [[TMP12]] to i32739// CHECK1-NEXT: [[TMP13:%.*]] = load i16, ptr [[B2]], align 2740// CHECK1-NEXT: [[CONV3:%.*]] = sext i16 [[TMP13]] to i32741// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CONV]], [[CONV3]]742// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]743// CHECK1: cond.true:744// CHECK1-NEXT: [[TMP14:%.*]] = load i16, ptr [[TMP1]], align 2745// CHECK1-NEXT: br label [[COND_END:%.*]]746// CHECK1: cond.false:747// CHECK1-NEXT: [[TMP15:%.*]] = load i16, ptr [[B2]], align 2748// CHECK1-NEXT: br label [[COND_END]]749// CHECK1: cond.end:750// CHECK1-NEXT: [[COND:%.*]] = phi i16 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]751// CHECK1-NEXT: store i16 [[COND]], ptr [[TMP1]], align 2752// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DONE]]753// CHECK1: .omp.reduction.done:754// CHECK1-NEXT: ret void755//756//757// CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp_outlined758// CHECK1-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 2 dereferenceable(2) [[B:%.*]]) #[[ATTR2]] {759// CHECK1-NEXT: entry:760// CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 8761// CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 8762// CHECK1-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 8763// CHECK1-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 8764// CHECK1-NEXT: [[A1:%.*]] = alloca i32, align 4765// CHECK1-NEXT: [[B2:%.*]] = alloca i16, align 2766// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 8767// CHECK1-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 8768// CHECK1-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 8769// CHECK1-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 8770// CHECK1-NEXT: store ptr [[B]], ptr [[B_ADDR]], align 8771// CHECK1-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 8772// CHECK1-NEXT: [[TMP1:%.*]] = load ptr, ptr [[B_ADDR]], align 8773// CHECK1-NEXT: store i32 0, ptr [[A1]], align 4774// CHECK1-NEXT: store i16 -32768, ptr [[B2]], align 2775// CHECK1-NEXT: [[TMP2:%.*]] = load i32, ptr [[A1]], align 4776// CHECK1-NEXT: [[OR:%.*]] = or i32 [[TMP2]], 1777// CHECK1-NEXT: store i32 [[OR]], ptr [[A1]], align 4778// CHECK1-NEXT: [[TMP3:%.*]] = load i16, ptr [[B2]], align 2779// CHECK1-NEXT: [[CONV:%.*]] = sext i16 [[TMP3]] to i32780// CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i32 99, [[CONV]]781// CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]782// CHECK1: cond.true:783// CHECK1-NEXT: br label [[COND_END:%.*]]784// CHECK1: cond.false:785// CHECK1-NEXT: [[TMP4:%.*]] = load i16, ptr [[B2]], align 2786// CHECK1-NEXT: [[CONV3:%.*]] = sext i16 [[TMP4]] to i32787// CHECK1-NEXT: br label [[COND_END]]788// CHECK1: cond.end:789// CHECK1-NEXT: [[COND:%.*]] = phi i32 [ 99, [[COND_TRUE]] ], [ [[CONV3]], [[COND_FALSE]] ]790// CHECK1-NEXT: [[CONV4:%.*]] = trunc i32 [[COND]] to i16791// CHECK1-NEXT: store i16 [[CONV4]], ptr [[B2]], align 2792// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0793// CHECK1-NEXT: store ptr [[A1]], ptr [[TMP5]], align 8794// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 1795// CHECK1-NEXT: store ptr [[B2]], ptr [[TMP6]], align 8796// CHECK1-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_nvptx_parallel_reduce_nowait_v2(ptr @[[GLOB1]], i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func7, ptr @_omp_reduction_inter_warp_copy_func8)797// CHECK1-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 1798// CHECK1-NEXT: br i1 [[TMP8]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]799// CHECK1: .omp.reduction.then:800// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP0]], align 4801// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[A1]], align 4802// CHECK1-NEXT: [[OR5:%.*]] = or i32 [[TMP9]], [[TMP10]]803// CHECK1-NEXT: store i32 [[OR5]], ptr [[TMP0]], align 4804// CHECK1-NEXT: [[TMP11:%.*]] = load i16, ptr [[TMP1]], align 2805// CHECK1-NEXT: [[CONV6:%.*]] = sext i16 [[TMP11]] to i32806// CHECK1-NEXT: [[TMP12:%.*]] = load i16, ptr [[B2]], align 2807// CHECK1-NEXT: [[CONV7:%.*]] = sext i16 [[TMP12]] to i32808// CHECK1-NEXT: [[CMP8:%.*]] = icmp sgt i32 [[CONV6]], [[CONV7]]809// CHECK1-NEXT: br i1 [[CMP8]], label [[COND_TRUE9:%.*]], label [[COND_FALSE10:%.*]]810// CHECK1: cond.true9:811// CHECK1-NEXT: [[TMP13:%.*]] = load i16, ptr [[TMP1]], align 2812// CHECK1-NEXT: br label [[COND_END11:%.*]]813// CHECK1: cond.false10:814// CHECK1-NEXT: [[TMP14:%.*]] = load i16, ptr [[B2]], align 2815// CHECK1-NEXT: br label [[COND_END11]]816// CHECK1: cond.end11:817// CHECK1-NEXT: [[COND12:%.*]] = phi i16 [ [[TMP13]], [[COND_TRUE9]] ], [ [[TMP14]], [[COND_FALSE10]] ]818// CHECK1-NEXT: store i16 [[COND12]], ptr [[TMP1]], align 2819// CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DONE]]820// CHECK1: .omp.reduction.done:821// CHECK1-NEXT: ret void822//823//824// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func7825// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3]] {826// CHECK1-NEXT: entry:827// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8828// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 2829// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 2830// CHECK1-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 2831// CHECK1-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [2 x ptr], align 8832// CHECK1-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca i32, align 4833// CHECK1-NEXT: [[DOTOMP_REDUCTION_ELEMENT4:%.*]] = alloca i16, align 2834// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8835// CHECK1-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 2836// CHECK1-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 2837// CHECK1-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 2838// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 8839// CHECK1-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 2840// CHECK1-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 2841// CHECK1-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 2842// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 0843// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 8844// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0845// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr [[TMP9]], i64 1846// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP9]], align 4847// CHECK1-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_get_warp_size()848// CHECK1-NEXT: [[TMP14:%.*]] = trunc i32 [[TMP13]] to i16849// CHECK1-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP12]], i16 [[TMP6]], i16 [[TMP14]])850// CHECK1-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 4851// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr i32, ptr [[TMP9]], i64 1852// CHECK1-NEXT: [[TMP17:%.*]] = getelementptr i32, ptr [[DOTOMP_REDUCTION_ELEMENT]], i64 1853// CHECK1-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 8854// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 1855// CHECK1-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 8856// CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 1857// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr i16, ptr [[TMP19]], i64 1858// CHECK1-NEXT: [[TMP22:%.*]] = load i16, ptr [[TMP19]], align 2859// CHECK1-NEXT: [[TMP23:%.*]] = sext i16 [[TMP22]] to i32860// CHECK1-NEXT: [[TMP24:%.*]] = call i32 @__kmpc_get_warp_size()861// CHECK1-NEXT: [[TMP25:%.*]] = trunc i32 [[TMP24]] to i16862// CHECK1-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP23]], i16 [[TMP6]], i16 [[TMP25]])863// CHECK1-NEXT: [[TMP27:%.*]] = trunc i32 [[TMP26]] to i16864// CHECK1-NEXT: store i16 [[TMP27]], ptr [[DOTOMP_REDUCTION_ELEMENT4]], align 2865// CHECK1-NEXT: [[TMP28:%.*]] = getelementptr i16, ptr [[TMP19]], i64 1866// CHECK1-NEXT: [[TMP29:%.*]] = getelementptr i16, ptr [[DOTOMP_REDUCTION_ELEMENT4]], i64 1867// CHECK1-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT4]], ptr [[TMP20]], align 8868// CHECK1-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 0869// CHECK1-NEXT: [[TMP31:%.*]] = icmp eq i16 [[TMP7]], 1870// CHECK1-NEXT: [[TMP32:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]871// CHECK1-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]]872// CHECK1-NEXT: [[TMP34:%.*]] = icmp eq i16 [[TMP7]], 2873// CHECK1-NEXT: [[TMP35:%.*]] = and i16 [[TMP5]], 1874// CHECK1-NEXT: [[TMP36:%.*]] = icmp eq i16 [[TMP35]], 0875// CHECK1-NEXT: [[TMP37:%.*]] = and i1 [[TMP34]], [[TMP36]]876// CHECK1-NEXT: [[TMP38:%.*]] = icmp sgt i16 [[TMP6]], 0877// CHECK1-NEXT: [[TMP39:%.*]] = and i1 [[TMP37]], [[TMP38]]878// CHECK1-NEXT: [[TMP40:%.*]] = or i1 [[TMP30]], [[TMP33]]879// CHECK1-NEXT: [[TMP41:%.*]] = or i1 [[TMP40]], [[TMP39]]880// CHECK1-NEXT: br i1 [[TMP41]], label [[THEN:%.*]], label [[ELSE:%.*]]881// CHECK1: then:882// CHECK1-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]883// CHECK1-NEXT: br label [[IFCONT:%.*]]884// CHECK1: else:885// CHECK1-NEXT: br label [[IFCONT]]886// CHECK1: ifcont:887// CHECK1-NEXT: [[TMP42:%.*]] = icmp eq i16 [[TMP7]], 1888// CHECK1-NEXT: [[TMP43:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]889// CHECK1-NEXT: [[TMP44:%.*]] = and i1 [[TMP42]], [[TMP43]]890// CHECK1-NEXT: br i1 [[TMP44]], label [[THEN5:%.*]], label [[ELSE6:%.*]]891// CHECK1: then5:892// CHECK1-NEXT: [[TMP45:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0893// CHECK1-NEXT: [[TMP46:%.*]] = load ptr, ptr [[TMP45]], align 8894// CHECK1-NEXT: [[TMP47:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 0895// CHECK1-NEXT: [[TMP48:%.*]] = load ptr, ptr [[TMP47]], align 8896// CHECK1-NEXT: [[TMP49:%.*]] = load i32, ptr [[TMP46]], align 4897// CHECK1-NEXT: store i32 [[TMP49]], ptr [[TMP48]], align 4898// CHECK1-NEXT: [[TMP50:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 1899// CHECK1-NEXT: [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 8900// CHECK1-NEXT: [[TMP52:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 1901// CHECK1-NEXT: [[TMP53:%.*]] = load ptr, ptr [[TMP52]], align 8902// CHECK1-NEXT: [[TMP54:%.*]] = load i16, ptr [[TMP51]], align 2903// CHECK1-NEXT: store i16 [[TMP54]], ptr [[TMP53]], align 2904// CHECK1-NEXT: br label [[IFCONT7:%.*]]905// CHECK1: else6:906// CHECK1-NEXT: br label [[IFCONT7]]907// CHECK1: ifcont7:908// CHECK1-NEXT: ret void909//910//911// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func8912// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {913// CHECK1-NEXT: entry:914// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8915// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4916// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8917// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 4918// CHECK1-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()919// CHECK1-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()920// CHECK1-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 31921// CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()922// CHECK1-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 5923// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 8924// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])925// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])926// CHECK1-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 0927// CHECK1-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]928// CHECK1: then:929// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 0930// CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 8931// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]932// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP8]], align 4933// CHECK1-NEXT: store volatile i32 [[TMP10]], ptr addrspace(3) [[TMP9]], align 4934// CHECK1-NEXT: br label [[IFCONT:%.*]]935// CHECK1: else:936// CHECK1-NEXT: br label [[IFCONT]]937// CHECK1: ifcont:938// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])939// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])940// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTADDR1]], align 4941// CHECK1-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP11]]942// CHECK1-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]943// CHECK1: then3:944// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]945// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 0946// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 8947// CHECK1-NEXT: [[TMP15:%.*]] = load volatile i32, ptr addrspace(3) [[TMP12]], align 4948// CHECK1-NEXT: store i32 [[TMP15]], ptr [[TMP14]], align 4949// CHECK1-NEXT: br label [[IFCONT4:%.*]]950// CHECK1: else4:951// CHECK1-NEXT: br label [[IFCONT4]]952// CHECK1: ifcont5:953// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])954// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])955// CHECK1-NEXT: [[WARP_MASTER5:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 0956// CHECK1-NEXT: br i1 [[WARP_MASTER5]], label [[THEN6:%.*]], label [[ELSE7:%.*]]957// CHECK1: then8:958// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 1959// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 8960// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]961// CHECK1-NEXT: [[TMP19:%.*]] = load i16, ptr [[TMP17]], align 2962// CHECK1-NEXT: store volatile i16 [[TMP19]], ptr addrspace(3) [[TMP18]], align 2963// CHECK1-NEXT: br label [[IFCONT8:%.*]]964// CHECK1: else9:965// CHECK1-NEXT: br label [[IFCONT8]]966// CHECK1: ifcont10:967// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])968// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])969// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTADDR1]], align 4970// CHECK1-NEXT: [[IS_ACTIVE_THREAD9:%.*]] = icmp ult i32 [[TMP3]], [[TMP20]]971// CHECK1-NEXT: br i1 [[IS_ACTIVE_THREAD9]], label [[THEN10:%.*]], label [[ELSE11:%.*]]972// CHECK1: then13:973// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]974// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 1975// CHECK1-NEXT: [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 8976// CHECK1-NEXT: [[TMP24:%.*]] = load volatile i16, ptr addrspace(3) [[TMP21]], align 2977// CHECK1-NEXT: store i16 [[TMP24]], ptr [[TMP23]], align 2978// CHECK1-NEXT: br label [[IFCONT12:%.*]]979// CHECK1: else14:980// CHECK1-NEXT: br label [[IFCONT12]]981// CHECK1: ifcont15:982// CHECK1-NEXT: ret void983//984//985// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func9986// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3]] {987// CHECK1-NEXT: entry:988// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 8989// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 2990// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 2991// CHECK1-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 2992// CHECK1-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [2 x ptr], align 8993// CHECK1-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca i32, align 4994// CHECK1-NEXT: [[DOTOMP_REDUCTION_ELEMENT4:%.*]] = alloca i16, align 2995// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 8996// CHECK1-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 2997// CHECK1-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 2998// CHECK1-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 2999// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 81000// CHECK1-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 21001// CHECK1-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 21002// CHECK1-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 21003// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 01004// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 81005// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 01006// CHECK1-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr [[TMP9]], i64 11007// CHECK1-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP9]], align 41008// CHECK1-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_get_warp_size()1009// CHECK1-NEXT: [[TMP14:%.*]] = trunc i32 [[TMP13]] to i161010// CHECK1-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP12]], i16 [[TMP6]], i16 [[TMP14]])1011// CHECK1-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 41012// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr i32, ptr [[TMP9]], i64 11013// CHECK1-NEXT: [[TMP17:%.*]] = getelementptr i32, ptr [[DOTOMP_REDUCTION_ELEMENT]], i64 11014// CHECK1-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 81015// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 11016// CHECK1-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 81017// CHECK1-NEXT: [[TMP20:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 11018// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr i16, ptr [[TMP19]], i64 11019// CHECK1-NEXT: [[TMP22:%.*]] = load i16, ptr [[TMP19]], align 21020// CHECK1-NEXT: [[TMP23:%.*]] = sext i16 [[TMP22]] to i321021// CHECK1-NEXT: [[TMP24:%.*]] = call i32 @__kmpc_get_warp_size()1022// CHECK1-NEXT: [[TMP25:%.*]] = trunc i32 [[TMP24]] to i161023// CHECK1-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP23]], i16 [[TMP6]], i16 [[TMP25]])1024// CHECK1-NEXT: [[TMP27:%.*]] = trunc i32 [[TMP26]] to i161025// CHECK1-NEXT: store i16 [[TMP27]], ptr [[DOTOMP_REDUCTION_ELEMENT4]], align 21026// CHECK1-NEXT: [[TMP28:%.*]] = getelementptr i16, ptr [[TMP19]], i64 11027// CHECK1-NEXT: [[TMP29:%.*]] = getelementptr i16, ptr [[DOTOMP_REDUCTION_ELEMENT4]], i64 11028// CHECK1-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT4]], ptr [[TMP20]], align 81029// CHECK1-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 01030// CHECK1-NEXT: [[TMP31:%.*]] = icmp eq i16 [[TMP7]], 11031// CHECK1-NEXT: [[TMP32:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]1032// CHECK1-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]]1033// CHECK1-NEXT: [[TMP34:%.*]] = icmp eq i16 [[TMP7]], 21034// CHECK1-NEXT: [[TMP35:%.*]] = and i16 [[TMP5]], 11035// CHECK1-NEXT: [[TMP36:%.*]] = icmp eq i16 [[TMP35]], 01036// CHECK1-NEXT: [[TMP37:%.*]] = and i1 [[TMP34]], [[TMP36]]1037// CHECK1-NEXT: [[TMP38:%.*]] = icmp sgt i16 [[TMP6]], 01038// CHECK1-NEXT: [[TMP39:%.*]] = and i1 [[TMP37]], [[TMP38]]1039// CHECK1-NEXT: [[TMP40:%.*]] = or i1 [[TMP30]], [[TMP33]]1040// CHECK1-NEXT: [[TMP41:%.*]] = or i1 [[TMP40]], [[TMP39]]1041// CHECK1-NEXT: br i1 [[TMP41]], label [[THEN:%.*]], label [[ELSE:%.*]]1042// CHECK1: then:1043// CHECK1-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]1044// CHECK1-NEXT: br label [[IFCONT:%.*]]1045// CHECK1: else:1046// CHECK1-NEXT: br label [[IFCONT]]1047// CHECK1: ifcont:1048// CHECK1-NEXT: [[TMP42:%.*]] = icmp eq i16 [[TMP7]], 11049// CHECK1-NEXT: [[TMP43:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]1050// CHECK1-NEXT: [[TMP44:%.*]] = and i1 [[TMP42]], [[TMP43]]1051// CHECK1-NEXT: br i1 [[TMP44]], label [[THEN5:%.*]], label [[ELSE6:%.*]]1052// CHECK1: then5:1053// CHECK1-NEXT: [[TMP45:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 01054// CHECK1-NEXT: [[TMP46:%.*]] = load ptr, ptr [[TMP45]], align 81055// CHECK1-NEXT: [[TMP47:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 01056// CHECK1-NEXT: [[TMP48:%.*]] = load ptr, ptr [[TMP47]], align 81057// CHECK1-NEXT: [[TMP49:%.*]] = load i32, ptr [[TMP46]], align 41058// CHECK1-NEXT: store i32 [[TMP49]], ptr [[TMP48]], align 41059// CHECK1-NEXT: [[TMP50:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 11060// CHECK1-NEXT: [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 81061// CHECK1-NEXT: [[TMP52:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i64 0, i64 11062// CHECK1-NEXT: [[TMP53:%.*]] = load ptr, ptr [[TMP52]], align 81063// CHECK1-NEXT: [[TMP54:%.*]] = load i16, ptr [[TMP51]], align 21064// CHECK1-NEXT: store i16 [[TMP54]], ptr [[TMP53]], align 21065// CHECK1-NEXT: br label [[IFCONT7:%.*]]1066// CHECK1: else6:1067// CHECK1-NEXT: br label [[IFCONT7]]1068// CHECK1: ifcont7:1069// CHECK1-NEXT: ret void1070//1071//1072// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func101073// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {1074// CHECK1-NEXT: entry:1075// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81076// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41077// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81078// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41079// CHECK1-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()1080// CHECK1-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()1081// CHECK1-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 311082// CHECK1-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()1083// CHECK1-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 51084// CHECK1-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 81085// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1086// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])1087// CHECK1-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 01088// CHECK1-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]1089// CHECK1: then:1090// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 01091// CHECK1-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 81092// CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]1093// CHECK1-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP8]], align 41094// CHECK1-NEXT: store volatile i32 [[TMP10]], ptr addrspace(3) [[TMP9]], align 41095// CHECK1-NEXT: br label [[IFCONT:%.*]]1096// CHECK1: else:1097// CHECK1-NEXT: br label [[IFCONT]]1098// CHECK1: ifcont:1099// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1100// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])1101// CHECK1-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTADDR1]], align 41102// CHECK1-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP11]]1103// CHECK1-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]1104// CHECK1: then3:1105// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]1106// CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 01107// CHECK1-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 81108// CHECK1-NEXT: [[TMP15:%.*]] = load volatile i32, ptr addrspace(3) [[TMP12]], align 41109// CHECK1-NEXT: store i32 [[TMP15]], ptr [[TMP14]], align 41110// CHECK1-NEXT: br label [[IFCONT4:%.*]]1111// CHECK1: else4:1112// CHECK1-NEXT: br label [[IFCONT4]]1113// CHECK1: ifcont5:1114// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1115// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])1116// CHECK1-NEXT: [[WARP_MASTER5:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 01117// CHECK1-NEXT: br i1 [[WARP_MASTER5]], label [[THEN6:%.*]], label [[ELSE7:%.*]]1118// CHECK1: then8:1119// CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 11120// CHECK1-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 81121// CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]1122// CHECK1-NEXT: [[TMP19:%.*]] = load i16, ptr [[TMP17]], align 21123// CHECK1-NEXT: store volatile i16 [[TMP19]], ptr addrspace(3) [[TMP18]], align 21124// CHECK1-NEXT: br label [[IFCONT8:%.*]]1125// CHECK1: else9:1126// CHECK1-NEXT: br label [[IFCONT8]]1127// CHECK1: ifcont10:1128// CHECK1-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1129// CHECK1-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])1130// CHECK1-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTADDR1]], align 41131// CHECK1-NEXT: [[IS_ACTIVE_THREAD9:%.*]] = icmp ult i32 [[TMP3]], [[TMP20]]1132// CHECK1-NEXT: br i1 [[IS_ACTIVE_THREAD9]], label [[THEN10:%.*]], label [[ELSE11:%.*]]1133// CHECK1: then13:1134// CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]1135// CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i64 0, i64 11136// CHECK1-NEXT: [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 81137// CHECK1-NEXT: [[TMP24:%.*]] = load volatile i16, ptr addrspace(3) [[TMP21]], align 21138// CHECK1-NEXT: store i16 [[TMP24]], ptr [[TMP23]], align 21139// CHECK1-NEXT: br label [[IFCONT12:%.*]]1140// CHECK1: else14:1141// CHECK1-NEXT: br label [[IFCONT12]]1142// CHECK1: ifcont15:1143// CHECK1-NEXT: ret void1144//1145//1146// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_copy_func111147// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1148// CHECK1-NEXT: entry:1149// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81150// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41151// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 81152// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81153// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41154// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 81155// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 81156// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 81157// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 41158// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 01159// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81160// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP4]], i32 [[TMP5]]1161// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 01162// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP7]], align 41163// CHECK1-NEXT: store i32 [[TMP9]], ptr [[A]], align 41164// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 11165// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 81166// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP4]], i32 [[TMP5]]1167// CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP12]], i32 0, i32 11168// CHECK1-NEXT: [[TMP13:%.*]] = load i16, ptr [[TMP11]], align 21169// CHECK1-NEXT: store i16 [[TMP13]], ptr [[B]], align 21170// CHECK1-NEXT: ret void1171//1172//1173// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_reduce_func121174// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1175// CHECK1-NEXT: entry:1176// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81177// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41178// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 81179// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 81180// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81181// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41182// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 81183// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 81184// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 41185// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01186// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP3]], i32 [[TMP4]]1187// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP6]], i32 0, i32 01188// CHECK1-NEXT: store ptr [[A]], ptr [[TMP5]], align 81189// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 11190// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP3]], i32 [[TMP4]]1191// CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 11192// CHECK1-NEXT: store ptr [[B]], ptr [[TMP7]], align 81193// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 81194// CHECK1-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp$reduction$reduction_func"(ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr [[TMP9]]) #[[ATTR4]]1195// CHECK1-NEXT: ret void1196//1197//1198// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_copy_func131199// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1200// CHECK1-NEXT: entry:1201// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81202// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41203// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 81204// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81205// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41206// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 81207// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 81208// CHECK1-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 81209// CHECK1-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 41210// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 01211// CHECK1-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 81212// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP4]], i32 [[TMP5]]1213// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 01214// CHECK1-NEXT: [[TMP9:%.*]] = load i32, ptr [[A]], align 41215// CHECK1-NEXT: store i32 [[TMP9]], ptr [[TMP7]], align 41216// CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i64 0, i64 11217// CHECK1-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 81218// CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP4]], i32 [[TMP5]]1219// CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP12]], i32 0, i32 11220// CHECK1-NEXT: [[TMP13:%.*]] = load i16, ptr [[B]], align 21221// CHECK1-NEXT: store i16 [[TMP13]], ptr [[TMP11]], align 21222// CHECK1-NEXT: ret void1223//1224//1225// CHECK1-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_reduce_func141226// CHECK1-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1227// CHECK1-NEXT: entry:1228// CHECK1-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 81229// CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41230// CHECK1-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 81231// CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 81232// CHECK1-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 81233// CHECK1-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41234// CHECK1-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 81235// CHECK1-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 81236// CHECK1-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 41237// CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 01238// CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP3]], i32 [[TMP4]]1239// CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP6]], i32 0, i32 01240// CHECK1-NEXT: store ptr [[A]], ptr [[TMP5]], align 81241// CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 11242// CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP3]], i32 [[TMP4]]1243// CHECK1-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 11244// CHECK1-NEXT: store ptr [[B]], ptr [[TMP7]], align 81245// CHECK1-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 81246// CHECK1-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP9]], ptr [[DOTOMP_REDUCTION_RED_LIST]]) #[[ATTR4]]1247// CHECK1-NEXT: ret void1248//1249//1250// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l201251// CHECK2-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[E:%.*]]) #[[ATTR0:[0-9]+]] {1252// CHECK2-NEXT: entry:1253// CHECK2-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 41254// CHECK2-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 41255// CHECK2-NEXT: [[E1:%.*]] = alloca double, align 81256// CHECK2-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 41257// CHECK2-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 41258// CHECK2-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 41259// CHECK2-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 41260// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 41261// CHECK2-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_kernel_environment, ptr [[DYN_PTR]])1262// CHECK2-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP1]], -11263// CHECK2-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]1264// CHECK2: user_code.entry:1265// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])1266// CHECK2-NEXT: [[TMP3:%.*]] = load double, ptr [[TMP0]], align 81267// CHECK2-NEXT: store double [[TMP3]], ptr [[E1]], align 81268// CHECK2-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 41269// CHECK2-NEXT: store i32 [[TMP2]], ptr [[DOTTHREADID_TEMP_]], align 41270// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], ptr [[E1]]) #[[ATTR4:[0-9]+]]1271// CHECK2-NEXT: call void @__kmpc_target_deinit()1272// CHECK2-NEXT: ret void1273// CHECK2: worker.exit:1274// CHECK2-NEXT: ret void1275//1276//1277// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined1278// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[E:%.*]]) #[[ATTR1:[0-9]+]] {1279// CHECK2-NEXT: entry:1280// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41281// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41282// CHECK2-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 41283// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 41284// CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41285// CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41286// CHECK2-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 41287// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 41288// CHECK2-NEXT: [[E1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 8)1289// CHECK2-NEXT: store double 0.000000e+00, ptr [[E1]], align 81290// CHECK2-NEXT: [[TMP1:%.*]] = load double, ptr [[E1]], align 81291// CHECK2-NEXT: [[ADD:%.*]] = fadd double [[TMP1]], 5.000000e+001292// CHECK2-NEXT: store double [[ADD]], ptr [[E1]], align 81293// CHECK2-NEXT: [[TMP2:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 01294// CHECK2-NEXT: store ptr [[E1]], ptr [[TMP2]], align 41295// CHECK2-NEXT: %"_openmp_teams_reductions_buffer_$_$ptr" = call ptr @__kmpc_reduction_get_fixed_buffer()1296// CHECK2-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_nvptx_teams_reduce_nowait_v2(ptr @[[GLOB1]], ptr %"_openmp_teams_reductions_buffer_$_$ptr", i32 1024, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func, ptr @_omp_reduction_inter_warp_copy_func, ptr @_omp_reduction_list_to_global_copy_func, ptr @_omp_reduction_list_to_global_reduce_func, ptr @_omp_reduction_global_to_list_copy_func, ptr @_omp_reduction_global_to_list_reduce_func)1297// CHECK2-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 11298// CHECK2-NEXT: br i1 [[TMP4]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]1299// CHECK2: .omp.reduction.then:1300// CHECK2-NEXT: [[TMP5:%.*]] = load double, ptr [[TMP0]], align 81301// CHECK2-NEXT: [[TMP6:%.*]] = load double, ptr [[E1]], align 81302// CHECK2-NEXT: [[ADD2:%.*]] = fadd double [[TMP5]], [[TMP6]]1303// CHECK2-NEXT: store double [[ADD2]], ptr [[TMP0]], align 81304// CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DONE]]1305// CHECK2: .omp.reduction.done:1306// CHECK2-NEXT: call void @__kmpc_free_shared(ptr [[E1]], i32 8)1307// CHECK2-NEXT: ret void1308//1309//1310// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func1311// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3:[0-9]+]] {1312// CHECK2-NEXT: entry:1313// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41314// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 21315// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 21316// CHECK2-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 21317// CHECK2-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [1 x ptr], align 41318// CHECK2-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca double, align 81319// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41320// CHECK2-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 21321// CHECK2-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 21322// CHECK2-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 21323// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 41324// CHECK2-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 21325// CHECK2-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 21326// CHECK2-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 21327// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i32 0, i32 01328// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 41329// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 01330// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr double, ptr [[TMP9]], i32 11331// CHECK2-NEXT: [[TMP12:%.*]] = load i64, ptr [[TMP9]], align 81332// CHECK2-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_get_warp_size()1333// CHECK2-NEXT: [[TMP14:%.*]] = trunc i32 [[TMP13]] to i161334// CHECK2-NEXT: [[TMP15:%.*]] = call i64 @__kmpc_shuffle_int64(i64 [[TMP12]], i16 [[TMP6]], i16 [[TMP14]])1335// CHECK2-NEXT: store i64 [[TMP15]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 81336// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr i64, ptr [[TMP9]], i32 11337// CHECK2-NEXT: [[TMP17:%.*]] = getelementptr i64, ptr [[DOTOMP_REDUCTION_ELEMENT]], i32 11338// CHECK2-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 41339// CHECK2-NEXT: [[TMP18:%.*]] = icmp eq i16 [[TMP7]], 01340// CHECK2-NEXT: [[TMP19:%.*]] = icmp eq i16 [[TMP7]], 11341// CHECK2-NEXT: [[TMP20:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]1342// CHECK2-NEXT: [[TMP21:%.*]] = and i1 [[TMP19]], [[TMP20]]1343// CHECK2-NEXT: [[TMP22:%.*]] = icmp eq i16 [[TMP7]], 21344// CHECK2-NEXT: [[TMP23:%.*]] = and i16 [[TMP5]], 11345// CHECK2-NEXT: [[TMP24:%.*]] = icmp eq i16 [[TMP23]], 01346// CHECK2-NEXT: [[TMP25:%.*]] = and i1 [[TMP22]], [[TMP24]]1347// CHECK2-NEXT: [[TMP26:%.*]] = icmp sgt i16 [[TMP6]], 01348// CHECK2-NEXT: [[TMP27:%.*]] = and i1 [[TMP25]], [[TMP26]]1349// CHECK2-NEXT: [[TMP28:%.*]] = or i1 [[TMP18]], [[TMP21]]1350// CHECK2-NEXT: [[TMP29:%.*]] = or i1 [[TMP28]], [[TMP27]]1351// CHECK2-NEXT: br i1 [[TMP29]], label [[THEN:%.*]], label [[ELSE:%.*]]1352// CHECK2: then:1353// CHECK2-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]1354// CHECK2-NEXT: br label [[IFCONT:%.*]]1355// CHECK2: else:1356// CHECK2-NEXT: br label [[IFCONT]]1357// CHECK2: ifcont:1358// CHECK2-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 11359// CHECK2-NEXT: [[TMP31:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]1360// CHECK2-NEXT: [[TMP32:%.*]] = and i1 [[TMP30]], [[TMP31]]1361// CHECK2-NEXT: br i1 [[TMP32]], label [[THEN4:%.*]], label [[ELSE5:%.*]]1362// CHECK2: then4:1363// CHECK2-NEXT: [[TMP33:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 01364// CHECK2-NEXT: [[TMP34:%.*]] = load ptr, ptr [[TMP33]], align 41365// CHECK2-NEXT: [[TMP35:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i32 0, i32 01366// CHECK2-NEXT: [[TMP36:%.*]] = load ptr, ptr [[TMP35]], align 41367// CHECK2-NEXT: [[TMP37:%.*]] = load double, ptr [[TMP34]], align 81368// CHECK2-NEXT: store double [[TMP37]], ptr [[TMP36]], align 81369// CHECK2-NEXT: br label [[IFCONT6:%.*]]1370// CHECK2: else5:1371// CHECK2-NEXT: br label [[IFCONT6]]1372// CHECK2: ifcont6:1373// CHECK2-NEXT: ret void1374//1375//1376// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func1377// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {1378// CHECK2-NEXT: entry:1379// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41380// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41381// CHECK2-NEXT: [[DOTCNT_ADDR:%.*]] = alloca i32, align 41382// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41383// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41384// CHECK2-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()1385// CHECK2-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()1386// CHECK2-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 311387// CHECK2-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()1388// CHECK2-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 51389// CHECK2-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 41390// CHECK2-NEXT: store i32 0, ptr [[DOTCNT_ADDR]], align 41391// CHECK2-NEXT: br label [[PRECOND:%.*]]1392// CHECK2: precond:1393// CHECK2-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTCNT_ADDR]], align 41394// CHECK2-NEXT: [[TMP8:%.*]] = icmp ult i32 [[TMP7]], 21395// CHECK2-NEXT: br i1 [[TMP8]], label [[BODY:%.*]], label [[EXIT:%.*]]1396// CHECK2: body:1397// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1398// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP2]])1399// CHECK2-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 01400// CHECK2-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]1401// CHECK2: then:1402// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP6]], i32 0, i32 01403// CHECK2-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 41404// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr [[TMP10]], i32 [[TMP7]]1405// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]1406// CHECK2-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP11]], align 41407// CHECK2-NEXT: store volatile i32 [[TMP13]], ptr addrspace(3) [[TMP12]], align 41408// CHECK2-NEXT: br label [[IFCONT:%.*]]1409// CHECK2: else:1410// CHECK2-NEXT: br label [[IFCONT]]1411// CHECK2: ifcont:1412// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1413// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])1414// CHECK2-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTADDR1]], align 41415// CHECK2-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP14]]1416// CHECK2-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]1417// CHECK2: then3:1418// CHECK2-NEXT: [[TMP15:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]1419// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP6]], i32 0, i32 01420// CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 41421// CHECK2-NEXT: [[TMP18:%.*]] = getelementptr i32, ptr [[TMP17]], i32 [[TMP7]]1422// CHECK2-NEXT: [[TMP19:%.*]] = load volatile i32, ptr addrspace(3) [[TMP15]], align 41423// CHECK2-NEXT: store i32 [[TMP19]], ptr [[TMP18]], align 41424// CHECK2-NEXT: br label [[IFCONT4:%.*]]1425// CHECK2: else4:1426// CHECK2-NEXT: br label [[IFCONT4]]1427// CHECK2: ifcont5:1428// CHECK2-NEXT: [[TMP20:%.*]] = add nsw i32 [[TMP7]], 11429// CHECK2-NEXT: store i32 [[TMP20]], ptr [[DOTCNT_ADDR]], align 41430// CHECK2-NEXT: br label [[PRECOND]]1431// CHECK2: exit:1432// CHECK2-NEXT: ret void1433//1434//1435// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_copy_func1436// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1437// CHECK2-NEXT: entry:1438// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41439// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41440// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 41441// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41442// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41443// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 41444// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 41445// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 41446// CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 41447// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i32 0, i32 01448// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 41449// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP4]], i32 [[TMP5]]1450// CHECK2-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP8]], i32 0, i32 01451// CHECK2-NEXT: [[TMP9:%.*]] = load double, ptr [[TMP7]], align 81452// CHECK2-NEXT: store double [[TMP9]], ptr [[E]], align 81453// CHECK2-NEXT: ret void1454//1455//1456// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_reduce_func1457// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1458// CHECK2-NEXT: entry:1459// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41460// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41461// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 41462// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 41463// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41464// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41465// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 41466// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 41467// CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 41468// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 01469// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP3]], i32 [[TMP4]]1470// CHECK2-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP6]], i32 0, i32 01471// CHECK2-NEXT: store ptr [[E]], ptr [[TMP5]], align 41472// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTADDR2]], align 41473// CHECK2-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined_omp$reduction$reduction_func"(ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr [[TMP7]]) #[[ATTR4]]1474// CHECK2-NEXT: ret void1475//1476//1477// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_copy_func1478// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1479// CHECK2-NEXT: entry:1480// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41481// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41482// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 41483// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41484// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41485// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 41486// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 41487// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 41488// CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 41489// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i32 0, i32 01490// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 41491// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP4]], i32 [[TMP5]]1492// CHECK2-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP8]], i32 0, i32 01493// CHECK2-NEXT: [[TMP9:%.*]] = load double, ptr [[E]], align 81494// CHECK2-NEXT: store double [[TMP9]], ptr [[TMP7]], align 81495// CHECK2-NEXT: ret void1496//1497//1498// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_reduce_func1499// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1500// CHECK2-NEXT: entry:1501// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41502// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41503// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 41504// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 41505// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41506// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41507// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 41508// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 41509// CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 41510// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 01511// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP3]], i32 [[TMP4]]1512// CHECK2-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP6]], i32 0, i32 01513// CHECK2-NEXT: store ptr [[E]], ptr [[TMP5]], align 41514// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTADDR2]], align 41515// CHECK2-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP7]], ptr [[DOTOMP_REDUCTION_RED_LIST]]) #[[ATTR4]]1516// CHECK2-NEXT: ret void1517//1518//1519// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l261520// CHECK2-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i32 noundef [[C:%.*]], i32 noundef [[D:%.*]]) #[[ATTR0]] {1521// CHECK2-NEXT: entry:1522// CHECK2-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 41523// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca i32, align 41524// CHECK2-NEXT: [[D_ADDR:%.*]] = alloca i32, align 41525// CHECK2-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 41526// CHECK2-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 41527// CHECK2-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 41528// CHECK2-NEXT: store i32 [[C]], ptr [[C_ADDR]], align 41529// CHECK2-NEXT: store i32 [[D]], ptr [[D_ADDR]], align 41530// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_kernel_environment, ptr [[DYN_PTR]])1531// CHECK2-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -11532// CHECK2-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]1533// CHECK2: user_code.entry:1534// CHECK2-NEXT: [[TMP1:%.*]] = load i8, ptr [[C_ADDR]], align 11535// CHECK2-NEXT: [[C1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 1)1536// CHECK2-NEXT: store i8 [[TMP1]], ptr [[C1]], align 11537// CHECK2-NEXT: [[TMP2:%.*]] = load float, ptr [[D_ADDR]], align 41538// CHECK2-NEXT: [[D2:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 4)1539// CHECK2-NEXT: store float [[TMP2]], ptr [[D2]], align 41540// CHECK2-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1541// CHECK2-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 41542// CHECK2-NEXT: store i32 [[TMP3]], ptr [[DOTTHREADID_TEMP_]], align 41543// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], ptr [[C1]], ptr [[D2]]) #[[ATTR4]]1544// CHECK2-NEXT: call void @__kmpc_free_shared(ptr [[D2]], i32 4)1545// CHECK2-NEXT: call void @__kmpc_free_shared(ptr [[C1]], i32 1)1546// CHECK2-NEXT: call void @__kmpc_target_deinit()1547// CHECK2-NEXT: ret void1548// CHECK2: worker.exit:1549// CHECK2-NEXT: ret void1550//1551//1552// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined1553// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 1 dereferenceable(1) [[C:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) #[[ATTR1]] {1554// CHECK2-NEXT: entry:1555// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41556// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41557// CHECK2-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 41558// CHECK2-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 41559// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 41560// CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41561// CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41562// CHECK2-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 41563// CHECK2-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 41564// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 41565// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D_ADDR]], align 41566// CHECK2-NEXT: [[C1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 1)1567// CHECK2-NEXT: [[D2:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 4)1568// CHECK2-NEXT: store i8 0, ptr [[C1]], align 11569// CHECK2-NEXT: store float 1.000000e+00, ptr [[D2]], align 41570// CHECK2-NEXT: [[TMP2:%.*]] = load i8, ptr [[C1]], align 11571// CHECK2-NEXT: [[CONV:%.*]] = sext i8 [[TMP2]] to i321572// CHECK2-NEXT: [[XOR:%.*]] = xor i32 [[CONV]], 21573// CHECK2-NEXT: [[CONV3:%.*]] = trunc i32 [[XOR]] to i81574// CHECK2-NEXT: store i8 [[CONV3]], ptr [[C1]], align 11575// CHECK2-NEXT: [[TMP3:%.*]] = load float, ptr [[D2]], align 41576// CHECK2-NEXT: [[MUL:%.*]] = fmul float [[TMP3]], 3.300000e+011577// CHECK2-NEXT: store float [[MUL]], ptr [[D2]], align 41578// CHECK2-NEXT: [[TMP4:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 01579// CHECK2-NEXT: store ptr [[C1]], ptr [[TMP4]], align 41580// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 11581// CHECK2-NEXT: store ptr [[D2]], ptr [[TMP5]], align 41582// CHECK2-NEXT: %"_openmp_teams_reductions_buffer_$_$ptr" = call ptr @__kmpc_reduction_get_fixed_buffer()1583// CHECK2-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_nvptx_teams_reduce_nowait_v2(ptr @[[GLOB1]], ptr %"_openmp_teams_reductions_buffer_$_$ptr", i32 1024, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func1, ptr @_omp_reduction_inter_warp_copy_func2, ptr @_omp_reduction_list_to_global_copy_func3, ptr @_omp_reduction_list_to_global_reduce_func4, ptr @_omp_reduction_global_to_list_copy_func5, ptr @_omp_reduction_global_to_list_reduce_func6)1584// CHECK2-NEXT: [[TMP7:%.*]] = icmp eq i32 [[TMP6]], 11585// CHECK2-NEXT: br i1 [[TMP7]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]1586// CHECK2: .omp.reduction.then:1587// CHECK2-NEXT: [[TMP8:%.*]] = load i8, ptr [[TMP0]], align 11588// CHECK2-NEXT: [[CONV4:%.*]] = sext i8 [[TMP8]] to i321589// CHECK2-NEXT: [[TMP9:%.*]] = load i8, ptr [[C1]], align 11590// CHECK2-NEXT: [[CONV5:%.*]] = sext i8 [[TMP9]] to i321591// CHECK2-NEXT: [[XOR6:%.*]] = xor i32 [[CONV4]], [[CONV5]]1592// CHECK2-NEXT: [[CONV7:%.*]] = trunc i32 [[XOR6]] to i81593// CHECK2-NEXT: store i8 [[CONV7]], ptr [[TMP0]], align 11594// CHECK2-NEXT: [[TMP10:%.*]] = load float, ptr [[TMP1]], align 41595// CHECK2-NEXT: [[TMP11:%.*]] = load float, ptr [[D2]], align 41596// CHECK2-NEXT: [[MUL8:%.*]] = fmul float [[TMP10]], [[TMP11]]1597// CHECK2-NEXT: store float [[MUL8]], ptr [[TMP1]], align 41598// CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DONE]]1599// CHECK2: .omp.reduction.done:1600// CHECK2-NEXT: call void @__kmpc_free_shared(ptr [[D2]], i32 4)1601// CHECK2-NEXT: call void @__kmpc_free_shared(ptr [[C1]], i32 1)1602// CHECK2-NEXT: ret void1603//1604//1605// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func11606// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3]] {1607// CHECK2-NEXT: entry:1608// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41609// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 21610// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 21611// CHECK2-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 21612// CHECK2-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [2 x ptr], align 41613// CHECK2-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca i8, align 11614// CHECK2-NEXT: [[DOTOMP_REDUCTION_ELEMENT4:%.*]] = alloca float, align 41615// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41616// CHECK2-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 21617// CHECK2-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 21618// CHECK2-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 21619// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 41620// CHECK2-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 21621// CHECK2-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 21622// CHECK2-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 21623// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 01624// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 41625// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 01626// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP9]], i32 11627// CHECK2-NEXT: [[TMP12:%.*]] = load i8, ptr [[TMP9]], align 11628// CHECK2-NEXT: [[TMP13:%.*]] = sext i8 [[TMP12]] to i321629// CHECK2-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_get_warp_size()1630// CHECK2-NEXT: [[TMP15:%.*]] = trunc i32 [[TMP14]] to i161631// CHECK2-NEXT: [[TMP16:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP13]], i16 [[TMP6]], i16 [[TMP15]])1632// CHECK2-NEXT: [[TMP17:%.*]] = trunc i32 [[TMP16]] to i81633// CHECK2-NEXT: store i8 [[TMP17]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 11634// CHECK2-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP9]], i32 11635// CHECK2-NEXT: [[TMP19:%.*]] = getelementptr i8, ptr [[DOTOMP_REDUCTION_ELEMENT]], i32 11636// CHECK2-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 41637// CHECK2-NEXT: [[TMP20:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 11638// CHECK2-NEXT: [[TMP21:%.*]] = load ptr, ptr [[TMP20]], align 41639// CHECK2-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 11640// CHECK2-NEXT: [[TMP23:%.*]] = getelementptr float, ptr [[TMP21]], i32 11641// CHECK2-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP21]], align 41642// CHECK2-NEXT: [[TMP25:%.*]] = call i32 @__kmpc_get_warp_size()1643// CHECK2-NEXT: [[TMP26:%.*]] = trunc i32 [[TMP25]] to i161644// CHECK2-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP24]], i16 [[TMP6]], i16 [[TMP26]])1645// CHECK2-NEXT: store i32 [[TMP27]], ptr [[DOTOMP_REDUCTION_ELEMENT4]], align 41646// CHECK2-NEXT: [[TMP28:%.*]] = getelementptr i32, ptr [[TMP21]], i32 11647// CHECK2-NEXT: [[TMP29:%.*]] = getelementptr i32, ptr [[DOTOMP_REDUCTION_ELEMENT4]], i32 11648// CHECK2-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT4]], ptr [[TMP22]], align 41649// CHECK2-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 01650// CHECK2-NEXT: [[TMP31:%.*]] = icmp eq i16 [[TMP7]], 11651// CHECK2-NEXT: [[TMP32:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]1652// CHECK2-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]]1653// CHECK2-NEXT: [[TMP34:%.*]] = icmp eq i16 [[TMP7]], 21654// CHECK2-NEXT: [[TMP35:%.*]] = and i16 [[TMP5]], 11655// CHECK2-NEXT: [[TMP36:%.*]] = icmp eq i16 [[TMP35]], 01656// CHECK2-NEXT: [[TMP37:%.*]] = and i1 [[TMP34]], [[TMP36]]1657// CHECK2-NEXT: [[TMP38:%.*]] = icmp sgt i16 [[TMP6]], 01658// CHECK2-NEXT: [[TMP39:%.*]] = and i1 [[TMP37]], [[TMP38]]1659// CHECK2-NEXT: [[TMP40:%.*]] = or i1 [[TMP30]], [[TMP33]]1660// CHECK2-NEXT: [[TMP41:%.*]] = or i1 [[TMP40]], [[TMP39]]1661// CHECK2-NEXT: br i1 [[TMP41]], label [[THEN:%.*]], label [[ELSE:%.*]]1662// CHECK2: then:1663// CHECK2-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]1664// CHECK2-NEXT: br label [[IFCONT:%.*]]1665// CHECK2: else:1666// CHECK2-NEXT: br label [[IFCONT]]1667// CHECK2: ifcont:1668// CHECK2-NEXT: [[TMP42:%.*]] = icmp eq i16 [[TMP7]], 11669// CHECK2-NEXT: [[TMP43:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]1670// CHECK2-NEXT: [[TMP44:%.*]] = and i1 [[TMP42]], [[TMP43]]1671// CHECK2-NEXT: br i1 [[TMP44]], label [[THEN5:%.*]], label [[ELSE6:%.*]]1672// CHECK2: then5:1673// CHECK2-NEXT: [[TMP45:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 01674// CHECK2-NEXT: [[TMP46:%.*]] = load ptr, ptr [[TMP45]], align 41675// CHECK2-NEXT: [[TMP47:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 01676// CHECK2-NEXT: [[TMP48:%.*]] = load ptr, ptr [[TMP47]], align 41677// CHECK2-NEXT: [[TMP49:%.*]] = load i8, ptr [[TMP46]], align 11678// CHECK2-NEXT: store i8 [[TMP49]], ptr [[TMP48]], align 11679// CHECK2-NEXT: [[TMP50:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 11680// CHECK2-NEXT: [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 41681// CHECK2-NEXT: [[TMP52:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 11682// CHECK2-NEXT: [[TMP53:%.*]] = load ptr, ptr [[TMP52]], align 41683// CHECK2-NEXT: [[TMP54:%.*]] = load float, ptr [[TMP51]], align 41684// CHECK2-NEXT: store float [[TMP54]], ptr [[TMP53]], align 41685// CHECK2-NEXT: br label [[IFCONT7:%.*]]1686// CHECK2: else6:1687// CHECK2-NEXT: br label [[IFCONT7]]1688// CHECK2: ifcont7:1689// CHECK2-NEXT: ret void1690//1691//1692// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func21693// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {1694// CHECK2-NEXT: entry:1695// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41696// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41697// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41698// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41699// CHECK2-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()1700// CHECK2-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()1701// CHECK2-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 311702// CHECK2-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()1703// CHECK2-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 51704// CHECK2-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 41705// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1706// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])1707// CHECK2-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 01708// CHECK2-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]1709// CHECK2: then:1710// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 01711// CHECK2-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 41712// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]1713// CHECK2-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP8]], align 11714// CHECK2-NEXT: store volatile i8 [[TMP10]], ptr addrspace(3) [[TMP9]], align 11715// CHECK2-NEXT: br label [[IFCONT:%.*]]1716// CHECK2: else:1717// CHECK2-NEXT: br label [[IFCONT]]1718// CHECK2: ifcont:1719// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1720// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])1721// CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTADDR1]], align 41722// CHECK2-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP11]]1723// CHECK2-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]1724// CHECK2: then3:1725// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]1726// CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 01727// CHECK2-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 41728// CHECK2-NEXT: [[TMP15:%.*]] = load volatile i8, ptr addrspace(3) [[TMP12]], align 11729// CHECK2-NEXT: store i8 [[TMP15]], ptr [[TMP14]], align 11730// CHECK2-NEXT: br label [[IFCONT4:%.*]]1731// CHECK2: else4:1732// CHECK2-NEXT: br label [[IFCONT4]]1733// CHECK2: ifcont5:1734// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1735// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])1736// CHECK2-NEXT: [[WARP_MASTER5:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 01737// CHECK2-NEXT: br i1 [[WARP_MASTER5]], label [[THEN6:%.*]], label [[ELSE7:%.*]]1738// CHECK2: then8:1739// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 11740// CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 41741// CHECK2-NEXT: [[TMP18:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]1742// CHECK2-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP17]], align 41743// CHECK2-NEXT: store volatile i32 [[TMP19]], ptr addrspace(3) [[TMP18]], align 41744// CHECK2-NEXT: br label [[IFCONT8:%.*]]1745// CHECK2: else9:1746// CHECK2-NEXT: br label [[IFCONT8]]1747// CHECK2: ifcont10:1748// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1749// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])1750// CHECK2-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTADDR1]], align 41751// CHECK2-NEXT: [[IS_ACTIVE_THREAD9:%.*]] = icmp ult i32 [[TMP3]], [[TMP20]]1752// CHECK2-NEXT: br i1 [[IS_ACTIVE_THREAD9]], label [[THEN10:%.*]], label [[ELSE11:%.*]]1753// CHECK2: then13:1754// CHECK2-NEXT: [[TMP21:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]1755// CHECK2-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 11756// CHECK2-NEXT: [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 41757// CHECK2-NEXT: [[TMP24:%.*]] = load volatile i32, ptr addrspace(3) [[TMP21]], align 41758// CHECK2-NEXT: store i32 [[TMP24]], ptr [[TMP23]], align 41759// CHECK2-NEXT: br label [[IFCONT12:%.*]]1760// CHECK2: else14:1761// CHECK2-NEXT: br label [[IFCONT12]]1762// CHECK2: ifcont15:1763// CHECK2-NEXT: ret void1764//1765//1766// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_copy_func31767// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1768// CHECK2-NEXT: entry:1769// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41770// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41771// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 41772// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41773// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41774// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 41775// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 41776// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 41777// CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 41778// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 01779// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 41780// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP4]], i32 [[TMP5]]1781// CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 01782// CHECK2-NEXT: [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 11783// CHECK2-NEXT: store i8 [[TMP9]], ptr [[C]], align 11784// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 11785// CHECK2-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 41786// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP4]], i32 [[TMP5]]1787// CHECK2-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP12]], i32 0, i32 11788// CHECK2-NEXT: [[TMP13:%.*]] = load float, ptr [[TMP11]], align 41789// CHECK2-NEXT: store float [[TMP13]], ptr [[D]], align 41790// CHECK2-NEXT: ret void1791//1792//1793// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_reduce_func41794// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1795// CHECK2-NEXT: entry:1796// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41797// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41798// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 41799// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 41800// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41801// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41802// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 41803// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 41804// CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 41805// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 01806// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP3]], i32 [[TMP4]]1807// CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP6]], i32 0, i32 01808// CHECK2-NEXT: store ptr [[C]], ptr [[TMP5]], align 41809// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 11810// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP3]], i32 [[TMP4]]1811// CHECK2-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 11812// CHECK2-NEXT: store ptr [[D]], ptr [[TMP7]], align 41813// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 41814// CHECK2-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined_omp$reduction$reduction_func"(ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr [[TMP9]]) #[[ATTR4]]1815// CHECK2-NEXT: ret void1816//1817//1818// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_copy_func51819// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1820// CHECK2-NEXT: entry:1821// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41822// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41823// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 41824// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41825// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41826// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 41827// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 41828// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 41829// CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 41830// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 01831// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 41832// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP4]], i32 [[TMP5]]1833// CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 01834// CHECK2-NEXT: [[TMP9:%.*]] = load i8, ptr [[C]], align 11835// CHECK2-NEXT: store i8 [[TMP9]], ptr [[TMP7]], align 11836// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 11837// CHECK2-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 41838// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP4]], i32 [[TMP5]]1839// CHECK2-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP12]], i32 0, i32 11840// CHECK2-NEXT: [[TMP13:%.*]] = load float, ptr [[D]], align 41841// CHECK2-NEXT: store float [[TMP13]], ptr [[TMP11]], align 41842// CHECK2-NEXT: ret void1843//1844//1845// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_reduce_func61846// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {1847// CHECK2-NEXT: entry:1848// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 41849// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 41850// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 41851// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 41852// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 41853// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 41854// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 41855// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 41856// CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 41857// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 01858// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP3]], i32 [[TMP4]]1859// CHECK2-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP6]], i32 0, i32 01860// CHECK2-NEXT: store ptr [[C]], ptr [[TMP5]], align 41861// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 11862// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP3]], i32 [[TMP4]]1863// CHECK2-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 11864// CHECK2-NEXT: store ptr [[D]], ptr [[TMP7]], align 41865// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 41866// CHECK2-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP9]], ptr [[DOTOMP_REDUCTION_RED_LIST]]) #[[ATTR4]]1867// CHECK2-NEXT: ret void1868//1869//1870// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l331871// CHECK2-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {1872// CHECK2-NEXT: entry:1873// CHECK2-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 41874// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca i32, align 41875// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca i32, align 41876// CHECK2-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 41877// CHECK2-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 41878// CHECK2-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 41879// CHECK2-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 41880// CHECK2-NEXT: store i32 [[B]], ptr [[B_ADDR]], align 41881// CHECK2-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_kernel_environment, ptr [[DYN_PTR]])1882// CHECK2-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -11883// CHECK2-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]1884// CHECK2: user_code.entry:1885// CHECK2-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])1886// CHECK2-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 41887// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 41888// CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], ptr [[A_ADDR]], ptr [[B_ADDR]]) #[[ATTR4]]1889// CHECK2-NEXT: call void @__kmpc_target_deinit()1890// CHECK2-NEXT: ret void1891// CHECK2: worker.exit:1892// CHECK2-NEXT: ret void1893//1894//1895// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined1896// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 2 dereferenceable(2) [[B:%.*]]) #[[ATTR1]] {1897// CHECK2-NEXT: entry:1898// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41899// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41900// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 41901// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 41902// CHECK2-NEXT: [[A1:%.*]] = alloca i32, align 41903// CHECK2-NEXT: [[B2:%.*]] = alloca i16, align 21904// CHECK2-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 41905// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 41906// CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41907// CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41908// CHECK2-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 41909// CHECK2-NEXT: store ptr [[B]], ptr [[B_ADDR]], align 41910// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 41911// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[B_ADDR]], align 41912// CHECK2-NEXT: store i32 0, ptr [[A1]], align 41913// CHECK2-NEXT: store i16 -32768, ptr [[B2]], align 21914// CHECK2-NEXT: [[TMP2:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 01915// CHECK2-NEXT: store ptr [[A1]], ptr [[TMP2]], align 41916// CHECK2-NEXT: [[TMP3:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 11917// CHECK2-NEXT: store ptr [[B2]], ptr [[TMP3]], align 41918// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 41919// CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 41920// CHECK2-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP5]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)1921// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 01922// CHECK2-NEXT: store ptr [[A1]], ptr [[TMP6]], align 41923// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 11924// CHECK2-NEXT: store ptr [[B2]], ptr [[TMP7]], align 41925// CHECK2-NEXT: %"_openmp_teams_reductions_buffer_$_$ptr" = call ptr @__kmpc_reduction_get_fixed_buffer()1926// CHECK2-NEXT: [[TMP8:%.*]] = call i32 @__kmpc_nvptx_teams_reduce_nowait_v2(ptr @[[GLOB1]], ptr %"_openmp_teams_reductions_buffer_$_$ptr", i32 1024, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func9, ptr @_omp_reduction_inter_warp_copy_func10, ptr @_omp_reduction_list_to_global_copy_func11, ptr @_omp_reduction_list_to_global_reduce_func12, ptr @_omp_reduction_global_to_list_copy_func13, ptr @_omp_reduction_global_to_list_reduce_func14)1927// CHECK2-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 11928// CHECK2-NEXT: br i1 [[TMP9]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]1929// CHECK2: .omp.reduction.then:1930// CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP0]], align 41931// CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[A1]], align 41932// CHECK2-NEXT: [[OR:%.*]] = or i32 [[TMP10]], [[TMP11]]1933// CHECK2-NEXT: store i32 [[OR]], ptr [[TMP0]], align 41934// CHECK2-NEXT: [[TMP12:%.*]] = load i16, ptr [[TMP1]], align 21935// CHECK2-NEXT: [[CONV:%.*]] = sext i16 [[TMP12]] to i321936// CHECK2-NEXT: [[TMP13:%.*]] = load i16, ptr [[B2]], align 21937// CHECK2-NEXT: [[CONV3:%.*]] = sext i16 [[TMP13]] to i321938// CHECK2-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CONV]], [[CONV3]]1939// CHECK2-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1940// CHECK2: cond.true:1941// CHECK2-NEXT: [[TMP14:%.*]] = load i16, ptr [[TMP1]], align 21942// CHECK2-NEXT: br label [[COND_END:%.*]]1943// CHECK2: cond.false:1944// CHECK2-NEXT: [[TMP15:%.*]] = load i16, ptr [[B2]], align 21945// CHECK2-NEXT: br label [[COND_END]]1946// CHECK2: cond.end:1947// CHECK2-NEXT: [[COND:%.*]] = phi i16 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]1948// CHECK2-NEXT: store i16 [[COND]], ptr [[TMP1]], align 21949// CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DONE]]1950// CHECK2: .omp.reduction.done:1951// CHECK2-NEXT: ret void1952//1953//1954// CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp_outlined1955// CHECK2-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 2 dereferenceable(2) [[B:%.*]]) #[[ATTR1]] {1956// CHECK2-NEXT: entry:1957// CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 41958// CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 41959// CHECK2-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 41960// CHECK2-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 41961// CHECK2-NEXT: [[A1:%.*]] = alloca i32, align 41962// CHECK2-NEXT: [[B2:%.*]] = alloca i16, align 21963// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 41964// CHECK2-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 41965// CHECK2-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 41966// CHECK2-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 41967// CHECK2-NEXT: store ptr [[B]], ptr [[B_ADDR]], align 41968// CHECK2-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 41969// CHECK2-NEXT: [[TMP1:%.*]] = load ptr, ptr [[B_ADDR]], align 41970// CHECK2-NEXT: store i32 0, ptr [[A1]], align 41971// CHECK2-NEXT: store i16 -32768, ptr [[B2]], align 21972// CHECK2-NEXT: [[TMP2:%.*]] = load i32, ptr [[A1]], align 41973// CHECK2-NEXT: [[OR:%.*]] = or i32 [[TMP2]], 11974// CHECK2-NEXT: store i32 [[OR]], ptr [[A1]], align 41975// CHECK2-NEXT: [[TMP3:%.*]] = load i16, ptr [[B2]], align 21976// CHECK2-NEXT: [[CONV:%.*]] = sext i16 [[TMP3]] to i321977// CHECK2-NEXT: [[CMP:%.*]] = icmp sgt i32 99, [[CONV]]1978// CHECK2-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]1979// CHECK2: cond.true:1980// CHECK2-NEXT: br label [[COND_END:%.*]]1981// CHECK2: cond.false:1982// CHECK2-NEXT: [[TMP4:%.*]] = load i16, ptr [[B2]], align 21983// CHECK2-NEXT: [[CONV3:%.*]] = sext i16 [[TMP4]] to i321984// CHECK2-NEXT: br label [[COND_END]]1985// CHECK2: cond.end:1986// CHECK2-NEXT: [[COND:%.*]] = phi i32 [ 99, [[COND_TRUE]] ], [ [[CONV3]], [[COND_FALSE]] ]1987// CHECK2-NEXT: [[CONV4:%.*]] = trunc i32 [[COND]] to i161988// CHECK2-NEXT: store i16 [[CONV4]], ptr [[B2]], align 21989// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 01990// CHECK2-NEXT: store ptr [[A1]], ptr [[TMP5]], align 41991// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 11992// CHECK2-NEXT: store ptr [[B2]], ptr [[TMP6]], align 41993// CHECK2-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_nvptx_parallel_reduce_nowait_v2(ptr @[[GLOB1]], i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func7, ptr @_omp_reduction_inter_warp_copy_func8)1994// CHECK2-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 11995// CHECK2-NEXT: br i1 [[TMP8]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]1996// CHECK2: .omp.reduction.then:1997// CHECK2-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP0]], align 41998// CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[A1]], align 41999// CHECK2-NEXT: [[OR5:%.*]] = or i32 [[TMP9]], [[TMP10]]2000// CHECK2-NEXT: store i32 [[OR5]], ptr [[TMP0]], align 42001// CHECK2-NEXT: [[TMP11:%.*]] = load i16, ptr [[TMP1]], align 22002// CHECK2-NEXT: [[CONV6:%.*]] = sext i16 [[TMP11]] to i322003// CHECK2-NEXT: [[TMP12:%.*]] = load i16, ptr [[B2]], align 22004// CHECK2-NEXT: [[CONV7:%.*]] = sext i16 [[TMP12]] to i322005// CHECK2-NEXT: [[CMP8:%.*]] = icmp sgt i32 [[CONV6]], [[CONV7]]2006// CHECK2-NEXT: br i1 [[CMP8]], label [[COND_TRUE9:%.*]], label [[COND_FALSE10:%.*]]2007// CHECK2: cond.true9:2008// CHECK2-NEXT: [[TMP13:%.*]] = load i16, ptr [[TMP1]], align 22009// CHECK2-NEXT: br label [[COND_END11:%.*]]2010// CHECK2: cond.false10:2011// CHECK2-NEXT: [[TMP14:%.*]] = load i16, ptr [[B2]], align 22012// CHECK2-NEXT: br label [[COND_END11]]2013// CHECK2: cond.end11:2014// CHECK2-NEXT: [[COND12:%.*]] = phi i16 [ [[TMP13]], [[COND_TRUE9]] ], [ [[TMP14]], [[COND_FALSE10]] ]2015// CHECK2-NEXT: store i16 [[COND12]], ptr [[TMP1]], align 22016// CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DONE]]2017// CHECK2: .omp.reduction.done:2018// CHECK2-NEXT: ret void2019//2020//2021// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func72022// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3]] {2023// CHECK2-NEXT: entry:2024// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42025// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 22026// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 22027// CHECK2-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 22028// CHECK2-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [2 x ptr], align 42029// CHECK2-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca i32, align 42030// CHECK2-NEXT: [[DOTOMP_REDUCTION_ELEMENT4:%.*]] = alloca i16, align 22031// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42032// CHECK2-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 22033// CHECK2-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 22034// CHECK2-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 22035// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 42036// CHECK2-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 22037// CHECK2-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 22038// CHECK2-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 22039// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 02040// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 42041// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 02042// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr [[TMP9]], i32 12043// CHECK2-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP9]], align 42044// CHECK2-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_get_warp_size()2045// CHECK2-NEXT: [[TMP14:%.*]] = trunc i32 [[TMP13]] to i162046// CHECK2-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP12]], i16 [[TMP6]], i16 [[TMP14]])2047// CHECK2-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 42048// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr i32, ptr [[TMP9]], i32 12049// CHECK2-NEXT: [[TMP17:%.*]] = getelementptr i32, ptr [[DOTOMP_REDUCTION_ELEMENT]], i32 12050// CHECK2-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 42051// CHECK2-NEXT: [[TMP18:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 12052// CHECK2-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 42053// CHECK2-NEXT: [[TMP20:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 12054// CHECK2-NEXT: [[TMP21:%.*]] = getelementptr i16, ptr [[TMP19]], i32 12055// CHECK2-NEXT: [[TMP22:%.*]] = load i16, ptr [[TMP19]], align 22056// CHECK2-NEXT: [[TMP23:%.*]] = sext i16 [[TMP22]] to i322057// CHECK2-NEXT: [[TMP24:%.*]] = call i32 @__kmpc_get_warp_size()2058// CHECK2-NEXT: [[TMP25:%.*]] = trunc i32 [[TMP24]] to i162059// CHECK2-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP23]], i16 [[TMP6]], i16 [[TMP25]])2060// CHECK2-NEXT: [[TMP27:%.*]] = trunc i32 [[TMP26]] to i162061// CHECK2-NEXT: store i16 [[TMP27]], ptr [[DOTOMP_REDUCTION_ELEMENT4]], align 22062// CHECK2-NEXT: [[TMP28:%.*]] = getelementptr i16, ptr [[TMP19]], i32 12063// CHECK2-NEXT: [[TMP29:%.*]] = getelementptr i16, ptr [[DOTOMP_REDUCTION_ELEMENT4]], i32 12064// CHECK2-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT4]], ptr [[TMP20]], align 42065// CHECK2-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 02066// CHECK2-NEXT: [[TMP31:%.*]] = icmp eq i16 [[TMP7]], 12067// CHECK2-NEXT: [[TMP32:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]2068// CHECK2-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]]2069// CHECK2-NEXT: [[TMP34:%.*]] = icmp eq i16 [[TMP7]], 22070// CHECK2-NEXT: [[TMP35:%.*]] = and i16 [[TMP5]], 12071// CHECK2-NEXT: [[TMP36:%.*]] = icmp eq i16 [[TMP35]], 02072// CHECK2-NEXT: [[TMP37:%.*]] = and i1 [[TMP34]], [[TMP36]]2073// CHECK2-NEXT: [[TMP38:%.*]] = icmp sgt i16 [[TMP6]], 02074// CHECK2-NEXT: [[TMP39:%.*]] = and i1 [[TMP37]], [[TMP38]]2075// CHECK2-NEXT: [[TMP40:%.*]] = or i1 [[TMP30]], [[TMP33]]2076// CHECK2-NEXT: [[TMP41:%.*]] = or i1 [[TMP40]], [[TMP39]]2077// CHECK2-NEXT: br i1 [[TMP41]], label [[THEN:%.*]], label [[ELSE:%.*]]2078// CHECK2: then:2079// CHECK2-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]2080// CHECK2-NEXT: br label [[IFCONT:%.*]]2081// CHECK2: else:2082// CHECK2-NEXT: br label [[IFCONT]]2083// CHECK2: ifcont:2084// CHECK2-NEXT: [[TMP42:%.*]] = icmp eq i16 [[TMP7]], 12085// CHECK2-NEXT: [[TMP43:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]2086// CHECK2-NEXT: [[TMP44:%.*]] = and i1 [[TMP42]], [[TMP43]]2087// CHECK2-NEXT: br i1 [[TMP44]], label [[THEN5:%.*]], label [[ELSE6:%.*]]2088// CHECK2: then5:2089// CHECK2-NEXT: [[TMP45:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 02090// CHECK2-NEXT: [[TMP46:%.*]] = load ptr, ptr [[TMP45]], align 42091// CHECK2-NEXT: [[TMP47:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 02092// CHECK2-NEXT: [[TMP48:%.*]] = load ptr, ptr [[TMP47]], align 42093// CHECK2-NEXT: [[TMP49:%.*]] = load i32, ptr [[TMP46]], align 42094// CHECK2-NEXT: store i32 [[TMP49]], ptr [[TMP48]], align 42095// CHECK2-NEXT: [[TMP50:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 12096// CHECK2-NEXT: [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 42097// CHECK2-NEXT: [[TMP52:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 12098// CHECK2-NEXT: [[TMP53:%.*]] = load ptr, ptr [[TMP52]], align 42099// CHECK2-NEXT: [[TMP54:%.*]] = load i16, ptr [[TMP51]], align 22100// CHECK2-NEXT: store i16 [[TMP54]], ptr [[TMP53]], align 22101// CHECK2-NEXT: br label [[IFCONT7:%.*]]2102// CHECK2: else6:2103// CHECK2-NEXT: br label [[IFCONT7]]2104// CHECK2: ifcont7:2105// CHECK2-NEXT: ret void2106//2107//2108// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func82109// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {2110// CHECK2-NEXT: entry:2111// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42112// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42113// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42114// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42115// CHECK2-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2116// CHECK2-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2117// CHECK2-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 312118// CHECK2-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2119// CHECK2-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 52120// CHECK2-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 42121// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2122// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2123// CHECK2-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 02124// CHECK2-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]2125// CHECK2: then:2126// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 02127// CHECK2-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 42128// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]2129// CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP8]], align 42130// CHECK2-NEXT: store volatile i32 [[TMP10]], ptr addrspace(3) [[TMP9]], align 42131// CHECK2-NEXT: br label [[IFCONT:%.*]]2132// CHECK2: else:2133// CHECK2-NEXT: br label [[IFCONT]]2134// CHECK2: ifcont:2135// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2136// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2137// CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTADDR1]], align 42138// CHECK2-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP11]]2139// CHECK2-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]2140// CHECK2: then3:2141// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]2142// CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 02143// CHECK2-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 42144// CHECK2-NEXT: [[TMP15:%.*]] = load volatile i32, ptr addrspace(3) [[TMP12]], align 42145// CHECK2-NEXT: store i32 [[TMP15]], ptr [[TMP14]], align 42146// CHECK2-NEXT: br label [[IFCONT4:%.*]]2147// CHECK2: else4:2148// CHECK2-NEXT: br label [[IFCONT4]]2149// CHECK2: ifcont5:2150// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2151// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2152// CHECK2-NEXT: [[WARP_MASTER5:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 02153// CHECK2-NEXT: br i1 [[WARP_MASTER5]], label [[THEN6:%.*]], label [[ELSE7:%.*]]2154// CHECK2: then8:2155// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 12156// CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 42157// CHECK2-NEXT: [[TMP18:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]2158// CHECK2-NEXT: [[TMP19:%.*]] = load i16, ptr [[TMP17]], align 22159// CHECK2-NEXT: store volatile i16 [[TMP19]], ptr addrspace(3) [[TMP18]], align 22160// CHECK2-NEXT: br label [[IFCONT8:%.*]]2161// CHECK2: else9:2162// CHECK2-NEXT: br label [[IFCONT8]]2163// CHECK2: ifcont10:2164// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2165// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2166// CHECK2-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTADDR1]], align 42167// CHECK2-NEXT: [[IS_ACTIVE_THREAD9:%.*]] = icmp ult i32 [[TMP3]], [[TMP20]]2168// CHECK2-NEXT: br i1 [[IS_ACTIVE_THREAD9]], label [[THEN10:%.*]], label [[ELSE11:%.*]]2169// CHECK2: then13:2170// CHECK2-NEXT: [[TMP21:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]2171// CHECK2-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 12172// CHECK2-NEXT: [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 42173// CHECK2-NEXT: [[TMP24:%.*]] = load volatile i16, ptr addrspace(3) [[TMP21]], align 22174// CHECK2-NEXT: store i16 [[TMP24]], ptr [[TMP23]], align 22175// CHECK2-NEXT: br label [[IFCONT12:%.*]]2176// CHECK2: else14:2177// CHECK2-NEXT: br label [[IFCONT12]]2178// CHECK2: ifcont15:2179// CHECK2-NEXT: ret void2180//2181//2182// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func92183// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3]] {2184// CHECK2-NEXT: entry:2185// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42186// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 22187// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 22188// CHECK2-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 22189// CHECK2-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [2 x ptr], align 42190// CHECK2-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca i32, align 42191// CHECK2-NEXT: [[DOTOMP_REDUCTION_ELEMENT4:%.*]] = alloca i16, align 22192// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42193// CHECK2-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 22194// CHECK2-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 22195// CHECK2-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 22196// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 42197// CHECK2-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 22198// CHECK2-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 22199// CHECK2-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 22200// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 02201// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 42202// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 02203// CHECK2-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr [[TMP9]], i32 12204// CHECK2-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP9]], align 42205// CHECK2-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_get_warp_size()2206// CHECK2-NEXT: [[TMP14:%.*]] = trunc i32 [[TMP13]] to i162207// CHECK2-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP12]], i16 [[TMP6]], i16 [[TMP14]])2208// CHECK2-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 42209// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr i32, ptr [[TMP9]], i32 12210// CHECK2-NEXT: [[TMP17:%.*]] = getelementptr i32, ptr [[DOTOMP_REDUCTION_ELEMENT]], i32 12211// CHECK2-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 42212// CHECK2-NEXT: [[TMP18:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 12213// CHECK2-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 42214// CHECK2-NEXT: [[TMP20:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 12215// CHECK2-NEXT: [[TMP21:%.*]] = getelementptr i16, ptr [[TMP19]], i32 12216// CHECK2-NEXT: [[TMP22:%.*]] = load i16, ptr [[TMP19]], align 22217// CHECK2-NEXT: [[TMP23:%.*]] = sext i16 [[TMP22]] to i322218// CHECK2-NEXT: [[TMP24:%.*]] = call i32 @__kmpc_get_warp_size()2219// CHECK2-NEXT: [[TMP25:%.*]] = trunc i32 [[TMP24]] to i162220// CHECK2-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP23]], i16 [[TMP6]], i16 [[TMP25]])2221// CHECK2-NEXT: [[TMP27:%.*]] = trunc i32 [[TMP26]] to i162222// CHECK2-NEXT: store i16 [[TMP27]], ptr [[DOTOMP_REDUCTION_ELEMENT4]], align 22223// CHECK2-NEXT: [[TMP28:%.*]] = getelementptr i16, ptr [[TMP19]], i32 12224// CHECK2-NEXT: [[TMP29:%.*]] = getelementptr i16, ptr [[DOTOMP_REDUCTION_ELEMENT4]], i32 12225// CHECK2-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT4]], ptr [[TMP20]], align 42226// CHECK2-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 02227// CHECK2-NEXT: [[TMP31:%.*]] = icmp eq i16 [[TMP7]], 12228// CHECK2-NEXT: [[TMP32:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]2229// CHECK2-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]]2230// CHECK2-NEXT: [[TMP34:%.*]] = icmp eq i16 [[TMP7]], 22231// CHECK2-NEXT: [[TMP35:%.*]] = and i16 [[TMP5]], 12232// CHECK2-NEXT: [[TMP36:%.*]] = icmp eq i16 [[TMP35]], 02233// CHECK2-NEXT: [[TMP37:%.*]] = and i1 [[TMP34]], [[TMP36]]2234// CHECK2-NEXT: [[TMP38:%.*]] = icmp sgt i16 [[TMP6]], 02235// CHECK2-NEXT: [[TMP39:%.*]] = and i1 [[TMP37]], [[TMP38]]2236// CHECK2-NEXT: [[TMP40:%.*]] = or i1 [[TMP30]], [[TMP33]]2237// CHECK2-NEXT: [[TMP41:%.*]] = or i1 [[TMP40]], [[TMP39]]2238// CHECK2-NEXT: br i1 [[TMP41]], label [[THEN:%.*]], label [[ELSE:%.*]]2239// CHECK2: then:2240// CHECK2-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]2241// CHECK2-NEXT: br label [[IFCONT:%.*]]2242// CHECK2: else:2243// CHECK2-NEXT: br label [[IFCONT]]2244// CHECK2: ifcont:2245// CHECK2-NEXT: [[TMP42:%.*]] = icmp eq i16 [[TMP7]], 12246// CHECK2-NEXT: [[TMP43:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]2247// CHECK2-NEXT: [[TMP44:%.*]] = and i1 [[TMP42]], [[TMP43]]2248// CHECK2-NEXT: br i1 [[TMP44]], label [[THEN5:%.*]], label [[ELSE6:%.*]]2249// CHECK2: then5:2250// CHECK2-NEXT: [[TMP45:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 02251// CHECK2-NEXT: [[TMP46:%.*]] = load ptr, ptr [[TMP45]], align 42252// CHECK2-NEXT: [[TMP47:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 02253// CHECK2-NEXT: [[TMP48:%.*]] = load ptr, ptr [[TMP47]], align 42254// CHECK2-NEXT: [[TMP49:%.*]] = load i32, ptr [[TMP46]], align 42255// CHECK2-NEXT: store i32 [[TMP49]], ptr [[TMP48]], align 42256// CHECK2-NEXT: [[TMP50:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 12257// CHECK2-NEXT: [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 42258// CHECK2-NEXT: [[TMP52:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 12259// CHECK2-NEXT: [[TMP53:%.*]] = load ptr, ptr [[TMP52]], align 42260// CHECK2-NEXT: [[TMP54:%.*]] = load i16, ptr [[TMP51]], align 22261// CHECK2-NEXT: store i16 [[TMP54]], ptr [[TMP53]], align 22262// CHECK2-NEXT: br label [[IFCONT7:%.*]]2263// CHECK2: else6:2264// CHECK2-NEXT: br label [[IFCONT7]]2265// CHECK2: ifcont7:2266// CHECK2-NEXT: ret void2267//2268//2269// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func102270// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {2271// CHECK2-NEXT: entry:2272// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42273// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42274// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42275// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42276// CHECK2-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2277// CHECK2-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2278// CHECK2-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 312279// CHECK2-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2280// CHECK2-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 52281// CHECK2-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 42282// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2283// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2284// CHECK2-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 02285// CHECK2-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]2286// CHECK2: then:2287// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 02288// CHECK2-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 42289// CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]2290// CHECK2-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP8]], align 42291// CHECK2-NEXT: store volatile i32 [[TMP10]], ptr addrspace(3) [[TMP9]], align 42292// CHECK2-NEXT: br label [[IFCONT:%.*]]2293// CHECK2: else:2294// CHECK2-NEXT: br label [[IFCONT]]2295// CHECK2: ifcont:2296// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2297// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2298// CHECK2-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTADDR1]], align 42299// CHECK2-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP11]]2300// CHECK2-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]2301// CHECK2: then3:2302// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]2303// CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 02304// CHECK2-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 42305// CHECK2-NEXT: [[TMP15:%.*]] = load volatile i32, ptr addrspace(3) [[TMP12]], align 42306// CHECK2-NEXT: store i32 [[TMP15]], ptr [[TMP14]], align 42307// CHECK2-NEXT: br label [[IFCONT4:%.*]]2308// CHECK2: else4:2309// CHECK2-NEXT: br label [[IFCONT4]]2310// CHECK2: ifcont5:2311// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2312// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2313// CHECK2-NEXT: [[WARP_MASTER5:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 02314// CHECK2-NEXT: br i1 [[WARP_MASTER5]], label [[THEN6:%.*]], label [[ELSE7:%.*]]2315// CHECK2: then8:2316// CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 12317// CHECK2-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 42318// CHECK2-NEXT: [[TMP18:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]2319// CHECK2-NEXT: [[TMP19:%.*]] = load i16, ptr [[TMP17]], align 22320// CHECK2-NEXT: store volatile i16 [[TMP19]], ptr addrspace(3) [[TMP18]], align 22321// CHECK2-NEXT: br label [[IFCONT8:%.*]]2322// CHECK2: else9:2323// CHECK2-NEXT: br label [[IFCONT8]]2324// CHECK2: ifcont10:2325// CHECK2-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2326// CHECK2-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2327// CHECK2-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTADDR1]], align 42328// CHECK2-NEXT: [[IS_ACTIVE_THREAD9:%.*]] = icmp ult i32 [[TMP3]], [[TMP20]]2329// CHECK2-NEXT: br i1 [[IS_ACTIVE_THREAD9]], label [[THEN10:%.*]], label [[ELSE11:%.*]]2330// CHECK2: then13:2331// CHECK2-NEXT: [[TMP21:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]2332// CHECK2-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 12333// CHECK2-NEXT: [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 42334// CHECK2-NEXT: [[TMP24:%.*]] = load volatile i16, ptr addrspace(3) [[TMP21]], align 22335// CHECK2-NEXT: store i16 [[TMP24]], ptr [[TMP23]], align 22336// CHECK2-NEXT: br label [[IFCONT12:%.*]]2337// CHECK2: else14:2338// CHECK2-NEXT: br label [[IFCONT12]]2339// CHECK2: ifcont15:2340// CHECK2-NEXT: ret void2341//2342//2343// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_copy_func112344// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {2345// CHECK2-NEXT: entry:2346// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42347// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42348// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 42349// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42350// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42351// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 42352// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 42353// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 42354// CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 42355// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 02356// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 42357// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP4]], i32 [[TMP5]]2358// CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 02359// CHECK2-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP7]], align 42360// CHECK2-NEXT: store i32 [[TMP9]], ptr [[A]], align 42361// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 12362// CHECK2-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 42363// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP4]], i32 [[TMP5]]2364// CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP12]], i32 0, i32 12365// CHECK2-NEXT: [[TMP13:%.*]] = load i16, ptr [[TMP11]], align 22366// CHECK2-NEXT: store i16 [[TMP13]], ptr [[B]], align 22367// CHECK2-NEXT: ret void2368//2369//2370// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_reduce_func122371// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {2372// CHECK2-NEXT: entry:2373// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42374// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42375// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 42376// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 42377// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42378// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42379// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 42380// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 42381// CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 42382// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 02383// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP3]], i32 [[TMP4]]2384// CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP6]], i32 0, i32 02385// CHECK2-NEXT: store ptr [[A]], ptr [[TMP5]], align 42386// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 12387// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP3]], i32 [[TMP4]]2388// CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 12389// CHECK2-NEXT: store ptr [[B]], ptr [[TMP7]], align 42390// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 42391// CHECK2-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp$reduction$reduction_func"(ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr [[TMP9]]) #[[ATTR4]]2392// CHECK2-NEXT: ret void2393//2394//2395// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_copy_func132396// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {2397// CHECK2-NEXT: entry:2398// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42399// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42400// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 42401// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42402// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42403// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 42404// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 42405// CHECK2-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 42406// CHECK2-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 42407// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 02408// CHECK2-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 42409// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP4]], i32 [[TMP5]]2410// CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 02411// CHECK2-NEXT: [[TMP9:%.*]] = load i32, ptr [[A]], align 42412// CHECK2-NEXT: store i32 [[TMP9]], ptr [[TMP7]], align 42413// CHECK2-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 12414// CHECK2-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 42415// CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP4]], i32 [[TMP5]]2416// CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP12]], i32 0, i32 12417// CHECK2-NEXT: [[TMP13:%.*]] = load i16, ptr [[B]], align 22418// CHECK2-NEXT: store i16 [[TMP13]], ptr [[TMP11]], align 22419// CHECK2-NEXT: ret void2420//2421//2422// CHECK2-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_reduce_func142423// CHECK2-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {2424// CHECK2-NEXT: entry:2425// CHECK2-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42426// CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42427// CHECK2-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 42428// CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 42429// CHECK2-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42430// CHECK2-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42431// CHECK2-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 42432// CHECK2-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 42433// CHECK2-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 42434// CHECK2-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 02435// CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP3]], i32 [[TMP4]]2436// CHECK2-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP6]], i32 0, i32 02437// CHECK2-NEXT: store ptr [[A]], ptr [[TMP5]], align 42438// CHECK2-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 12439// CHECK2-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP3]], i32 [[TMP4]]2440// CHECK2-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 12441// CHECK2-NEXT: store ptr [[B]], ptr [[TMP7]], align 42442// CHECK2-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 42443// CHECK2-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP9]], ptr [[DOTOMP_REDUCTION_RED_LIST]]) #[[ATTR4]]2444// CHECK2-NEXT: ret void2445//2446//2447// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l202448// CHECK3-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[E:%.*]]) #[[ATTR0:[0-9]+]] {2449// CHECK3-NEXT: entry:2450// CHECK3-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 42451// CHECK3-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 42452// CHECK3-NEXT: [[E1:%.*]] = alloca double, align 82453// CHECK3-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 42454// CHECK3-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 42455// CHECK3-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 42456// CHECK3-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 42457// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 42458// CHECK3-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_kernel_environment, ptr [[DYN_PTR]])2459// CHECK3-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP1]], -12460// CHECK3-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]2461// CHECK3: user_code.entry:2462// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1:[0-9]+]])2463// CHECK3-NEXT: [[TMP3:%.*]] = load double, ptr [[TMP0]], align 82464// CHECK3-NEXT: store double [[TMP3]], ptr [[E1]], align 82465// CHECK3-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 42466// CHECK3-NEXT: store i32 [[TMP2]], ptr [[DOTTHREADID_TEMP_]], align 42467// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], ptr [[E1]]) #[[ATTR4:[0-9]+]]2468// CHECK3-NEXT: call void @__kmpc_target_deinit()2469// CHECK3-NEXT: ret void2470// CHECK3: worker.exit:2471// CHECK3-NEXT: ret void2472//2473//2474// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined2475// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 8 dereferenceable(8) [[E:%.*]]) #[[ATTR1:[0-9]+]] {2476// CHECK3-NEXT: entry:2477// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 42478// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 42479// CHECK3-NEXT: [[E_ADDR:%.*]] = alloca ptr, align 42480// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 42481// CHECK3-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 42482// CHECK3-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 42483// CHECK3-NEXT: store ptr [[E]], ptr [[E_ADDR]], align 42484// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[E_ADDR]], align 42485// CHECK3-NEXT: [[E1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 8)2486// CHECK3-NEXT: store double 0.000000e+00, ptr [[E1]], align 82487// CHECK3-NEXT: [[TMP1:%.*]] = load double, ptr [[E1]], align 82488// CHECK3-NEXT: [[ADD:%.*]] = fadd double [[TMP1]], 5.000000e+002489// CHECK3-NEXT: store double [[ADD]], ptr [[E1]], align 82490// CHECK3-NEXT: [[TMP2:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 02491// CHECK3-NEXT: store ptr [[E1]], ptr [[TMP2]], align 42492// CHECK3-NEXT: %"_openmp_teams_reductions_buffer_$_$ptr" = call ptr @__kmpc_reduction_get_fixed_buffer()2493// CHECK3-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_nvptx_teams_reduce_nowait_v2(ptr @[[GLOB1]], ptr %"_openmp_teams_reductions_buffer_$_$ptr", i32 2048, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func, ptr @_omp_reduction_inter_warp_copy_func, ptr @_omp_reduction_list_to_global_copy_func, ptr @_omp_reduction_list_to_global_reduce_func, ptr @_omp_reduction_global_to_list_copy_func, ptr @_omp_reduction_global_to_list_reduce_func)2494// CHECK3-NEXT: [[TMP4:%.*]] = icmp eq i32 [[TMP3]], 12495// CHECK3-NEXT: br i1 [[TMP4]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]2496// CHECK3: .omp.reduction.then:2497// CHECK3-NEXT: [[TMP5:%.*]] = load double, ptr [[TMP0]], align 82498// CHECK3-NEXT: [[TMP6:%.*]] = load double, ptr [[E1]], align 82499// CHECK3-NEXT: [[ADD2:%.*]] = fadd double [[TMP5]], [[TMP6]]2500// CHECK3-NEXT: store double [[ADD2]], ptr [[TMP0]], align 82501// CHECK3-NEXT: br label [[DOTOMP_REDUCTION_DONE]]2502// CHECK3: .omp.reduction.done:2503// CHECK3-NEXT: call void @__kmpc_free_shared(ptr [[E1]], i32 8)2504// CHECK3-NEXT: ret void2505//2506//2507// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func2508// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3:[0-9]+]] {2509// CHECK3-NEXT: entry:2510// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42511// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 22512// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 22513// CHECK3-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 22514// CHECK3-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [1 x ptr], align 42515// CHECK3-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca double, align 82516// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42517// CHECK3-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 22518// CHECK3-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 22519// CHECK3-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 22520// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 42521// CHECK3-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 22522// CHECK3-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 22523// CHECK3-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 22524// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i32 0, i32 02525// CHECK3-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 42526// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 02527// CHECK3-NEXT: [[TMP11:%.*]] = getelementptr double, ptr [[TMP9]], i32 12528// CHECK3-NEXT: [[TMP12:%.*]] = load i64, ptr [[TMP9]], align 82529// CHECK3-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_get_warp_size()2530// CHECK3-NEXT: [[TMP14:%.*]] = trunc i32 [[TMP13]] to i162531// CHECK3-NEXT: [[TMP15:%.*]] = call i64 @__kmpc_shuffle_int64(i64 [[TMP12]], i16 [[TMP6]], i16 [[TMP14]])2532// CHECK3-NEXT: store i64 [[TMP15]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 82533// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr i64, ptr [[TMP9]], i32 12534// CHECK3-NEXT: [[TMP17:%.*]] = getelementptr i64, ptr [[DOTOMP_REDUCTION_ELEMENT]], i32 12535// CHECK3-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 42536// CHECK3-NEXT: [[TMP18:%.*]] = icmp eq i16 [[TMP7]], 02537// CHECK3-NEXT: [[TMP19:%.*]] = icmp eq i16 [[TMP7]], 12538// CHECK3-NEXT: [[TMP20:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]2539// CHECK3-NEXT: [[TMP21:%.*]] = and i1 [[TMP19]], [[TMP20]]2540// CHECK3-NEXT: [[TMP22:%.*]] = icmp eq i16 [[TMP7]], 22541// CHECK3-NEXT: [[TMP23:%.*]] = and i16 [[TMP5]], 12542// CHECK3-NEXT: [[TMP24:%.*]] = icmp eq i16 [[TMP23]], 02543// CHECK3-NEXT: [[TMP25:%.*]] = and i1 [[TMP22]], [[TMP24]]2544// CHECK3-NEXT: [[TMP26:%.*]] = icmp sgt i16 [[TMP6]], 02545// CHECK3-NEXT: [[TMP27:%.*]] = and i1 [[TMP25]], [[TMP26]]2546// CHECK3-NEXT: [[TMP28:%.*]] = or i1 [[TMP18]], [[TMP21]]2547// CHECK3-NEXT: [[TMP29:%.*]] = or i1 [[TMP28]], [[TMP27]]2548// CHECK3-NEXT: br i1 [[TMP29]], label [[THEN:%.*]], label [[ELSE:%.*]]2549// CHECK3: then:2550// CHECK3-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]2551// CHECK3-NEXT: br label [[IFCONT:%.*]]2552// CHECK3: else:2553// CHECK3-NEXT: br label [[IFCONT]]2554// CHECK3: ifcont:2555// CHECK3-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 12556// CHECK3-NEXT: [[TMP31:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]2557// CHECK3-NEXT: [[TMP32:%.*]] = and i1 [[TMP30]], [[TMP31]]2558// CHECK3-NEXT: br i1 [[TMP32]], label [[THEN4:%.*]], label [[ELSE5:%.*]]2559// CHECK3: then4:2560// CHECK3-NEXT: [[TMP33:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 02561// CHECK3-NEXT: [[TMP34:%.*]] = load ptr, ptr [[TMP33]], align 42562// CHECK3-NEXT: [[TMP35:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP4]], i32 0, i32 02563// CHECK3-NEXT: [[TMP36:%.*]] = load ptr, ptr [[TMP35]], align 42564// CHECK3-NEXT: [[TMP37:%.*]] = load double, ptr [[TMP34]], align 82565// CHECK3-NEXT: store double [[TMP37]], ptr [[TMP36]], align 82566// CHECK3-NEXT: br label [[IFCONT6:%.*]]2567// CHECK3: else5:2568// CHECK3-NEXT: br label [[IFCONT6]]2569// CHECK3: ifcont6:2570// CHECK3-NEXT: ret void2571//2572//2573// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func2574// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {2575// CHECK3-NEXT: entry:2576// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42577// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42578// CHECK3-NEXT: [[DOTCNT_ADDR:%.*]] = alloca i32, align 42579// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42580// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42581// CHECK3-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2582// CHECK3-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2583// CHECK3-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 312584// CHECK3-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2585// CHECK3-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 52586// CHECK3-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 42587// CHECK3-NEXT: store i32 0, ptr [[DOTCNT_ADDR]], align 42588// CHECK3-NEXT: br label [[PRECOND:%.*]]2589// CHECK3: precond:2590// CHECK3-NEXT: [[TMP7:%.*]] = load i32, ptr [[DOTCNT_ADDR]], align 42591// CHECK3-NEXT: [[TMP8:%.*]] = icmp ult i32 [[TMP7]], 22592// CHECK3-NEXT: br i1 [[TMP8]], label [[BODY:%.*]], label [[EXIT:%.*]]2593// CHECK3: body:2594// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2595// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2:[0-9]+]], i32 [[TMP2]])2596// CHECK3-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 02597// CHECK3-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]2598// CHECK3: then:2599// CHECK3-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP6]], i32 0, i32 02600// CHECK3-NEXT: [[TMP10:%.*]] = load ptr, ptr [[TMP9]], align 42601// CHECK3-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr [[TMP10]], i32 [[TMP7]]2602// CHECK3-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]2603// CHECK3-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP11]], align 42604// CHECK3-NEXT: store volatile i32 [[TMP13]], ptr addrspace(3) [[TMP12]], align 42605// CHECK3-NEXT: br label [[IFCONT:%.*]]2606// CHECK3: else:2607// CHECK3-NEXT: br label [[IFCONT]]2608// CHECK3: ifcont:2609// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2610// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2611// CHECK3-NEXT: [[TMP14:%.*]] = load i32, ptr [[DOTADDR1]], align 42612// CHECK3-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP14]]2613// CHECK3-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]2614// CHECK3: then3:2615// CHECK3-NEXT: [[TMP15:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]2616// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP6]], i32 0, i32 02617// CHECK3-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 42618// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr i32, ptr [[TMP17]], i32 [[TMP7]]2619// CHECK3-NEXT: [[TMP19:%.*]] = load volatile i32, ptr addrspace(3) [[TMP15]], align 42620// CHECK3-NEXT: store i32 [[TMP19]], ptr [[TMP18]], align 42621// CHECK3-NEXT: br label [[IFCONT4:%.*]]2622// CHECK3: else4:2623// CHECK3-NEXT: br label [[IFCONT4]]2624// CHECK3: ifcont5:2625// CHECK3-NEXT: [[TMP20:%.*]] = add nsw i32 [[TMP7]], 12626// CHECK3-NEXT: store i32 [[TMP20]], ptr [[DOTCNT_ADDR]], align 42627// CHECK3-NEXT: br label [[PRECOND]]2628// CHECK3: exit:2629// CHECK3-NEXT: ret void2630//2631//2632// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_copy_func2633// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {2634// CHECK3-NEXT: entry:2635// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42636// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42637// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 42638// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42639// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42640// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 42641// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 42642// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 42643// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 42644// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i32 0, i32 02645// CHECK3-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 42646// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP4]], i32 [[TMP5]]2647// CHECK3-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP8]], i32 0, i32 02648// CHECK3-NEXT: [[TMP9:%.*]] = load double, ptr [[TMP7]], align 82649// CHECK3-NEXT: store double [[TMP9]], ptr [[E]], align 82650// CHECK3-NEXT: ret void2651//2652//2653// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_reduce_func2654// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {2655// CHECK3-NEXT: entry:2656// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42657// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42658// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 42659// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 42660// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42661// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42662// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 42663// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 42664// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 42665// CHECK3-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 02666// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP3]], i32 [[TMP4]]2667// CHECK3-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP6]], i32 0, i32 02668// CHECK3-NEXT: store ptr [[E]], ptr [[TMP5]], align 42669// CHECK3-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTADDR2]], align 42670// CHECK3-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined_omp$reduction$reduction_func"(ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr [[TMP7]]) #[[ATTR4]]2671// CHECK3-NEXT: ret void2672//2673//2674// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_copy_func2675// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {2676// CHECK3-NEXT: entry:2677// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42678// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42679// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 42680// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42681// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42682// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 42683// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 42684// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 42685// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 42686// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x ptr], ptr [[TMP3]], i32 0, i32 02687// CHECK3-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 42688// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP4]], i32 [[TMP5]]2689// CHECK3-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP8]], i32 0, i32 02690// CHECK3-NEXT: [[TMP9:%.*]] = load double, ptr [[E]], align 82691// CHECK3-NEXT: store double [[TMP9]], ptr [[TMP7]], align 82692// CHECK3-NEXT: ret void2693//2694//2695// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_reduce_func2696// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {2697// CHECK3-NEXT: entry:2698// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42699// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42700// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 42701// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x ptr], align 42702// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42703// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42704// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 42705// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 42706// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 42707// CHECK3-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 02708// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY:%.*]], ptr [[TMP3]], i32 [[TMP4]]2709// CHECK3-NEXT: [[E:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY]], ptr [[TMP6]], i32 0, i32 02710// CHECK3-NEXT: store ptr [[E]], ptr [[TMP5]], align 42711// CHECK3-NEXT: [[TMP7:%.*]] = load ptr, ptr [[DOTADDR2]], align 42712// CHECK3-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l20_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP7]], ptr [[DOTOMP_REDUCTION_RED_LIST]]) #[[ATTR4]]2713// CHECK3-NEXT: ret void2714//2715//2716// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l262717// CHECK3-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i32 noundef [[C:%.*]], i32 noundef [[D:%.*]]) #[[ATTR0]] {2718// CHECK3-NEXT: entry:2719// CHECK3-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 42720// CHECK3-NEXT: [[C_ADDR:%.*]] = alloca i32, align 42721// CHECK3-NEXT: [[D_ADDR:%.*]] = alloca i32, align 42722// CHECK3-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 42723// CHECK3-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 42724// CHECK3-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 42725// CHECK3-NEXT: store i32 [[C]], ptr [[C_ADDR]], align 42726// CHECK3-NEXT: store i32 [[D]], ptr [[D_ADDR]], align 42727// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_kernel_environment, ptr [[DYN_PTR]])2728// CHECK3-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -12729// CHECK3-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]2730// CHECK3: user_code.entry:2731// CHECK3-NEXT: [[TMP1:%.*]] = load i8, ptr [[C_ADDR]], align 12732// CHECK3-NEXT: [[C1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 1)2733// CHECK3-NEXT: store i8 [[TMP1]], ptr [[C1]], align 12734// CHECK3-NEXT: [[TMP2:%.*]] = load float, ptr [[D_ADDR]], align 42735// CHECK3-NEXT: [[D2:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 4)2736// CHECK3-NEXT: store float [[TMP2]], ptr [[D2]], align 42737// CHECK3-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2738// CHECK3-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 42739// CHECK3-NEXT: store i32 [[TMP3]], ptr [[DOTTHREADID_TEMP_]], align 42740// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], ptr [[C1]], ptr [[D2]]) #[[ATTR4]]2741// CHECK3-NEXT: call void @__kmpc_free_shared(ptr [[D2]], i32 4)2742// CHECK3-NEXT: call void @__kmpc_free_shared(ptr [[C1]], i32 1)2743// CHECK3-NEXT: call void @__kmpc_target_deinit()2744// CHECK3-NEXT: ret void2745// CHECK3: worker.exit:2746// CHECK3-NEXT: ret void2747//2748//2749// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined2750// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 1 dereferenceable(1) [[C:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[D:%.*]]) #[[ATTR1]] {2751// CHECK3-NEXT: entry:2752// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 42753// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 42754// CHECK3-NEXT: [[C_ADDR:%.*]] = alloca ptr, align 42755// CHECK3-NEXT: [[D_ADDR:%.*]] = alloca ptr, align 42756// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 42757// CHECK3-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 42758// CHECK3-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 42759// CHECK3-NEXT: store ptr [[C]], ptr [[C_ADDR]], align 42760// CHECK3-NEXT: store ptr [[D]], ptr [[D_ADDR]], align 42761// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[C_ADDR]], align 42762// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D_ADDR]], align 42763// CHECK3-NEXT: [[C1:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 1)2764// CHECK3-NEXT: [[D2:%.*]] = call align 8 ptr @__kmpc_alloc_shared(i32 4)2765// CHECK3-NEXT: store i8 0, ptr [[C1]], align 12766// CHECK3-NEXT: store float 1.000000e+00, ptr [[D2]], align 42767// CHECK3-NEXT: [[TMP2:%.*]] = load i8, ptr [[C1]], align 12768// CHECK3-NEXT: [[CONV:%.*]] = sext i8 [[TMP2]] to i322769// CHECK3-NEXT: [[XOR:%.*]] = xor i32 [[CONV]], 22770// CHECK3-NEXT: [[CONV3:%.*]] = trunc i32 [[XOR]] to i82771// CHECK3-NEXT: store i8 [[CONV3]], ptr [[C1]], align 12772// CHECK3-NEXT: [[TMP3:%.*]] = load float, ptr [[D2]], align 42773// CHECK3-NEXT: [[MUL:%.*]] = fmul float [[TMP3]], 3.300000e+012774// CHECK3-NEXT: store float [[MUL]], ptr [[D2]], align 42775// CHECK3-NEXT: [[TMP4:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 02776// CHECK3-NEXT: store ptr [[C1]], ptr [[TMP4]], align 42777// CHECK3-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 12778// CHECK3-NEXT: store ptr [[D2]], ptr [[TMP5]], align 42779// CHECK3-NEXT: %"_openmp_teams_reductions_buffer_$_$ptr" = call ptr @__kmpc_reduction_get_fixed_buffer()2780// CHECK3-NEXT: [[TMP6:%.*]] = call i32 @__kmpc_nvptx_teams_reduce_nowait_v2(ptr @[[GLOB1]], ptr %"_openmp_teams_reductions_buffer_$_$ptr", i32 2048, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func1, ptr @_omp_reduction_inter_warp_copy_func2, ptr @_omp_reduction_list_to_global_copy_func3, ptr @_omp_reduction_list_to_global_reduce_func4, ptr @_omp_reduction_global_to_list_copy_func5, ptr @_omp_reduction_global_to_list_reduce_func6)2781// CHECK3-NEXT: [[TMP7:%.*]] = icmp eq i32 [[TMP6]], 12782// CHECK3-NEXT: br i1 [[TMP7]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]2783// CHECK3: .omp.reduction.then:2784// CHECK3-NEXT: [[TMP8:%.*]] = load i8, ptr [[TMP0]], align 12785// CHECK3-NEXT: [[CONV4:%.*]] = sext i8 [[TMP8]] to i322786// CHECK3-NEXT: [[TMP9:%.*]] = load i8, ptr [[C1]], align 12787// CHECK3-NEXT: [[CONV5:%.*]] = sext i8 [[TMP9]] to i322788// CHECK3-NEXT: [[XOR6:%.*]] = xor i32 [[CONV4]], [[CONV5]]2789// CHECK3-NEXT: [[CONV7:%.*]] = trunc i32 [[XOR6]] to i82790// CHECK3-NEXT: store i8 [[CONV7]], ptr [[TMP0]], align 12791// CHECK3-NEXT: [[TMP10:%.*]] = load float, ptr [[TMP1]], align 42792// CHECK3-NEXT: [[TMP11:%.*]] = load float, ptr [[D2]], align 42793// CHECK3-NEXT: [[MUL8:%.*]] = fmul float [[TMP10]], [[TMP11]]2794// CHECK3-NEXT: store float [[MUL8]], ptr [[TMP1]], align 42795// CHECK3-NEXT: br label [[DOTOMP_REDUCTION_DONE]]2796// CHECK3: .omp.reduction.done:2797// CHECK3-NEXT: call void @__kmpc_free_shared(ptr [[D2]], i32 4)2798// CHECK3-NEXT: call void @__kmpc_free_shared(ptr [[C1]], i32 1)2799// CHECK3-NEXT: ret void2800//2801//2802// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func12803// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3]] {2804// CHECK3-NEXT: entry:2805// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42806// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 22807// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 22808// CHECK3-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 22809// CHECK3-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [2 x ptr], align 42810// CHECK3-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca i8, align 12811// CHECK3-NEXT: [[DOTOMP_REDUCTION_ELEMENT4:%.*]] = alloca float, align 42812// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42813// CHECK3-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 22814// CHECK3-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 22815// CHECK3-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 22816// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 42817// CHECK3-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 22818// CHECK3-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 22819// CHECK3-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 22820// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 02821// CHECK3-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 42822// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 02823// CHECK3-NEXT: [[TMP11:%.*]] = getelementptr i8, ptr [[TMP9]], i32 12824// CHECK3-NEXT: [[TMP12:%.*]] = load i8, ptr [[TMP9]], align 12825// CHECK3-NEXT: [[TMP13:%.*]] = sext i8 [[TMP12]] to i322826// CHECK3-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_get_warp_size()2827// CHECK3-NEXT: [[TMP15:%.*]] = trunc i32 [[TMP14]] to i162828// CHECK3-NEXT: [[TMP16:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP13]], i16 [[TMP6]], i16 [[TMP15]])2829// CHECK3-NEXT: [[TMP17:%.*]] = trunc i32 [[TMP16]] to i82830// CHECK3-NEXT: store i8 [[TMP17]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 12831// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[TMP9]], i32 12832// CHECK3-NEXT: [[TMP19:%.*]] = getelementptr i8, ptr [[DOTOMP_REDUCTION_ELEMENT]], i32 12833// CHECK3-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 42834// CHECK3-NEXT: [[TMP20:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 12835// CHECK3-NEXT: [[TMP21:%.*]] = load ptr, ptr [[TMP20]], align 42836// CHECK3-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 12837// CHECK3-NEXT: [[TMP23:%.*]] = getelementptr float, ptr [[TMP21]], i32 12838// CHECK3-NEXT: [[TMP24:%.*]] = load i32, ptr [[TMP21]], align 42839// CHECK3-NEXT: [[TMP25:%.*]] = call i32 @__kmpc_get_warp_size()2840// CHECK3-NEXT: [[TMP26:%.*]] = trunc i32 [[TMP25]] to i162841// CHECK3-NEXT: [[TMP27:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP24]], i16 [[TMP6]], i16 [[TMP26]])2842// CHECK3-NEXT: store i32 [[TMP27]], ptr [[DOTOMP_REDUCTION_ELEMENT4]], align 42843// CHECK3-NEXT: [[TMP28:%.*]] = getelementptr i32, ptr [[TMP21]], i32 12844// CHECK3-NEXT: [[TMP29:%.*]] = getelementptr i32, ptr [[DOTOMP_REDUCTION_ELEMENT4]], i32 12845// CHECK3-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT4]], ptr [[TMP22]], align 42846// CHECK3-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 02847// CHECK3-NEXT: [[TMP31:%.*]] = icmp eq i16 [[TMP7]], 12848// CHECK3-NEXT: [[TMP32:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]2849// CHECK3-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]]2850// CHECK3-NEXT: [[TMP34:%.*]] = icmp eq i16 [[TMP7]], 22851// CHECK3-NEXT: [[TMP35:%.*]] = and i16 [[TMP5]], 12852// CHECK3-NEXT: [[TMP36:%.*]] = icmp eq i16 [[TMP35]], 02853// CHECK3-NEXT: [[TMP37:%.*]] = and i1 [[TMP34]], [[TMP36]]2854// CHECK3-NEXT: [[TMP38:%.*]] = icmp sgt i16 [[TMP6]], 02855// CHECK3-NEXT: [[TMP39:%.*]] = and i1 [[TMP37]], [[TMP38]]2856// CHECK3-NEXT: [[TMP40:%.*]] = or i1 [[TMP30]], [[TMP33]]2857// CHECK3-NEXT: [[TMP41:%.*]] = or i1 [[TMP40]], [[TMP39]]2858// CHECK3-NEXT: br i1 [[TMP41]], label [[THEN:%.*]], label [[ELSE:%.*]]2859// CHECK3: then:2860// CHECK3-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]2861// CHECK3-NEXT: br label [[IFCONT:%.*]]2862// CHECK3: else:2863// CHECK3-NEXT: br label [[IFCONT]]2864// CHECK3: ifcont:2865// CHECK3-NEXT: [[TMP42:%.*]] = icmp eq i16 [[TMP7]], 12866// CHECK3-NEXT: [[TMP43:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]2867// CHECK3-NEXT: [[TMP44:%.*]] = and i1 [[TMP42]], [[TMP43]]2868// CHECK3-NEXT: br i1 [[TMP44]], label [[THEN5:%.*]], label [[ELSE6:%.*]]2869// CHECK3: then5:2870// CHECK3-NEXT: [[TMP45:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 02871// CHECK3-NEXT: [[TMP46:%.*]] = load ptr, ptr [[TMP45]], align 42872// CHECK3-NEXT: [[TMP47:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 02873// CHECK3-NEXT: [[TMP48:%.*]] = load ptr, ptr [[TMP47]], align 42874// CHECK3-NEXT: [[TMP49:%.*]] = load i8, ptr [[TMP46]], align 12875// CHECK3-NEXT: store i8 [[TMP49]], ptr [[TMP48]], align 12876// CHECK3-NEXT: [[TMP50:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 12877// CHECK3-NEXT: [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 42878// CHECK3-NEXT: [[TMP52:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 12879// CHECK3-NEXT: [[TMP53:%.*]] = load ptr, ptr [[TMP52]], align 42880// CHECK3-NEXT: [[TMP54:%.*]] = load float, ptr [[TMP51]], align 42881// CHECK3-NEXT: store float [[TMP54]], ptr [[TMP53]], align 42882// CHECK3-NEXT: br label [[IFCONT7:%.*]]2883// CHECK3: else6:2884// CHECK3-NEXT: br label [[IFCONT7]]2885// CHECK3: ifcont7:2886// CHECK3-NEXT: ret void2887//2888//2889// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func22890// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {2891// CHECK3-NEXT: entry:2892// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42893// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42894// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42895// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42896// CHECK3-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2897// CHECK3-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2898// CHECK3-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 312899// CHECK3-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()2900// CHECK3-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 52901// CHECK3-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 42902// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2903// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2904// CHECK3-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 02905// CHECK3-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]2906// CHECK3: then:2907// CHECK3-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 02908// CHECK3-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 42909// CHECK3-NEXT: [[TMP9:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]2910// CHECK3-NEXT: [[TMP10:%.*]] = load i8, ptr [[TMP8]], align 12911// CHECK3-NEXT: store volatile i8 [[TMP10]], ptr addrspace(3) [[TMP9]], align 12912// CHECK3-NEXT: br label [[IFCONT:%.*]]2913// CHECK3: else:2914// CHECK3-NEXT: br label [[IFCONT]]2915// CHECK3: ifcont:2916// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2917// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2918// CHECK3-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTADDR1]], align 42919// CHECK3-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP11]]2920// CHECK3-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]2921// CHECK3: then3:2922// CHECK3-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]2923// CHECK3-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 02924// CHECK3-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 42925// CHECK3-NEXT: [[TMP15:%.*]] = load volatile i8, ptr addrspace(3) [[TMP12]], align 12926// CHECK3-NEXT: store i8 [[TMP15]], ptr [[TMP14]], align 12927// CHECK3-NEXT: br label [[IFCONT4:%.*]]2928// CHECK3: else4:2929// CHECK3-NEXT: br label [[IFCONT4]]2930// CHECK3: ifcont5:2931// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2932// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2933// CHECK3-NEXT: [[WARP_MASTER5:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 02934// CHECK3-NEXT: br i1 [[WARP_MASTER5]], label [[THEN6:%.*]], label [[ELSE7:%.*]]2935// CHECK3: then8:2936// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 12937// CHECK3-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 42938// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]2939// CHECK3-NEXT: [[TMP19:%.*]] = load i32, ptr [[TMP17]], align 42940// CHECK3-NEXT: store volatile i32 [[TMP19]], ptr addrspace(3) [[TMP18]], align 42941// CHECK3-NEXT: br label [[IFCONT8:%.*]]2942// CHECK3: else9:2943// CHECK3-NEXT: br label [[IFCONT8]]2944// CHECK3: ifcont10:2945// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])2946// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])2947// CHECK3-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTADDR1]], align 42948// CHECK3-NEXT: [[IS_ACTIVE_THREAD9:%.*]] = icmp ult i32 [[TMP3]], [[TMP20]]2949// CHECK3-NEXT: br i1 [[IS_ACTIVE_THREAD9]], label [[THEN10:%.*]], label [[ELSE11:%.*]]2950// CHECK3: then13:2951// CHECK3-NEXT: [[TMP21:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]2952// CHECK3-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 12953// CHECK3-NEXT: [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 42954// CHECK3-NEXT: [[TMP24:%.*]] = load volatile i32, ptr addrspace(3) [[TMP21]], align 42955// CHECK3-NEXT: store i32 [[TMP24]], ptr [[TMP23]], align 42956// CHECK3-NEXT: br label [[IFCONT12:%.*]]2957// CHECK3: else14:2958// CHECK3-NEXT: br label [[IFCONT12]]2959// CHECK3: ifcont15:2960// CHECK3-NEXT: ret void2961//2962//2963// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_copy_func32964// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {2965// CHECK3-NEXT: entry:2966// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42967// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42968// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 42969// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42970// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42971// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 42972// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 42973// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 42974// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 42975// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 02976// CHECK3-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 42977// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP4]], i32 [[TMP5]]2978// CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 02979// CHECK3-NEXT: [[TMP9:%.*]] = load i8, ptr [[TMP7]], align 12980// CHECK3-NEXT: store i8 [[TMP9]], ptr [[C]], align 12981// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 12982// CHECK3-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 42983// CHECK3-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP4]], i32 [[TMP5]]2984// CHECK3-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP12]], i32 0, i32 12985// CHECK3-NEXT: [[TMP13:%.*]] = load float, ptr [[TMP11]], align 42986// CHECK3-NEXT: store float [[TMP13]], ptr [[D]], align 42987// CHECK3-NEXT: ret void2988//2989//2990// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_reduce_func42991// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {2992// CHECK3-NEXT: entry:2993// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 42994// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 42995// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 42996// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 42997// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 42998// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 42999// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 43000// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 43001// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 43002// CHECK3-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 03003// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP3]], i32 [[TMP4]]3004// CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP6]], i32 0, i32 03005// CHECK3-NEXT: store ptr [[C]], ptr [[TMP5]], align 43006// CHECK3-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 13007// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP3]], i32 [[TMP4]]3008// CHECK3-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 13009// CHECK3-NEXT: store ptr [[D]], ptr [[TMP7]], align 43010// CHECK3-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 43011// CHECK3-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined_omp$reduction$reduction_func"(ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr [[TMP9]]) #[[ATTR4]]3012// CHECK3-NEXT: ret void3013//3014//3015// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_copy_func53016// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {3017// CHECK3-NEXT: entry:3018// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 43019// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 43020// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 43021// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 43022// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 43023// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 43024// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 43025// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 43026// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 43027// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 03028// CHECK3-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 43029// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP4]], i32 [[TMP5]]3030// CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 03031// CHECK3-NEXT: [[TMP9:%.*]] = load i8, ptr [[C]], align 13032// CHECK3-NEXT: store i8 [[TMP9]], ptr [[TMP7]], align 13033// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 13034// CHECK3-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 43035// CHECK3-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP4]], i32 [[TMP5]]3036// CHECK3-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP12]], i32 0, i32 13037// CHECK3-NEXT: [[TMP13:%.*]] = load float, ptr [[D]], align 43038// CHECK3-NEXT: store float [[TMP13]], ptr [[TMP11]], align 43039// CHECK3-NEXT: ret void3040//3041//3042// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_reduce_func63043// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {3044// CHECK3-NEXT: entry:3045// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 43046// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 43047// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 43048// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 43049// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 43050// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 43051// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 43052// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 43053// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 43054// CHECK3-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 03055// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0:%.*]], ptr [[TMP3]], i32 [[TMP4]]3056// CHECK3-NEXT: [[C:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP6]], i32 0, i32 03057// CHECK3-NEXT: store ptr [[C]], ptr [[TMP5]], align 43058// CHECK3-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 13059// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP3]], i32 [[TMP4]]3060// CHECK3-NEXT: [[D:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_0]], ptr [[TMP8]], i32 0, i32 13061// CHECK3-NEXT: store ptr [[D]], ptr [[TMP7]], align 43062// CHECK3-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 43063// CHECK3-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l26_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP9]], ptr [[DOTOMP_REDUCTION_RED_LIST]]) #[[ATTR4]]3064// CHECK3-NEXT: ret void3065//3066//3067// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l333068// CHECK3-SAME: (ptr noalias noundef [[DYN_PTR:%.*]], i32 noundef [[A:%.*]], i32 noundef [[B:%.*]]) #[[ATTR0]] {3069// CHECK3-NEXT: entry:3070// CHECK3-NEXT: [[DYN_PTR_ADDR:%.*]] = alloca ptr, align 43071// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca i32, align 43072// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca i32, align 43073// CHECK3-NEXT: [[DOTZERO_ADDR:%.*]] = alloca i32, align 43074// CHECK3-NEXT: [[DOTTHREADID_TEMP_:%.*]] = alloca i32, align 43075// CHECK3-NEXT: store ptr [[DYN_PTR]], ptr [[DYN_PTR_ADDR]], align 43076// CHECK3-NEXT: store i32 [[A]], ptr [[A_ADDR]], align 43077// CHECK3-NEXT: store i32 [[B]], ptr [[B_ADDR]], align 43078// CHECK3-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_kernel_environment, ptr [[DYN_PTR]])3079// CHECK3-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -13080// CHECK3-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]]3081// CHECK3: user_code.entry:3082// CHECK3-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3083// CHECK3-NEXT: store i32 0, ptr [[DOTZERO_ADDR]], align 43084// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTTHREADID_TEMP_]], align 43085// CHECK3-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined(ptr [[DOTTHREADID_TEMP_]], ptr [[DOTZERO_ADDR]], ptr [[A_ADDR]], ptr [[B_ADDR]]) #[[ATTR4]]3086// CHECK3-NEXT: call void @__kmpc_target_deinit()3087// CHECK3-NEXT: ret void3088// CHECK3: worker.exit:3089// CHECK3-NEXT: ret void3090//3091//3092// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined3093// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 2 dereferenceable(2) [[B:%.*]]) #[[ATTR1]] {3094// CHECK3-NEXT: entry:3095// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 43096// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 43097// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 43098// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 43099// CHECK3-NEXT: [[A1:%.*]] = alloca i32, align 43100// CHECK3-NEXT: [[B2:%.*]] = alloca i16, align 23101// CHECK3-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [2 x ptr], align 43102// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 43103// CHECK3-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 43104// CHECK3-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 43105// CHECK3-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 43106// CHECK3-NEXT: store ptr [[B]], ptr [[B_ADDR]], align 43107// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 43108// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[B_ADDR]], align 43109// CHECK3-NEXT: store i32 0, ptr [[A1]], align 43110// CHECK3-NEXT: store i16 -32768, ptr [[B2]], align 23111// CHECK3-NEXT: [[TMP2:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 03112// CHECK3-NEXT: store ptr [[A1]], ptr [[TMP2]], align 43113// CHECK3-NEXT: [[TMP3:%.*]] = getelementptr inbounds [2 x ptr], ptr [[CAPTURED_VARS_ADDRS]], i32 0, i32 13114// CHECK3-NEXT: store ptr [[B2]], ptr [[TMP3]], align 43115// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTGLOBAL_TID__ADDR]], align 43116// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[TMP4]], align 43117// CHECK3-NEXT: call void @__kmpc_parallel_51(ptr @[[GLOB1]], i32 [[TMP5]], i32 1, i32 -1, i32 -1, ptr @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp_outlined, ptr null, ptr [[CAPTURED_VARS_ADDRS]], i32 2)3118// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 03119// CHECK3-NEXT: store ptr [[A1]], ptr [[TMP6]], align 43120// CHECK3-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 13121// CHECK3-NEXT: store ptr [[B2]], ptr [[TMP7]], align 43122// CHECK3-NEXT: %"_openmp_teams_reductions_buffer_$_$ptr" = call ptr @__kmpc_reduction_get_fixed_buffer()3123// CHECK3-NEXT: [[TMP8:%.*]] = call i32 @__kmpc_nvptx_teams_reduce_nowait_v2(ptr @[[GLOB1]], ptr %"_openmp_teams_reductions_buffer_$_$ptr", i32 2048, i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func9, ptr @_omp_reduction_inter_warp_copy_func10, ptr @_omp_reduction_list_to_global_copy_func11, ptr @_omp_reduction_list_to_global_reduce_func12, ptr @_omp_reduction_global_to_list_copy_func13, ptr @_omp_reduction_global_to_list_reduce_func14)3124// CHECK3-NEXT: [[TMP9:%.*]] = icmp eq i32 [[TMP8]], 13125// CHECK3-NEXT: br i1 [[TMP9]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]3126// CHECK3: .omp.reduction.then:3127// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP0]], align 43128// CHECK3-NEXT: [[TMP11:%.*]] = load i32, ptr [[A1]], align 43129// CHECK3-NEXT: [[OR:%.*]] = or i32 [[TMP10]], [[TMP11]]3130// CHECK3-NEXT: store i32 [[OR]], ptr [[TMP0]], align 43131// CHECK3-NEXT: [[TMP12:%.*]] = load i16, ptr [[TMP1]], align 23132// CHECK3-NEXT: [[CONV:%.*]] = sext i16 [[TMP12]] to i323133// CHECK3-NEXT: [[TMP13:%.*]] = load i16, ptr [[B2]], align 23134// CHECK3-NEXT: [[CONV3:%.*]] = sext i16 [[TMP13]] to i323135// CHECK3-NEXT: [[CMP:%.*]] = icmp sgt i32 [[CONV]], [[CONV3]]3136// CHECK3-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3137// CHECK3: cond.true:3138// CHECK3-NEXT: [[TMP14:%.*]] = load i16, ptr [[TMP1]], align 23139// CHECK3-NEXT: br label [[COND_END:%.*]]3140// CHECK3: cond.false:3141// CHECK3-NEXT: [[TMP15:%.*]] = load i16, ptr [[B2]], align 23142// CHECK3-NEXT: br label [[COND_END]]3143// CHECK3: cond.end:3144// CHECK3-NEXT: [[COND:%.*]] = phi i16 [ [[TMP14]], [[COND_TRUE]] ], [ [[TMP15]], [[COND_FALSE]] ]3145// CHECK3-NEXT: store i16 [[COND]], ptr [[TMP1]], align 23146// CHECK3-NEXT: br label [[DOTOMP_REDUCTION_DONE]]3147// CHECK3: .omp.reduction.done:3148// CHECK3-NEXT: ret void3149//3150//3151// CHECK3-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp_outlined3152// CHECK3-SAME: (ptr noalias noundef [[DOTGLOBAL_TID_:%.*]], ptr noalias noundef [[DOTBOUND_TID_:%.*]], ptr noundef nonnull align 4 dereferenceable(4) [[A:%.*]], ptr noundef nonnull align 2 dereferenceable(2) [[B:%.*]]) #[[ATTR1]] {3153// CHECK3-NEXT: entry:3154// CHECK3-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca ptr, align 43155// CHECK3-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca ptr, align 43156// CHECK3-NEXT: [[A_ADDR:%.*]] = alloca ptr, align 43157// CHECK3-NEXT: [[B_ADDR:%.*]] = alloca ptr, align 43158// CHECK3-NEXT: [[A1:%.*]] = alloca i32, align 43159// CHECK3-NEXT: [[B2:%.*]] = alloca i16, align 23160// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 43161// CHECK3-NEXT: store ptr [[DOTGLOBAL_TID_]], ptr [[DOTGLOBAL_TID__ADDR]], align 43162// CHECK3-NEXT: store ptr [[DOTBOUND_TID_]], ptr [[DOTBOUND_TID__ADDR]], align 43163// CHECK3-NEXT: store ptr [[A]], ptr [[A_ADDR]], align 43164// CHECK3-NEXT: store ptr [[B]], ptr [[B_ADDR]], align 43165// CHECK3-NEXT: [[TMP0:%.*]] = load ptr, ptr [[A_ADDR]], align 43166// CHECK3-NEXT: [[TMP1:%.*]] = load ptr, ptr [[B_ADDR]], align 43167// CHECK3-NEXT: store i32 0, ptr [[A1]], align 43168// CHECK3-NEXT: store i16 -32768, ptr [[B2]], align 23169// CHECK3-NEXT: [[TMP2:%.*]] = load i32, ptr [[A1]], align 43170// CHECK3-NEXT: [[OR:%.*]] = or i32 [[TMP2]], 13171// CHECK3-NEXT: store i32 [[OR]], ptr [[A1]], align 43172// CHECK3-NEXT: [[TMP3:%.*]] = load i16, ptr [[B2]], align 23173// CHECK3-NEXT: [[CONV:%.*]] = sext i16 [[TMP3]] to i323174// CHECK3-NEXT: [[CMP:%.*]] = icmp sgt i32 99, [[CONV]]3175// CHECK3-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]]3176// CHECK3: cond.true:3177// CHECK3-NEXT: br label [[COND_END:%.*]]3178// CHECK3: cond.false:3179// CHECK3-NEXT: [[TMP4:%.*]] = load i16, ptr [[B2]], align 23180// CHECK3-NEXT: [[CONV3:%.*]] = sext i16 [[TMP4]] to i323181// CHECK3-NEXT: br label [[COND_END]]3182// CHECK3: cond.end:3183// CHECK3-NEXT: [[COND:%.*]] = phi i32 [ 99, [[COND_TRUE]] ], [ [[CONV3]], [[COND_FALSE]] ]3184// CHECK3-NEXT: [[CONV4:%.*]] = trunc i32 [[COND]] to i163185// CHECK3-NEXT: store i16 [[CONV4]], ptr [[B2]], align 23186// CHECK3-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 03187// CHECK3-NEXT: store ptr [[A1]], ptr [[TMP5]], align 43188// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 13189// CHECK3-NEXT: store ptr [[B2]], ptr [[TMP6]], align 43190// CHECK3-NEXT: [[TMP7:%.*]] = call i32 @__kmpc_nvptx_parallel_reduce_nowait_v2(ptr @[[GLOB1]], i64 8, ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr @_omp_reduction_shuffle_and_reduce_func7, ptr @_omp_reduction_inter_warp_copy_func8)3191// CHECK3-NEXT: [[TMP8:%.*]] = icmp eq i32 [[TMP7]], 13192// CHECK3-NEXT: br i1 [[TMP8]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]]3193// CHECK3: .omp.reduction.then:3194// CHECK3-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP0]], align 43195// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[A1]], align 43196// CHECK3-NEXT: [[OR5:%.*]] = or i32 [[TMP9]], [[TMP10]]3197// CHECK3-NEXT: store i32 [[OR5]], ptr [[TMP0]], align 43198// CHECK3-NEXT: [[TMP11:%.*]] = load i16, ptr [[TMP1]], align 23199// CHECK3-NEXT: [[CONV6:%.*]] = sext i16 [[TMP11]] to i323200// CHECK3-NEXT: [[TMP12:%.*]] = load i16, ptr [[B2]], align 23201// CHECK3-NEXT: [[CONV7:%.*]] = sext i16 [[TMP12]] to i323202// CHECK3-NEXT: [[CMP8:%.*]] = icmp sgt i32 [[CONV6]], [[CONV7]]3203// CHECK3-NEXT: br i1 [[CMP8]], label [[COND_TRUE9:%.*]], label [[COND_FALSE10:%.*]]3204// CHECK3: cond.true9:3205// CHECK3-NEXT: [[TMP13:%.*]] = load i16, ptr [[TMP1]], align 23206// CHECK3-NEXT: br label [[COND_END11:%.*]]3207// CHECK3: cond.false10:3208// CHECK3-NEXT: [[TMP14:%.*]] = load i16, ptr [[B2]], align 23209// CHECK3-NEXT: br label [[COND_END11]]3210// CHECK3: cond.end11:3211// CHECK3-NEXT: [[COND12:%.*]] = phi i16 [ [[TMP13]], [[COND_TRUE9]] ], [ [[TMP14]], [[COND_FALSE10]] ]3212// CHECK3-NEXT: store i16 [[COND12]], ptr [[TMP1]], align 23213// CHECK3-NEXT: br label [[DOTOMP_REDUCTION_DONE]]3214// CHECK3: .omp.reduction.done:3215// CHECK3-NEXT: ret void3216//3217//3218// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func73219// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3]] {3220// CHECK3-NEXT: entry:3221// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 43222// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 23223// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 23224// CHECK3-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 23225// CHECK3-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [2 x ptr], align 43226// CHECK3-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca i32, align 43227// CHECK3-NEXT: [[DOTOMP_REDUCTION_ELEMENT4:%.*]] = alloca i16, align 23228// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 43229// CHECK3-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 23230// CHECK3-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 23231// CHECK3-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 23232// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 43233// CHECK3-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 23234// CHECK3-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 23235// CHECK3-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 23236// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 03237// CHECK3-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 43238// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 03239// CHECK3-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr [[TMP9]], i32 13240// CHECK3-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP9]], align 43241// CHECK3-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_get_warp_size()3242// CHECK3-NEXT: [[TMP14:%.*]] = trunc i32 [[TMP13]] to i163243// CHECK3-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP12]], i16 [[TMP6]], i16 [[TMP14]])3244// CHECK3-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 43245// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr i32, ptr [[TMP9]], i32 13246// CHECK3-NEXT: [[TMP17:%.*]] = getelementptr i32, ptr [[DOTOMP_REDUCTION_ELEMENT]], i32 13247// CHECK3-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 43248// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 13249// CHECK3-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 43250// CHECK3-NEXT: [[TMP20:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 13251// CHECK3-NEXT: [[TMP21:%.*]] = getelementptr i16, ptr [[TMP19]], i32 13252// CHECK3-NEXT: [[TMP22:%.*]] = load i16, ptr [[TMP19]], align 23253// CHECK3-NEXT: [[TMP23:%.*]] = sext i16 [[TMP22]] to i323254// CHECK3-NEXT: [[TMP24:%.*]] = call i32 @__kmpc_get_warp_size()3255// CHECK3-NEXT: [[TMP25:%.*]] = trunc i32 [[TMP24]] to i163256// CHECK3-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP23]], i16 [[TMP6]], i16 [[TMP25]])3257// CHECK3-NEXT: [[TMP27:%.*]] = trunc i32 [[TMP26]] to i163258// CHECK3-NEXT: store i16 [[TMP27]], ptr [[DOTOMP_REDUCTION_ELEMENT4]], align 23259// CHECK3-NEXT: [[TMP28:%.*]] = getelementptr i16, ptr [[TMP19]], i32 13260// CHECK3-NEXT: [[TMP29:%.*]] = getelementptr i16, ptr [[DOTOMP_REDUCTION_ELEMENT4]], i32 13261// CHECK3-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT4]], ptr [[TMP20]], align 43262// CHECK3-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 03263// CHECK3-NEXT: [[TMP31:%.*]] = icmp eq i16 [[TMP7]], 13264// CHECK3-NEXT: [[TMP32:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]3265// CHECK3-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]]3266// CHECK3-NEXT: [[TMP34:%.*]] = icmp eq i16 [[TMP7]], 23267// CHECK3-NEXT: [[TMP35:%.*]] = and i16 [[TMP5]], 13268// CHECK3-NEXT: [[TMP36:%.*]] = icmp eq i16 [[TMP35]], 03269// CHECK3-NEXT: [[TMP37:%.*]] = and i1 [[TMP34]], [[TMP36]]3270// CHECK3-NEXT: [[TMP38:%.*]] = icmp sgt i16 [[TMP6]], 03271// CHECK3-NEXT: [[TMP39:%.*]] = and i1 [[TMP37]], [[TMP38]]3272// CHECK3-NEXT: [[TMP40:%.*]] = or i1 [[TMP30]], [[TMP33]]3273// CHECK3-NEXT: [[TMP41:%.*]] = or i1 [[TMP40]], [[TMP39]]3274// CHECK3-NEXT: br i1 [[TMP41]], label [[THEN:%.*]], label [[ELSE:%.*]]3275// CHECK3: then:3276// CHECK3-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]3277// CHECK3-NEXT: br label [[IFCONT:%.*]]3278// CHECK3: else:3279// CHECK3-NEXT: br label [[IFCONT]]3280// CHECK3: ifcont:3281// CHECK3-NEXT: [[TMP42:%.*]] = icmp eq i16 [[TMP7]], 13282// CHECK3-NEXT: [[TMP43:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]3283// CHECK3-NEXT: [[TMP44:%.*]] = and i1 [[TMP42]], [[TMP43]]3284// CHECK3-NEXT: br i1 [[TMP44]], label [[THEN5:%.*]], label [[ELSE6:%.*]]3285// CHECK3: then5:3286// CHECK3-NEXT: [[TMP45:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 03287// CHECK3-NEXT: [[TMP46:%.*]] = load ptr, ptr [[TMP45]], align 43288// CHECK3-NEXT: [[TMP47:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 03289// CHECK3-NEXT: [[TMP48:%.*]] = load ptr, ptr [[TMP47]], align 43290// CHECK3-NEXT: [[TMP49:%.*]] = load i32, ptr [[TMP46]], align 43291// CHECK3-NEXT: store i32 [[TMP49]], ptr [[TMP48]], align 43292// CHECK3-NEXT: [[TMP50:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 13293// CHECK3-NEXT: [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 43294// CHECK3-NEXT: [[TMP52:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 13295// CHECK3-NEXT: [[TMP53:%.*]] = load ptr, ptr [[TMP52]], align 43296// CHECK3-NEXT: [[TMP54:%.*]] = load i16, ptr [[TMP51]], align 23297// CHECK3-NEXT: store i16 [[TMP54]], ptr [[TMP53]], align 23298// CHECK3-NEXT: br label [[IFCONT7:%.*]]3299// CHECK3: else6:3300// CHECK3-NEXT: br label [[IFCONT7]]3301// CHECK3: ifcont7:3302// CHECK3-NEXT: ret void3303//3304//3305// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func83306// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {3307// CHECK3-NEXT: entry:3308// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 43309// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 43310// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 43311// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 43312// CHECK3-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()3313// CHECK3-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()3314// CHECK3-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 313315// CHECK3-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()3316// CHECK3-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 53317// CHECK3-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 43318// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3319// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])3320// CHECK3-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 03321// CHECK3-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]3322// CHECK3: then:3323// CHECK3-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 03324// CHECK3-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 43325// CHECK3-NEXT: [[TMP9:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]3326// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP8]], align 43327// CHECK3-NEXT: store volatile i32 [[TMP10]], ptr addrspace(3) [[TMP9]], align 43328// CHECK3-NEXT: br label [[IFCONT:%.*]]3329// CHECK3: else:3330// CHECK3-NEXT: br label [[IFCONT]]3331// CHECK3: ifcont:3332// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3333// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])3334// CHECK3-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTADDR1]], align 43335// CHECK3-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP11]]3336// CHECK3-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]3337// CHECK3: then3:3338// CHECK3-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]3339// CHECK3-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 03340// CHECK3-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 43341// CHECK3-NEXT: [[TMP15:%.*]] = load volatile i32, ptr addrspace(3) [[TMP12]], align 43342// CHECK3-NEXT: store i32 [[TMP15]], ptr [[TMP14]], align 43343// CHECK3-NEXT: br label [[IFCONT4:%.*]]3344// CHECK3: else4:3345// CHECK3-NEXT: br label [[IFCONT4]]3346// CHECK3: ifcont5:3347// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3348// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])3349// CHECK3-NEXT: [[WARP_MASTER5:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 03350// CHECK3-NEXT: br i1 [[WARP_MASTER5]], label [[THEN6:%.*]], label [[ELSE7:%.*]]3351// CHECK3: then8:3352// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 13353// CHECK3-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 43354// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]3355// CHECK3-NEXT: [[TMP19:%.*]] = load i16, ptr [[TMP17]], align 23356// CHECK3-NEXT: store volatile i16 [[TMP19]], ptr addrspace(3) [[TMP18]], align 23357// CHECK3-NEXT: br label [[IFCONT8:%.*]]3358// CHECK3: else9:3359// CHECK3-NEXT: br label [[IFCONT8]]3360// CHECK3: ifcont10:3361// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3362// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])3363// CHECK3-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTADDR1]], align 43364// CHECK3-NEXT: [[IS_ACTIVE_THREAD9:%.*]] = icmp ult i32 [[TMP3]], [[TMP20]]3365// CHECK3-NEXT: br i1 [[IS_ACTIVE_THREAD9]], label [[THEN10:%.*]], label [[ELSE11:%.*]]3366// CHECK3: then13:3367// CHECK3-NEXT: [[TMP21:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]3368// CHECK3-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 13369// CHECK3-NEXT: [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 43370// CHECK3-NEXT: [[TMP24:%.*]] = load volatile i16, ptr addrspace(3) [[TMP21]], align 23371// CHECK3-NEXT: store i16 [[TMP24]], ptr [[TMP23]], align 23372// CHECK3-NEXT: br label [[IFCONT12:%.*]]3373// CHECK3: else14:3374// CHECK3-NEXT: br label [[IFCONT12]]3375// CHECK3: ifcont15:3376// CHECK3-NEXT: ret void3377//3378//3379// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func93380// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR3]] {3381// CHECK3-NEXT: entry:3382// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 43383// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 23384// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 23385// CHECK3-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 23386// CHECK3-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [2 x ptr], align 43387// CHECK3-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca i32, align 43388// CHECK3-NEXT: [[DOTOMP_REDUCTION_ELEMENT4:%.*]] = alloca i16, align 23389// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 43390// CHECK3-NEXT: store i16 [[TMP1]], ptr [[DOTADDR1]], align 23391// CHECK3-NEXT: store i16 [[TMP2]], ptr [[DOTADDR2]], align 23392// CHECK3-NEXT: store i16 [[TMP3]], ptr [[DOTADDR3]], align 23393// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 43394// CHECK3-NEXT: [[TMP5:%.*]] = load i16, ptr [[DOTADDR1]], align 23395// CHECK3-NEXT: [[TMP6:%.*]] = load i16, ptr [[DOTADDR2]], align 23396// CHECK3-NEXT: [[TMP7:%.*]] = load i16, ptr [[DOTADDR3]], align 23397// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 03398// CHECK3-NEXT: [[TMP9:%.*]] = load ptr, ptr [[TMP8]], align 43399// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 03400// CHECK3-NEXT: [[TMP11:%.*]] = getelementptr i32, ptr [[TMP9]], i32 13401// CHECK3-NEXT: [[TMP12:%.*]] = load i32, ptr [[TMP9]], align 43402// CHECK3-NEXT: [[TMP13:%.*]] = call i32 @__kmpc_get_warp_size()3403// CHECK3-NEXT: [[TMP14:%.*]] = trunc i32 [[TMP13]] to i163404// CHECK3-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP12]], i16 [[TMP6]], i16 [[TMP14]])3405// CHECK3-NEXT: store i32 [[TMP15]], ptr [[DOTOMP_REDUCTION_ELEMENT]], align 43406// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr i32, ptr [[TMP9]], i32 13407// CHECK3-NEXT: [[TMP17:%.*]] = getelementptr i32, ptr [[DOTOMP_REDUCTION_ELEMENT]], i32 13408// CHECK3-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT]], ptr [[TMP10]], align 43409// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 13410// CHECK3-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 43411// CHECK3-NEXT: [[TMP20:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 13412// CHECK3-NEXT: [[TMP21:%.*]] = getelementptr i16, ptr [[TMP19]], i32 13413// CHECK3-NEXT: [[TMP22:%.*]] = load i16, ptr [[TMP19]], align 23414// CHECK3-NEXT: [[TMP23:%.*]] = sext i16 [[TMP22]] to i323415// CHECK3-NEXT: [[TMP24:%.*]] = call i32 @__kmpc_get_warp_size()3416// CHECK3-NEXT: [[TMP25:%.*]] = trunc i32 [[TMP24]] to i163417// CHECK3-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_shuffle_int32(i32 [[TMP23]], i16 [[TMP6]], i16 [[TMP25]])3418// CHECK3-NEXT: [[TMP27:%.*]] = trunc i32 [[TMP26]] to i163419// CHECK3-NEXT: store i16 [[TMP27]], ptr [[DOTOMP_REDUCTION_ELEMENT4]], align 23420// CHECK3-NEXT: [[TMP28:%.*]] = getelementptr i16, ptr [[TMP19]], i32 13421// CHECK3-NEXT: [[TMP29:%.*]] = getelementptr i16, ptr [[DOTOMP_REDUCTION_ELEMENT4]], i32 13422// CHECK3-NEXT: store ptr [[DOTOMP_REDUCTION_ELEMENT4]], ptr [[TMP20]], align 43423// CHECK3-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP7]], 03424// CHECK3-NEXT: [[TMP31:%.*]] = icmp eq i16 [[TMP7]], 13425// CHECK3-NEXT: [[TMP32:%.*]] = icmp ult i16 [[TMP5]], [[TMP6]]3426// CHECK3-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]]3427// CHECK3-NEXT: [[TMP34:%.*]] = icmp eq i16 [[TMP7]], 23428// CHECK3-NEXT: [[TMP35:%.*]] = and i16 [[TMP5]], 13429// CHECK3-NEXT: [[TMP36:%.*]] = icmp eq i16 [[TMP35]], 03430// CHECK3-NEXT: [[TMP37:%.*]] = and i1 [[TMP34]], [[TMP36]]3431// CHECK3-NEXT: [[TMP38:%.*]] = icmp sgt i16 [[TMP6]], 03432// CHECK3-NEXT: [[TMP39:%.*]] = and i1 [[TMP37]], [[TMP38]]3433// CHECK3-NEXT: [[TMP40:%.*]] = or i1 [[TMP30]], [[TMP33]]3434// CHECK3-NEXT: [[TMP41:%.*]] = or i1 [[TMP40]], [[TMP39]]3435// CHECK3-NEXT: br i1 [[TMP41]], label [[THEN:%.*]], label [[ELSE:%.*]]3436// CHECK3: then:3437// CHECK3-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP4]], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]]) #[[ATTR4]]3438// CHECK3-NEXT: br label [[IFCONT:%.*]]3439// CHECK3: else:3440// CHECK3-NEXT: br label [[IFCONT]]3441// CHECK3: ifcont:3442// CHECK3-NEXT: [[TMP42:%.*]] = icmp eq i16 [[TMP7]], 13443// CHECK3-NEXT: [[TMP43:%.*]] = icmp uge i16 [[TMP5]], [[TMP6]]3444// CHECK3-NEXT: [[TMP44:%.*]] = and i1 [[TMP42]], [[TMP43]]3445// CHECK3-NEXT: br i1 [[TMP44]], label [[THEN5:%.*]], label [[ELSE6:%.*]]3446// CHECK3: then5:3447// CHECK3-NEXT: [[TMP45:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 03448// CHECK3-NEXT: [[TMP46:%.*]] = load ptr, ptr [[TMP45]], align 43449// CHECK3-NEXT: [[TMP47:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 03450// CHECK3-NEXT: [[TMP48:%.*]] = load ptr, ptr [[TMP47]], align 43451// CHECK3-NEXT: [[TMP49:%.*]] = load i32, ptr [[TMP46]], align 43452// CHECK3-NEXT: store i32 [[TMP49]], ptr [[TMP48]], align 43453// CHECK3-NEXT: [[TMP50:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i32 0, i32 13454// CHECK3-NEXT: [[TMP51:%.*]] = load ptr, ptr [[TMP50]], align 43455// CHECK3-NEXT: [[TMP52:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP4]], i32 0, i32 13456// CHECK3-NEXT: [[TMP53:%.*]] = load ptr, ptr [[TMP52]], align 43457// CHECK3-NEXT: [[TMP54:%.*]] = load i16, ptr [[TMP51]], align 23458// CHECK3-NEXT: store i16 [[TMP54]], ptr [[TMP53]], align 23459// CHECK3-NEXT: br label [[IFCONT7:%.*]]3460// CHECK3: else6:3461// CHECK3-NEXT: br label [[IFCONT7]]3462// CHECK3: ifcont7:3463// CHECK3-NEXT: ret void3464//3465//3466// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func103467// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR3]] {3468// CHECK3-NEXT: entry:3469// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 43470// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 43471// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 43472// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 43473// CHECK3-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()3474// CHECK3-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()3475// CHECK3-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 313476// CHECK3-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block()3477// CHECK3-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 53478// CHECK3-NEXT: [[TMP6:%.*]] = load ptr, ptr [[DOTADDR]], align 43479// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3480// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])3481// CHECK3-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 03482// CHECK3-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]]3483// CHECK3: then:3484// CHECK3-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 03485// CHECK3-NEXT: [[TMP8:%.*]] = load ptr, ptr [[TMP7]], align 43486// CHECK3-NEXT: [[TMP9:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]3487// CHECK3-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP8]], align 43488// CHECK3-NEXT: store volatile i32 [[TMP10]], ptr addrspace(3) [[TMP9]], align 43489// CHECK3-NEXT: br label [[IFCONT:%.*]]3490// CHECK3: else:3491// CHECK3-NEXT: br label [[IFCONT]]3492// CHECK3: ifcont:3493// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3494// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])3495// CHECK3-NEXT: [[TMP11:%.*]] = load i32, ptr [[DOTADDR1]], align 43496// CHECK3-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP11]]3497// CHECK3-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]]3498// CHECK3: then3:3499// CHECK3-NEXT: [[TMP12:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]3500// CHECK3-NEXT: [[TMP13:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 03501// CHECK3-NEXT: [[TMP14:%.*]] = load ptr, ptr [[TMP13]], align 43502// CHECK3-NEXT: [[TMP15:%.*]] = load volatile i32, ptr addrspace(3) [[TMP12]], align 43503// CHECK3-NEXT: store i32 [[TMP15]], ptr [[TMP14]], align 43504// CHECK3-NEXT: br label [[IFCONT4:%.*]]3505// CHECK3: else4:3506// CHECK3-NEXT: br label [[IFCONT4]]3507// CHECK3: ifcont5:3508// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3509// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])3510// CHECK3-NEXT: [[WARP_MASTER5:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 03511// CHECK3-NEXT: br i1 [[WARP_MASTER5]], label [[THEN6:%.*]], label [[ELSE7:%.*]]3512// CHECK3: then8:3513// CHECK3-NEXT: [[TMP16:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 13514// CHECK3-NEXT: [[TMP17:%.*]] = load ptr, ptr [[TMP16]], align 43515// CHECK3-NEXT: [[TMP18:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]]3516// CHECK3-NEXT: [[TMP19:%.*]] = load i16, ptr [[TMP17]], align 23517// CHECK3-NEXT: store volatile i16 [[TMP19]], ptr addrspace(3) [[TMP18]], align 23518// CHECK3-NEXT: br label [[IFCONT8:%.*]]3519// CHECK3: else9:3520// CHECK3-NEXT: br label [[IFCONT8]]3521// CHECK3: ifcont10:3522// CHECK3-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(ptr @[[GLOB1]])3523// CHECK3-NEXT: call void @__kmpc_barrier(ptr @[[GLOB2]], i32 [[TMP2]])3524// CHECK3-NEXT: [[TMP20:%.*]] = load i32, ptr [[DOTADDR1]], align 43525// CHECK3-NEXT: [[IS_ACTIVE_THREAD9:%.*]] = icmp ult i32 [[TMP3]], [[TMP20]]3526// CHECK3-NEXT: br i1 [[IS_ACTIVE_THREAD9]], label [[THEN10:%.*]], label [[ELSE11:%.*]]3527// CHECK3: then13:3528// CHECK3-NEXT: [[TMP21:%.*]] = getelementptr inbounds [32 x i32], ptr addrspace(3) @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]]3529// CHECK3-NEXT: [[TMP22:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP6]], i32 0, i32 13530// CHECK3-NEXT: [[TMP23:%.*]] = load ptr, ptr [[TMP22]], align 43531// CHECK3-NEXT: [[TMP24:%.*]] = load volatile i16, ptr addrspace(3) [[TMP21]], align 23532// CHECK3-NEXT: store i16 [[TMP24]], ptr [[TMP23]], align 23533// CHECK3-NEXT: br label [[IFCONT12:%.*]]3534// CHECK3: else14:3535// CHECK3-NEXT: br label [[IFCONT12]]3536// CHECK3: ifcont15:3537// CHECK3-NEXT: ret void3538//3539//3540// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_copy_func113541// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {3542// CHECK3-NEXT: entry:3543// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 43544// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 43545// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 43546// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 43547// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 43548// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 43549// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 43550// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 43551// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 43552// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 03553// CHECK3-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 43554// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP4]], i32 [[TMP5]]3555// CHECK3-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 03556// CHECK3-NEXT: [[TMP9:%.*]] = load i32, ptr [[TMP7]], align 43557// CHECK3-NEXT: store i32 [[TMP9]], ptr [[A]], align 43558// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 13559// CHECK3-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 43560// CHECK3-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP4]], i32 [[TMP5]]3561// CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP12]], i32 0, i32 13562// CHECK3-NEXT: [[TMP13:%.*]] = load i16, ptr [[TMP11]], align 23563// CHECK3-NEXT: store i16 [[TMP13]], ptr [[B]], align 23564// CHECK3-NEXT: ret void3565//3566//3567// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_list_to_global_reduce_func123568// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {3569// CHECK3-NEXT: entry:3570// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 43571// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 43572// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 43573// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 43574// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 43575// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 43576// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 43577// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 43578// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 43579// CHECK3-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 03580// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP3]], i32 [[TMP4]]3581// CHECK3-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP6]], i32 0, i32 03582// CHECK3-NEXT: store ptr [[A]], ptr [[TMP5]], align 43583// CHECK3-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 13584// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP3]], i32 [[TMP4]]3585// CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 13586// CHECK3-NEXT: store ptr [[B]], ptr [[TMP7]], align 43587// CHECK3-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 43588// CHECK3-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp$reduction$reduction_func"(ptr [[DOTOMP_REDUCTION_RED_LIST]], ptr [[TMP9]]) #[[ATTR4]]3589// CHECK3-NEXT: ret void3590//3591//3592// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_copy_func133593// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {3594// CHECK3-NEXT: entry:3595// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 43596// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 43597// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 43598// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 43599// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 43600// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 43601// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR2]], align 43602// CHECK3-NEXT: [[TMP4:%.*]] = load ptr, ptr [[DOTADDR]], align 43603// CHECK3-NEXT: [[TMP5:%.*]] = load i32, ptr [[DOTADDR1]], align 43604// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 03605// CHECK3-NEXT: [[TMP7:%.*]] = load ptr, ptr [[TMP6]], align 43606// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP4]], i32 [[TMP5]]3607// CHECK3-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 03608// CHECK3-NEXT: [[TMP9:%.*]] = load i32, ptr [[A]], align 43609// CHECK3-NEXT: store i32 [[TMP9]], ptr [[TMP7]], align 43610// CHECK3-NEXT: [[TMP10:%.*]] = getelementptr inbounds [2 x ptr], ptr [[TMP3]], i32 0, i32 13611// CHECK3-NEXT: [[TMP11:%.*]] = load ptr, ptr [[TMP10]], align 43612// CHECK3-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP4]], i32 [[TMP5]]3613// CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP12]], i32 0, i32 13614// CHECK3-NEXT: [[TMP13:%.*]] = load i16, ptr [[B]], align 23615// CHECK3-NEXT: store i16 [[TMP13]], ptr [[TMP11]], align 23616// CHECK3-NEXT: ret void3617//3618//3619// CHECK3-LABEL: define {{[^@]+}}@_omp_reduction_global_to_list_reduce_func143620// CHECK3-SAME: (ptr noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]], ptr noundef [[TMP2:%.*]]) #[[ATTR3]] {3621// CHECK3-NEXT: entry:3622// CHECK3-NEXT: [[DOTADDR:%.*]] = alloca ptr, align 43623// CHECK3-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 43624// CHECK3-NEXT: [[DOTADDR2:%.*]] = alloca ptr, align 43625// CHECK3-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x ptr], align 43626// CHECK3-NEXT: store ptr [[TMP0]], ptr [[DOTADDR]], align 43627// CHECK3-NEXT: store i32 [[TMP1]], ptr [[DOTADDR1]], align 43628// CHECK3-NEXT: store ptr [[TMP2]], ptr [[DOTADDR2]], align 43629// CHECK3-NEXT: [[TMP3:%.*]] = load ptr, ptr [[DOTADDR]], align 43630// CHECK3-NEXT: [[TMP4:%.*]] = load i32, ptr [[DOTADDR1]], align 43631// CHECK3-NEXT: [[TMP5:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 03632// CHECK3-NEXT: [[TMP6:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2:%.*]], ptr [[TMP3]], i32 [[TMP4]]3633// CHECK3-NEXT: [[A:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP6]], i32 0, i32 03634// CHECK3-NEXT: store ptr [[A]], ptr [[TMP5]], align 43635// CHECK3-NEXT: [[TMP7:%.*]] = getelementptr inbounds [2 x ptr], ptr [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 13636// CHECK3-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP3]], i32 [[TMP4]]3637// CHECK3-NEXT: [[B:%.*]] = getelementptr inbounds [[STRUCT__GLOBALIZED_LOCALS_TY_2]], ptr [[TMP8]], i32 0, i32 13638// CHECK3-NEXT: store ptr [[B]], ptr [[TMP7]], align 43639// CHECK3-NEXT: [[TMP9:%.*]] = load ptr, ptr [[DOTADDR2]], align 43640// CHECK3-NEXT: call void @"{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z9ftemplateIcET_i_l33_omp_outlined_omp$reduction$reduction_func"(ptr [[TMP9]], ptr [[DOTOMP_REDUCTION_RED_LIST]]) #[[ATTR4]]3641// CHECK3-NEXT: ret void3642//3643