1d04d9220SAlexey Bataev // 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 _ 2532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -fopenmp-cuda-mode -x c++ \ 3c274b198SJennifer Yu // RUN: -triple powerpc64le-unknown-unknown -DCUDA \ 4c274b198SJennifer Yu // RUN: -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o \ 5c274b198SJennifer Yu // RUN: %t-ppc-host.bc 6c274b198SJennifer Yu 7532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -fopenmp-cuda-mode -x c++ \ 8c274b198SJennifer Yu // RUN: -triple nvptx64-unknown-unknown -DCUA \ 9c274b198SJennifer Yu // RUN: -fopenmp-targets=nvptx64-nvidia-cuda -DCUDA -emit-llvm %s \ 10c274b198SJennifer Yu // RUN: -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc \ 11c274b198SJennifer Yu // RUN: -o - | FileCheck %s --check-prefix CHECK 12c274b198SJennifer Yu 13532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -x c++ \ 14c274b198SJennifer Yu // RUN: -triple powerpc64le-unknown-unknown -DDIAG\ 15c274b198SJennifer Yu // RUN: -fopenmp-targets=powerpc64le-ibm-linux-gnu -emit-llvm \ 16c274b198SJennifer Yu // RUN: %s -o - | FileCheck %s \ 17c274b198SJennifer Yu // RUN: --check-prefix=CHECK1 18c274b198SJennifer Yu 19532dc62bSNikita Popov // RUN: %clang_cc1 -no-opaque-pointers -verify -fopenmp -x c++ \ 20c274b198SJennifer Yu // RUN: -triple i386-unknown-unknown \ 21c274b198SJennifer Yu // RUN: -fopenmp-targets=i386-pc-linux-gnu -emit-llvm \ 22c274b198SJennifer Yu // RUN: %s -o - | FileCheck %s \ 23c274b198SJennifer Yu // RUN: --check-prefix=CHECK2 24c274b198SJennifer Yu 25c274b198SJennifer Yu 26c274b198SJennifer Yu #if defined(CUDA) 27c274b198SJennifer Yu // expected-no-diagnostics 28c274b198SJennifer Yu 29c274b198SJennifer Yu int foo(int n) { 30c274b198SJennifer Yu double *e; 31c274b198SJennifer Yu //no error and no implicit map generated for e[:1] 32c274b198SJennifer Yu #pragma omp target parallel reduction(+: e[:1]) 33c274b198SJennifer Yu *e=10; 34c274b198SJennifer Yu ; 35c274b198SJennifer Yu return 0; 36c274b198SJennifer Yu } 37c274b198SJennifer Yu // CHECK-NOT @.offload_maptypes 38c274b198SJennifer Yu #elif defined(DIAG) 39c274b198SJennifer Yu class S2 { 40c274b198SJennifer Yu mutable int a; 41c274b198SJennifer Yu public: 42c274b198SJennifer Yu S2():a(0) { } 43c274b198SJennifer Yu S2(S2 &s2):a(s2.a) { } 44c274b198SJennifer Yu S2 &operator +(S2 &s); 45c274b198SJennifer Yu }; 46c274b198SJennifer Yu int bar() { 47c274b198SJennifer Yu S2 o[5]; 48c274b198SJennifer Yu //warnig "copyable and not guaranteed to be mapped correctly" and 49c274b198SJennifer Yu //implicit map generated. 50c274b198SJennifer Yu #pragma omp target parallel reduction(+:o[0]) //expected-warning {{Type 'S2' is not trivially copyable and not guaranteed to be mapped correctly}} 51c274b198SJennifer Yu for (int i = 0; i < 10; i++); 52c274b198SJennifer Yu double b[10][10][10]; 53c274b198SJennifer Yu //no error no implicit map generated, the map for b is generated but not 54c274b198SJennifer Yu //for b[0:2][2:4][1]. 55c274b198SJennifer Yu #pragma omp target parallel for reduction(task, +: b[0:2][2:4][1]) 56c274b198SJennifer Yu for (long long i = 0; i < 10; ++i); 57c274b198SJennifer Yu return 0; 58c274b198SJennifer Yu } 59c274b198SJennifer Yu // map for variable o 60c274b198SJennifer Yu // map for b: 61c274b198SJennifer Yu #else 62c274b198SJennifer Yu // expected-no-diagnostics 63c274b198SJennifer Yu 64c274b198SJennifer Yu // generate implicit map for array elements or array sections in reduction 65c274b198SJennifer Yu // clause. In following case: the implicit map is generate for output[0] 66c274b198SJennifer Yu // with map size 4 and output[:3] with map size 12. 67c274b198SJennifer Yu void sum(int* input, int size, int* output) 68c274b198SJennifer Yu { 69c274b198SJennifer Yu #pragma omp target teams distribute parallel for reduction(+: output[0]) \ 70c274b198SJennifer Yu map(to: input [0:size]) 71c274b198SJennifer Yu for (int i = 0; i < size; i++) 72c274b198SJennifer Yu output[0] += input[i]; 73c274b198SJennifer Yu #pragma omp target teams distribute parallel for reduction(+: output[:3]) \ 74c274b198SJennifer Yu map(to: input [0:size]) 75c274b198SJennifer Yu for (int i = 0; i < size; i++) 76c274b198SJennifer Yu output[0] += input[i]; 77c274b198SJennifer Yu int a[10]; 78c274b198SJennifer Yu #pragma omp target parallel reduction(+: a[:2]) 79c274b198SJennifer Yu for (int i = 0; i < size; i++) 80c274b198SJennifer Yu ; 81c274b198SJennifer Yu #pragma omp target parallel reduction(+: a[3]) 82c274b198SJennifer Yu for (int i = 0; i < size; i++) 83c274b198SJennifer Yu ; 84c274b198SJennifer Yu } 85c274b198SJennifer Yu #endif 86c274b198SJennifer Yu int main() 87c274b198SJennifer Yu { 88c274b198SJennifer Yu #if defined(CUDA) 89c274b198SJennifer Yu int a = foo(10); 90c274b198SJennifer Yu #elif defined(DIAG) 91c274b198SJennifer Yu int a = bar(); 92c274b198SJennifer Yu #else 93c274b198SJennifer Yu const int size = 100; 94c274b198SJennifer Yu int *array = new int[size]; 95c274b198SJennifer Yu int result = 0; 96c274b198SJennifer Yu sum(array, size, &result); 97c274b198SJennifer Yu #endif 98c274b198SJennifer Yu return 0; 99c274b198SJennifer Yu } 100d04d9220SAlexey Bataev // CHECK-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3fooi_l32 101d04d9220SAlexey Bataev // CHECK-SAME: (double* noundef [[E:%.*]]) #[[ATTR0:[0-9]+]] { 102d04d9220SAlexey Bataev // CHECK-NEXT: entry: 103d04d9220SAlexey Bataev // CHECK-NEXT: [[E_ADDR:%.*]] = alloca double*, align 8 104d04d9220SAlexey Bataev // CHECK-NEXT: [[CAPTURED_VARS_ADDRS:%.*]] = alloca [1 x i8*], align 8 105d04d9220SAlexey Bataev // CHECK-NEXT: store double* [[E]], double** [[E_ADDR]], align 8 106d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP0:%.*]] = call i32 @__kmpc_target_init(%struct.ident_t* @[[GLOB1:[0-9]+]], i8 2, i1 false, i1 true) 107d04d9220SAlexey Bataev // CHECK-NEXT: [[EXEC_USER_CODE:%.*]] = icmp eq i32 [[TMP0]], -1 108d04d9220SAlexey Bataev // CHECK-NEXT: br i1 [[EXEC_USER_CODE]], label [[USER_CODE_ENTRY:%.*]], label [[WORKER_EXIT:%.*]] 109d04d9220SAlexey Bataev // CHECK: user_code.entry: 110d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP1:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2:[0-9]+]]) 111d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP2:%.*]] = load double*, double** [[E_ADDR]], align 8 112d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[CAPTURED_VARS_ADDRS]], i64 0, i64 0 113d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP4:%.*]] = bitcast double* [[TMP2]] to i8* 114d04d9220SAlexey Bataev // CHECK-NEXT: store i8* [[TMP4]], i8** [[TMP3]], align 8 115d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP5:%.*]] = bitcast [1 x i8*]* [[CAPTURED_VARS_ADDRS]] to i8** 116d04d9220SAlexey Bataev // CHECK-NEXT: call void @__kmpc_parallel_51(%struct.ident_t* @[[GLOB2]], i32 [[TMP1]], i32 1, i32 -1, i32 -1, i8* bitcast (void (i32*, i32*, double*)* @__omp_outlined__ to i8*), i8* null, i8** [[TMP5]], i64 1) 117d04d9220SAlexey Bataev // CHECK-NEXT: call void @__kmpc_target_deinit(%struct.ident_t* @[[GLOB1]], i8 2, i1 true) 118d04d9220SAlexey Bataev // CHECK-NEXT: ret void 119d04d9220SAlexey Bataev // CHECK: worker.exit: 120d04d9220SAlexey Bataev // CHECK-NEXT: ret void 121d04d9220SAlexey Bataev // 122d04d9220SAlexey Bataev // 123d04d9220SAlexey Bataev // CHECK-LABEL: define {{[^@]+}}@__omp_outlined__ 124d04d9220SAlexey Bataev // CHECK-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], double* noundef [[E:%.*]]) #[[ATTR1:[0-9]+]] { 125d04d9220SAlexey Bataev // CHECK-NEXT: entry: 126d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 127d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 128d04d9220SAlexey Bataev // CHECK-NEXT: [[E_ADDR:%.*]] = alloca double*, align 8 129d04d9220SAlexey Bataev // CHECK-NEXT: [[E2:%.*]] = alloca double, align 8 130d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP:%.*]] = alloca double*, align 8 131d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8 132d04d9220SAlexey Bataev // CHECK-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 133d04d9220SAlexey Bataev // CHECK-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 134d04d9220SAlexey Bataev // CHECK-NEXT: store double* [[E]], double** [[E_ADDR]], align 8 135d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP0:%.*]] = load double*, double** [[E_ADDR]], align 8 136d04d9220SAlexey Bataev // CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds double, double* [[TMP0]], i64 0 137d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP1:%.*]] = load double*, double** [[E_ADDR]], align 8 138d04d9220SAlexey Bataev // CHECK-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds double, double* [[TMP1]], i64 0 139d04d9220SAlexey Bataev // CHECK-NEXT: store double 0.000000e+00, double* [[E2]], align 8 140d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP2:%.*]] = load double*, double** [[E_ADDR]], align 8 141d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP3:%.*]] = ptrtoint double* [[TMP2]] to i64 142d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP4:%.*]] = ptrtoint double* [[ARRAYIDX]] to i64 143d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP5:%.*]] = sub i64 [[TMP3]], [[TMP4]] 144d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP6:%.*]] = sdiv exact i64 [[TMP5]], ptrtoint (double* getelementptr (double, double* null, i32 1) to i64) 145d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP7:%.*]] = getelementptr double, double* [[E2]], i64 [[TMP6]] 146d04d9220SAlexey Bataev // CHECK-NEXT: store double* [[TMP7]], double** [[TMP]], align 8 147d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP8:%.*]] = load double*, double** [[TMP]], align 8 148d04d9220SAlexey Bataev // CHECK-NEXT: store double 1.000000e+01, double* [[TMP8]], align 8 149d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP9:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 150d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP10:%.*]] = load i32, i32* [[TMP9]], align 4 151d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0 152d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP12:%.*]] = bitcast double* [[E2]] to i8* 153d04d9220SAlexey Bataev // CHECK-NEXT: store i8* [[TMP12]], i8** [[TMP11]], align 8 154d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP13:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8* 155d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP14:%.*]] = call i32 @__kmpc_nvptx_parallel_reduce_nowait_v2(%struct.ident_t* @[[GLOB2]], i32 [[TMP10]], i32 1, i64 8, i8* [[TMP13]], void (i8*, i16, i16, i16)* @_omp_reduction_shuffle_and_reduce_func, void (i8*, i32)* @_omp_reduction_inter_warp_copy_func) 156d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP15:%.*]] = icmp eq i32 [[TMP14]], 1 157d04d9220SAlexey Bataev // CHECK-NEXT: br i1 [[TMP15]], label [[DOTOMP_REDUCTION_THEN:%.*]], label [[DOTOMP_REDUCTION_DONE:%.*]] 158d04d9220SAlexey Bataev // CHECK: .omp.reduction.then: 159d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP16:%.*]] = load double, double* [[ARRAYIDX]], align 8 160d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP17:%.*]] = load double, double* [[E2]], align 8 161d04d9220SAlexey Bataev // CHECK-NEXT: [[ADD:%.*]] = fadd double [[TMP16]], [[TMP17]] 162d04d9220SAlexey Bataev // CHECK-NEXT: store double [[ADD]], double* [[ARRAYIDX]], align 8 163d04d9220SAlexey Bataev // CHECK-NEXT: call void @__kmpc_nvptx_end_reduce_nowait(i32 [[TMP10]]) 164d04d9220SAlexey Bataev // CHECK-NEXT: br label [[DOTOMP_REDUCTION_DONE]] 165d04d9220SAlexey Bataev // CHECK: .omp.reduction.done: 166d04d9220SAlexey Bataev // CHECK-NEXT: ret void 167d04d9220SAlexey Bataev // 168d04d9220SAlexey Bataev // 169d04d9220SAlexey Bataev // CHECK-LABEL: define {{[^@]+}}@_omp_reduction_shuffle_and_reduce_func 170d04d9220SAlexey Bataev // CHECK-SAME: (i8* noundef [[TMP0:%.*]], i16 noundef signext [[TMP1:%.*]], i16 noundef signext [[TMP2:%.*]], i16 noundef signext [[TMP3:%.*]]) #[[ATTR2:[0-9]+]] { 171d04d9220SAlexey Bataev // CHECK-NEXT: entry: 172d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 173d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTADDR1:%.*]] = alloca i16, align 2 174d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTADDR2:%.*]] = alloca i16, align 2 175d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTADDR3:%.*]] = alloca i16, align 2 176d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST:%.*]] = alloca [1 x i8*], align 8 177d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTOMP_REDUCTION_ELEMENT:%.*]] = alloca double, align 8 178d04d9220SAlexey Bataev // CHECK-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 179d04d9220SAlexey Bataev // CHECK-NEXT: store i16 [[TMP1]], i16* [[DOTADDR1]], align 2 180d04d9220SAlexey Bataev // CHECK-NEXT: store i16 [[TMP2]], i16* [[DOTADDR2]], align 2 181d04d9220SAlexey Bataev // CHECK-NEXT: store i16 [[TMP3]], i16* [[DOTADDR3]], align 2 182d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR]], align 8 183d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]* 184d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP6:%.*]] = load i16, i16* [[DOTADDR1]], align 2 185d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP7:%.*]] = load i16, i16* [[DOTADDR2]], align 2 186d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP8:%.*]] = load i16, i16* [[DOTADDR3]], align 2 187d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0 1887a2e12e0SNikita Popov // CHECK-NEXT: [[TMP10:%.*]] = bitcast i8** [[TMP9]] to double** 1897a2e12e0SNikita Popov // CHECK-NEXT: [[TMP11:%.*]] = load double*, double** [[TMP10]], align 8 1907a2e12e0SNikita Popov // CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0 1917a2e12e0SNikita Popov // CHECK-NEXT: [[TMP13:%.*]] = getelementptr double, double* [[TMP11]], i64 1 192d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP14:%.*]] = bitcast double* [[TMP13]] to i8* 1937a2e12e0SNikita Popov // CHECK-NEXT: [[TMP15:%.*]] = bitcast double* [[TMP11]] to i64* 194d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP16:%.*]] = bitcast double* [[DOTOMP_REDUCTION_ELEMENT]] to i64* 195d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP17:%.*]] = load i64, i64* [[TMP15]], align 8 196d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_get_warp_size() 197d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP19:%.*]] = trunc i32 [[TMP18]] to i16 198d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP20:%.*]] = call i64 @__kmpc_shuffle_int64(i64 [[TMP17]], i16 [[TMP7]], i16 [[TMP19]]) 199d04d9220SAlexey Bataev // CHECK-NEXT: store i64 [[TMP20]], i64* [[TMP16]], align 8 200d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP21:%.*]] = getelementptr i64, i64* [[TMP15]], i64 1 201d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP22:%.*]] = getelementptr i64, i64* [[TMP16]], i64 1 202d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP23:%.*]] = bitcast double* [[DOTOMP_REDUCTION_ELEMENT]] to i8* 2037a2e12e0SNikita Popov // CHECK-NEXT: store i8* [[TMP23]], i8** [[TMP12]], align 8 204d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP24:%.*]] = icmp eq i16 [[TMP8]], 0 205d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP25:%.*]] = icmp eq i16 [[TMP8]], 1 206d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP26:%.*]] = icmp ult i16 [[TMP6]], [[TMP7]] 207d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP27:%.*]] = and i1 [[TMP25]], [[TMP26]] 208d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP28:%.*]] = icmp eq i16 [[TMP8]], 2 209d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP29:%.*]] = and i16 [[TMP6]], 1 210d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP30:%.*]] = icmp eq i16 [[TMP29]], 0 211d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP31:%.*]] = and i1 [[TMP28]], [[TMP30]] 212d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP32:%.*]] = icmp sgt i16 [[TMP7]], 0 213d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP33:%.*]] = and i1 [[TMP31]], [[TMP32]] 214d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP34:%.*]] = or i1 [[TMP24]], [[TMP27]] 215d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP35:%.*]] = or i1 [[TMP34]], [[TMP33]] 216d04d9220SAlexey Bataev // CHECK-NEXT: br i1 [[TMP35]], label [[THEN:%.*]], label [[ELSE:%.*]] 217d04d9220SAlexey Bataev // CHECK: then: 218d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP36:%.*]] = bitcast [1 x i8*]* [[TMP5]] to i8* 219d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP37:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]] to i8* 220d04d9220SAlexey Bataev // CHECK-NEXT: call void @"_omp$reduction$reduction_func"(i8* [[TMP36]], i8* [[TMP37]]) #[[ATTR3:[0-9]+]] 221d04d9220SAlexey Bataev // CHECK-NEXT: br label [[IFCONT:%.*]] 222d04d9220SAlexey Bataev // CHECK: else: 223d04d9220SAlexey Bataev // CHECK-NEXT: br label [[IFCONT]] 224d04d9220SAlexey Bataev // CHECK: ifcont: 225d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP38:%.*]] = icmp eq i16 [[TMP8]], 1 226d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP39:%.*]] = icmp uge i16 [[TMP6]], [[TMP7]] 227d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP40:%.*]] = and i1 [[TMP38]], [[TMP39]] 228d04d9220SAlexey Bataev // CHECK-NEXT: br i1 [[TMP40]], label [[THEN4:%.*]], label [[ELSE5:%.*]] 229d04d9220SAlexey Bataev // CHECK: then4: 230d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP41:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_REMOTE_REDUCE_LIST]], i64 0, i64 0 2317a2e12e0SNikita Popov // CHECK-NEXT: [[TMP42:%.*]] = bitcast i8** [[TMP41]] to double** 2327a2e12e0SNikita Popov // CHECK-NEXT: [[TMP43:%.*]] = load double*, double** [[TMP42]], align 8 2337a2e12e0SNikita Popov // CHECK-NEXT: [[TMP44:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0 2347a2e12e0SNikita Popov // CHECK-NEXT: [[TMP45:%.*]] = bitcast i8** [[TMP44]] to double** 2357a2e12e0SNikita Popov // CHECK-NEXT: [[TMP46:%.*]] = load double*, double** [[TMP45]], align 8 2367a2e12e0SNikita Popov // CHECK-NEXT: [[TMP47:%.*]] = load double, double* [[TMP43]], align 8 237d04d9220SAlexey Bataev // CHECK-NEXT: store double [[TMP47]], double* [[TMP46]], align 8 238d04d9220SAlexey Bataev // CHECK-NEXT: br label [[IFCONT6:%.*]] 239d04d9220SAlexey Bataev // CHECK: else5: 240d04d9220SAlexey Bataev // CHECK-NEXT: br label [[IFCONT6]] 241d04d9220SAlexey Bataev // CHECK: ifcont6: 242d04d9220SAlexey Bataev // CHECK-NEXT: ret void 243d04d9220SAlexey Bataev // 244d04d9220SAlexey Bataev // 245d04d9220SAlexey Bataev // CHECK-LABEL: define {{[^@]+}}@_omp_reduction_inter_warp_copy_func 246d04d9220SAlexey Bataev // CHECK-SAME: (i8* noundef [[TMP0:%.*]], i32 noundef [[TMP1:%.*]]) #[[ATTR2]] { 247d04d9220SAlexey Bataev // CHECK-NEXT: entry: 248d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 249d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTADDR1:%.*]] = alloca i32, align 4 250d04d9220SAlexey Bataev // CHECK-NEXT: [[DOTCNT_ADDR:%.*]] = alloca i32, align 4 251d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP2:%.*]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* @[[GLOB2]]) 252d04d9220SAlexey Bataev // CHECK-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 253d04d9220SAlexey Bataev // CHECK-NEXT: store i32 [[TMP1]], i32* [[DOTADDR1]], align 4 254d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP3:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block() 255d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP4:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block() 256d04d9220SAlexey Bataev // CHECK-NEXT: [[NVPTX_LANE_ID:%.*]] = and i32 [[TMP4]], 31 257d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP5:%.*]] = call i32 @__kmpc_get_hardware_thread_id_in_block() 258d04d9220SAlexey Bataev // CHECK-NEXT: [[NVPTX_WARP_ID:%.*]] = ashr i32 [[TMP5]], 5 259d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP6:%.*]] = load i8*, i8** [[DOTADDR]], align 8 260d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP7:%.*]] = bitcast i8* [[TMP6]] to [1 x i8*]* 261d04d9220SAlexey Bataev // CHECK-NEXT: store i32 0, i32* [[DOTCNT_ADDR]], align 4 262d04d9220SAlexey Bataev // CHECK-NEXT: br label [[PRECOND:%.*]] 263d04d9220SAlexey Bataev // CHECK: precond: 264d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCNT_ADDR]], align 4 265d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP9:%.*]] = icmp ult i32 [[TMP8]], 2 266d04d9220SAlexey Bataev // CHECK-NEXT: br i1 [[TMP9]], label [[BODY:%.*]], label [[EXIT:%.*]] 267d04d9220SAlexey Bataev // CHECK: body: 268d04d9220SAlexey Bataev // CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP2]]) 269d04d9220SAlexey Bataev // CHECK-NEXT: [[WARP_MASTER:%.*]] = icmp eq i32 [[NVPTX_LANE_ID]], 0 270d04d9220SAlexey Bataev // CHECK-NEXT: br i1 [[WARP_MASTER]], label [[THEN:%.*]], label [[ELSE:%.*]] 271d04d9220SAlexey Bataev // CHECK: then: 272d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP7]], i64 0, i64 0 273d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP11:%.*]] = load i8*, i8** [[TMP10]], align 8 274d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP12:%.*]] = bitcast i8* [[TMP11]] to i32* 275d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP13:%.*]] = getelementptr i32, i32* [[TMP12]], i32 [[TMP8]] 276d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace(3)* @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[NVPTX_WARP_ID]] 277d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP15:%.*]] = load i32, i32* [[TMP13]], align 4 278d04d9220SAlexey Bataev // CHECK-NEXT: store volatile i32 [[TMP15]], i32 addrspace(3)* [[TMP14]], align 4 279d04d9220SAlexey Bataev // CHECK-NEXT: br label [[IFCONT:%.*]] 280d04d9220SAlexey Bataev // CHECK: else: 281d04d9220SAlexey Bataev // CHECK-NEXT: br label [[IFCONT]] 282d04d9220SAlexey Bataev // CHECK: ifcont: 283d04d9220SAlexey Bataev // CHECK-NEXT: call void @__kmpc_barrier(%struct.ident_t* @[[GLOB3]], i32 [[TMP2]]) 284d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTADDR1]], align 4 285d04d9220SAlexey Bataev // CHECK-NEXT: [[IS_ACTIVE_THREAD:%.*]] = icmp ult i32 [[TMP3]], [[TMP16]] 286d04d9220SAlexey Bataev // CHECK-NEXT: br i1 [[IS_ACTIVE_THREAD]], label [[THEN2:%.*]], label [[ELSE3:%.*]] 287d04d9220SAlexey Bataev // CHECK: then2: 288d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds [32 x i32], [32 x i32] addrspace(3)* @__openmp_nvptx_data_transfer_temporary_storage, i64 0, i32 [[TMP3]] 289d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP7]], i64 0, i64 0 290d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP19:%.*]] = load i8*, i8** [[TMP18]], align 8 291d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP20:%.*]] = bitcast i8* [[TMP19]] to i32* 292d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP21:%.*]] = getelementptr i32, i32* [[TMP20]], i32 [[TMP8]] 293d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP22:%.*]] = load volatile i32, i32 addrspace(3)* [[TMP17]], align 4 294d04d9220SAlexey Bataev // CHECK-NEXT: store i32 [[TMP22]], i32* [[TMP21]], align 4 295d04d9220SAlexey Bataev // CHECK-NEXT: br label [[IFCONT4:%.*]] 296d04d9220SAlexey Bataev // CHECK: else3: 297d04d9220SAlexey Bataev // CHECK-NEXT: br label [[IFCONT4]] 298d04d9220SAlexey Bataev // CHECK: ifcont4: 299d04d9220SAlexey Bataev // CHECK-NEXT: [[TMP23:%.*]] = add nsw i32 [[TMP8]], 1 300d04d9220SAlexey Bataev // CHECK-NEXT: store i32 [[TMP23]], i32* [[DOTCNT_ADDR]], align 4 301d04d9220SAlexey Bataev // CHECK-NEXT: br label [[PRECOND]] 302d04d9220SAlexey Bataev // CHECK: exit: 303d04d9220SAlexey Bataev // CHECK-NEXT: ret void 304d04d9220SAlexey Bataev // 305d04d9220SAlexey Bataev // 306d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@_Z3barv 307d04d9220SAlexey Bataev // CHECK1-SAME: () #[[ATTR0:[0-9]+]] { 308d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 309d04d9220SAlexey Bataev // CHECK1-NEXT: [[O:%.*]] = alloca [5 x %class.S2], align 4 310d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [1 x i8*], align 8 311d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [1 x i8*], align 8 312d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [1 x i8*], align 8 313d04d9220SAlexey Bataev // CHECK1-NEXT: [[B:%.*]] = alloca [10 x [10 x [10 x double]]], align 8 314d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOFFLOAD_BASEPTRS1:%.*]] = alloca [1 x i8*], align 8 315d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOFFLOAD_PTRS2:%.*]] = alloca [1 x i8*], align 8 316d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOFFLOAD_MAPPERS3:%.*]] = alloca [1 x i8*], align 8 317d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [5 x %class.S2], [5 x %class.S2]* [[O]], i32 0, i32 0 318d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYCTOR_END:%.*]] = getelementptr inbounds [[CLASS_S2:%.*]], %class.S2* [[ARRAY_BEGIN]], i64 5 319d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[ARRAYCTOR_LOOP:%.*]] 320d04d9220SAlexey Bataev // CHECK1: arrayctor.loop: 321d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYCTOR_CUR:%.*]] = phi %class.S2* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[ARRAYCTOR_NEXT:%.*]], [[ARRAYCTOR_LOOP]] ] 322d04d9220SAlexey Bataev // CHECK1-NEXT: call void @_ZN2S2C1Ev(%class.S2* noundef nonnull align 4 dereferenceable(4) [[ARRAYCTOR_CUR]]) 323d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYCTOR_NEXT]] = getelementptr inbounds [[CLASS_S2]], %class.S2* [[ARRAYCTOR_CUR]], i64 1 324d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYCTOR_DONE:%.*]] = icmp eq %class.S2* [[ARRAYCTOR_NEXT]], [[ARRAYCTOR_END]] 325d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[ARRAYCTOR_DONE]], label [[ARRAYCTOR_CONT:%.*]], label [[ARRAYCTOR_LOOP]] 326d04d9220SAlexey Bataev // CHECK1: arrayctor.cont: 327d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [5 x %class.S2], [5 x %class.S2]* [[O]], i64 0, i64 0 328d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP0:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0 329d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP1:%.*]] = bitcast i8** [[TMP0]] to [5 x %class.S2]** 330d04d9220SAlexey Bataev // CHECK1-NEXT: store [5 x %class.S2]* [[O]], [5 x %class.S2]** [[TMP1]], align 8 331d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP2:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0 332d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8** [[TMP2]] to %class.S2** 333d04d9220SAlexey Bataev // CHECK1-NEXT: store %class.S2* [[ARRAYIDX]], %class.S2** [[TMP3]], align 8 334d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP4:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS]], i64 0, i64 0 335d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* null, i8** [[TMP4]], align 8 336d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP5:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0 337d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0 338*1fff1166SJoseph Huber // CHECK1-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8 339*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP7:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0 340*1fff1166SJoseph Huber // CHECK1-NEXT: store i32 1, i32* [[TMP7]], align 4 341*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP8:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1 342*1fff1166SJoseph Huber // CHECK1-NEXT: store i32 1, i32* [[TMP8]], align 4 343*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2 344*1fff1166SJoseph Huber // CHECK1-NEXT: store i8** [[TMP5]], i8*** [[TMP9]], align 8 345*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3 346*1fff1166SJoseph Huber // CHECK1-NEXT: store i8** [[TMP6]], i8*** [[TMP10]], align 8 347*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4 348*1fff1166SJoseph Huber // CHECK1-NEXT: store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes, i32 0, i32 0), i64** [[TMP11]], align 8 349*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5 350*1fff1166SJoseph Huber // CHECK1-NEXT: store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP12]], align 8 351*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP13:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6 352*1fff1166SJoseph Huber // CHECK1-NEXT: store i8** null, i8*** [[TMP13]], align 8 353*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP14:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7 354*1fff1166SJoseph Huber // CHECK1-NEXT: store i8** null, i8*** [[TMP14]], align 8 355*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP15:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB2:[0-9]+]], i64 -1, i32 1, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3barv_l50.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]]) 356*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP16:%.*]] = icmp ne i32 [[TMP15]], 0 357*1fff1166SJoseph Huber // CHECK1-NEXT: br i1 [[TMP16]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]] 358d04d9220SAlexey Bataev // CHECK1: omp_offload.failed: 359d04d9220SAlexey Bataev // CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3barv_l50([5 x %class.S2]* [[O]]) #[[ATTR8:[0-9]+]] 360d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[OMP_OFFLOAD_CONT]] 361d04d9220SAlexey Bataev // CHECK1: omp_offload.cont: 362*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP17:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0 363*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP18:%.*]] = bitcast i8** [[TMP17]] to [10 x [10 x [10 x double]]]** 364*1fff1166SJoseph Huber // CHECK1-NEXT: store [10 x [10 x [10 x double]]]* [[B]], [10 x [10 x [10 x double]]]** [[TMP18]], align 8 365*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP19:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0 366*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP20:%.*]] = bitcast i8** [[TMP19]] to [10 x [10 x [10 x double]]]** 367*1fff1166SJoseph Huber // CHECK1-NEXT: store [10 x [10 x [10 x double]]]* [[B]], [10 x [10 x [10 x double]]]** [[TMP20]], align 8 368*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP21:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_MAPPERS3]], i64 0, i64 0 369*1fff1166SJoseph Huber // CHECK1-NEXT: store i8* null, i8** [[TMP21]], align 8 370*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP22:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_BASEPTRS1]], i32 0, i32 0 371*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP23:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOFFLOAD_PTRS2]], i32 0, i32 0 372*1fff1166SJoseph Huber // CHECK1-NEXT: [[KERNEL_ARGS4:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8 373*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP24:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS4]], i32 0, i32 0 374*1fff1166SJoseph Huber // CHECK1-NEXT: store i32 1, i32* [[TMP24]], align 4 375*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP25:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS4]], i32 0, i32 1 376*1fff1166SJoseph Huber // CHECK1-NEXT: store i32 1, i32* [[TMP25]], align 4 377*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS4]], i32 0, i32 2 378*1fff1166SJoseph Huber // CHECK1-NEXT: store i8** [[TMP22]], i8*** [[TMP26]], align 8 379*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP27:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS4]], i32 0, i32 3 380*1fff1166SJoseph Huber // CHECK1-NEXT: store i8** [[TMP23]], i8*** [[TMP27]], align 8 381*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP28:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS4]], i32 0, i32 4 382*1fff1166SJoseph Huber // CHECK1-NEXT: store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_sizes.3, i32 0, i32 0), i64** [[TMP28]], align 8 383*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP29:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS4]], i32 0, i32 5 384*1fff1166SJoseph Huber // CHECK1-NEXT: store i64* getelementptr inbounds ([1 x i64], [1 x i64]* @.offload_maptypes.4, i32 0, i32 0), i64** [[TMP29]], align 8 385*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP30:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS4]], i32 0, i32 6 386*1fff1166SJoseph Huber // CHECK1-NEXT: store i8** null, i8*** [[TMP30]], align 8 387*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP31:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS4]], i32 0, i32 7 388*1fff1166SJoseph Huber // CHECK1-NEXT: store i8** null, i8*** [[TMP31]], align 8 389*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP32:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB2]], i64 -1, i32 1, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3barv_l55.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS4]]) 390*1fff1166SJoseph Huber // CHECK1-NEXT: [[TMP33:%.*]] = icmp ne i32 [[TMP32]], 0 391*1fff1166SJoseph Huber // CHECK1-NEXT: br i1 [[TMP33]], label [[OMP_OFFLOAD_FAILED5:%.*]], label [[OMP_OFFLOAD_CONT6:%.*]] 392*1fff1166SJoseph Huber // CHECK1: omp_offload.failed5: 393d04d9220SAlexey Bataev // CHECK1-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3barv_l55([10 x [10 x [10 x double]]]* [[B]]) #[[ATTR8]] 394*1fff1166SJoseph Huber // CHECK1-NEXT: br label [[OMP_OFFLOAD_CONT6]] 395*1fff1166SJoseph Huber // CHECK1: omp_offload.cont6: 396d04d9220SAlexey Bataev // CHECK1-NEXT: ret i32 0 397d04d9220SAlexey Bataev // 398d04d9220SAlexey Bataev // 399d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@_ZN2S2C1Ev 400d04d9220SAlexey Bataev // CHECK1-SAME: (%class.S2* noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1:[0-9]+]] comdat align 2 { 401d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 402d04d9220SAlexey Bataev // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %class.S2*, align 8 403d04d9220SAlexey Bataev // CHECK1-NEXT: store %class.S2* [[THIS]], %class.S2** [[THIS_ADDR]], align 8 404d04d9220SAlexey Bataev // CHECK1-NEXT: [[THIS1:%.*]] = load %class.S2*, %class.S2** [[THIS_ADDR]], align 8 405d04d9220SAlexey Bataev // CHECK1-NEXT: call void @_ZN2S2C2Ev(%class.S2* noundef nonnull align 4 dereferenceable(4) [[THIS1]]) 406d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 407d04d9220SAlexey Bataev // 408d04d9220SAlexey Bataev // 409d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3barv_l50 410d04d9220SAlexey Bataev // CHECK1-SAME: ([5 x %class.S2]* noundef nonnull align 4 dereferenceable(20) [[O:%.*]]) #[[ATTR2:[0-9]+]] { 411d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 412d04d9220SAlexey Bataev // CHECK1-NEXT: [[O_ADDR:%.*]] = alloca [5 x %class.S2]*, align 8 413d04d9220SAlexey Bataev // CHECK1-NEXT: store [5 x %class.S2]* [[O]], [5 x %class.S2]** [[O_ADDR]], align 8 414d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP0:%.*]] = load [5 x %class.S2]*, [5 x %class.S2]** [[O_ADDR]], align 8 415d04d9220SAlexey Bataev // CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [5 x %class.S2]*)* @.omp_outlined. to void (i32*, i32*, ...)*), [5 x %class.S2]* [[TMP0]]) 416d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 417d04d9220SAlexey Bataev // 418d04d9220SAlexey Bataev // 419d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined. 420d04d9220SAlexey Bataev // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [5 x %class.S2]* noundef nonnull align 4 dereferenceable(20) [[O:%.*]]) #[[ATTR3:[0-9]+]] { 421d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 422d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 423d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 424d04d9220SAlexey Bataev // CHECK1-NEXT: [[O_ADDR:%.*]] = alloca [5 x %class.S2]*, align 8 425d04d9220SAlexey Bataev // CHECK1-NEXT: [[O1:%.*]] = alloca [[CLASS_S2:%.*]], align 4 426d04d9220SAlexey Bataev // CHECK1-NEXT: [[I:%.*]] = alloca i32, align 4 427d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 8 428d04d9220SAlexey Bataev // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 429d04d9220SAlexey Bataev // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 430d04d9220SAlexey Bataev // CHECK1-NEXT: store [5 x %class.S2]* [[O]], [5 x %class.S2]** [[O_ADDR]], align 8 431d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP0:%.*]] = load [5 x %class.S2]*, [5 x %class.S2]** [[O_ADDR]], align 8 432d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [5 x %class.S2], [5 x %class.S2]* [[TMP0]], i64 0, i64 0 433d04d9220SAlexey Bataev // CHECK1-NEXT: call void @_ZN2S2C1Ev(%class.S2* noundef nonnull align 4 dereferenceable(4) [[O1]]) 434d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP1:%.*]] = bitcast [5 x %class.S2]* [[TMP0]] to %class.S2* 435d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP2:%.*]] = ptrtoint %class.S2* [[TMP1]] to i64 436d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP3:%.*]] = ptrtoint %class.S2* [[ARRAYIDX]] to i64 437d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP4:%.*]] = sub i64 [[TMP2]], [[TMP3]] 438d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP5:%.*]] = sdiv exact i64 [[TMP4]], ptrtoint (%class.S2* getelementptr ([[CLASS_S2]], %class.S2* null, i32 1) to i64) 439d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr [[CLASS_S2]], %class.S2* [[O1]], i64 [[TMP5]] 440d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP7:%.*]] = bitcast %class.S2* [[TMP6]] to [5 x %class.S2]* 441d04d9220SAlexey Bataev // CHECK1-NEXT: store i32 0, i32* [[I]], align 4 442d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[FOR_COND:%.*]] 443d04d9220SAlexey Bataev // CHECK1: for.cond: 444d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP8:%.*]] = load i32, i32* [[I]], align 4 445d04d9220SAlexey Bataev // CHECK1-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP8]], 10 446d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 447d04d9220SAlexey Bataev // CHECK1: for.body: 448d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[FOR_INC:%.*]] 449d04d9220SAlexey Bataev // CHECK1: for.inc: 450d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP9:%.*]] = load i32, i32* [[I]], align 4 451d04d9220SAlexey Bataev // CHECK1-NEXT: [[INC:%.*]] = add nsw i32 [[TMP9]], 1 452d04d9220SAlexey Bataev // CHECK1-NEXT: store i32 [[INC]], i32* [[I]], align 4 453d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP5:![0-9]+]] 454d04d9220SAlexey Bataev // CHECK1: for.end: 455d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP10:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0 456d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP11:%.*]] = bitcast %class.S2* [[O1]] to i8* 457d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP11]], i8** [[TMP10]], align 8 458d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP12:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 459d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP12]], align 4 460d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP14:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8* 461d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP15:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP13]], i32 1, i64 8, i8* [[TMP14]], void (i8*, i8*)* @.omp.reduction.reduction_func, [8 x i32]* @.gomp_critical_user_.reduction.var) 462d04d9220SAlexey Bataev // CHECK1-NEXT: switch i32 [[TMP15]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 463d04d9220SAlexey Bataev // CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 464d04d9220SAlexey Bataev // CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 465d04d9220SAlexey Bataev // CHECK1-NEXT: ] 466d04d9220SAlexey Bataev // CHECK1: .omp.reduction.case1: 467d04d9220SAlexey Bataev // CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) %class.S2* @_ZN2S2plERS_(%class.S2* noundef nonnull align 4 dereferenceable(4) [[ARRAYIDX]], %class.S2* noundef nonnull align 4 dereferenceable(4) [[O1]]) 468d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP16:%.*]] = bitcast %class.S2* [[ARRAYIDX]] to i8* 469d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP17:%.*]] = bitcast %class.S2* [[CALL]] to i8* 470d04d9220SAlexey Bataev // CHECK1-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[TMP16]], i8* align 4 [[TMP17]], i64 4, i1 false) 471d04d9220SAlexey Bataev // CHECK1-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB1]], i32 [[TMP13]], [8 x i32]* @.gomp_critical_user_.reduction.var) 472d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 473d04d9220SAlexey Bataev // CHECK1: .omp.reduction.case2: 474d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP18:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 475d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP19:%.*]] = load i32, i32* [[TMP18]], align 4 476d04d9220SAlexey Bataev // CHECK1-NEXT: call void @__kmpc_critical(%struct.ident_t* @[[GLOB2]], i32 [[TMP19]], [8 x i32]* @.gomp_critical_user_.atomic_reduction.var) 477d04d9220SAlexey Bataev // CHECK1-NEXT: [[CALL2:%.*]] = call noundef nonnull align 4 dereferenceable(4) %class.S2* @_ZN2S2plERS_(%class.S2* noundef nonnull align 4 dereferenceable(4) [[ARRAYIDX]], %class.S2* noundef nonnull align 4 dereferenceable(4) [[O1]]) 478d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP20:%.*]] = bitcast %class.S2* [[ARRAYIDX]] to i8* 479d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP21:%.*]] = bitcast %class.S2* [[CALL2]] to i8* 480d04d9220SAlexey Bataev // CHECK1-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[TMP20]], i8* align 4 [[TMP21]], i64 4, i1 false) 481d04d9220SAlexey Bataev // CHECK1-NEXT: call void @__kmpc_end_critical(%struct.ident_t* @[[GLOB2]], i32 [[TMP19]], [8 x i32]* @.gomp_critical_user_.atomic_reduction.var) 482d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 483d04d9220SAlexey Bataev // CHECK1: .omp.reduction.default: 484d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 485d04d9220SAlexey Bataev // 486d04d9220SAlexey Bataev // 487d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func 488d04d9220SAlexey Bataev // CHECK1-SAME: (i8* noundef [[TMP0:%.*]], i8* noundef [[TMP1:%.*]]) #[[ATTR4:[0-9]+]] { 489d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 490d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 491d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 492d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 493d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 494d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 495d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]* 496d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 497d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]* 498d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i64 0, i64 0 499d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8 500d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to %class.S2* 501d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i64 0, i64 0 502d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 8 503d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to %class.S2* 504d04d9220SAlexey Bataev // CHECK1-NEXT: [[CALL:%.*]] = call noundef nonnull align 4 dereferenceable(4) %class.S2* @_ZN2S2plERS_(%class.S2* noundef nonnull align 4 dereferenceable(4) [[TMP11]], %class.S2* noundef nonnull align 4 dereferenceable(4) [[TMP8]]) 505d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP12:%.*]] = bitcast %class.S2* [[TMP11]] to i8* 506d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP13:%.*]] = bitcast %class.S2* [[CALL]] to i8* 507d04d9220SAlexey Bataev // CHECK1-NEXT: call void @llvm.memcpy.p0i8.p0i8.i64(i8* align 4 [[TMP12]], i8* align 4 [[TMP13]], i64 4, i1 false) 508d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 509d04d9220SAlexey Bataev // 510d04d9220SAlexey Bataev // 511d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3barv_l55 512d04d9220SAlexey Bataev // CHECK1-SAME: ([10 x [10 x [10 x double]]]* noundef nonnull align 8 dereferenceable(8000) [[B:%.*]]) #[[ATTR2]] { 513d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 514d04d9220SAlexey Bataev // CHECK1-NEXT: [[B_ADDR:%.*]] = alloca [10 x [10 x [10 x double]]]*, align 8 515d04d9220SAlexey Bataev // CHECK1-NEXT: store [10 x [10 x [10 x double]]]* [[B]], [10 x [10 x [10 x double]]]** [[B_ADDR]], align 8 516d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP0:%.*]] = load [10 x [10 x [10 x double]]]*, [10 x [10 x [10 x double]]]** [[B_ADDR]], align 8 517d04d9220SAlexey Bataev // CHECK1-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB2]], i32 1, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, [10 x [10 x [10 x double]]]*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), [10 x [10 x [10 x double]]]* [[TMP0]]) 518d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 519d04d9220SAlexey Bataev // 520d04d9220SAlexey Bataev // 521d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@.omp_outlined..1 522d04d9220SAlexey Bataev // CHECK1-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], [10 x [10 x [10 x double]]]* noundef nonnull align 8 dereferenceable(8000) [[B:%.*]]) #[[ATTR3]] { 523d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 524d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 8 525d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 8 526d04d9220SAlexey Bataev // CHECK1-NEXT: [[B_ADDR:%.*]] = alloca [10 x [10 x [10 x double]]]*, align 8 527d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOMP_IV:%.*]] = alloca i64, align 8 528d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP:%.*]] = alloca i64, align 8 529d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOMP_LB:%.*]] = alloca i64, align 8 530d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOMP_UB:%.*]] = alloca i64, align 8 531d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i64, align 8 532d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 533d04d9220SAlexey Bataev // CHECK1-NEXT: [[SAVED_STACK:%.*]] = alloca i8*, align 8 534d04d9220SAlexey Bataev // CHECK1-NEXT: [[__VLA_EXPR0:%.*]] = alloca i64, align 8 535d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTRD_INPUT_:%.*]] = alloca [1 x %struct.kmp_taskred_input_t], align 8 536d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTTASK_RED_:%.*]] = alloca i8*, align 8 537d04d9220SAlexey Bataev // CHECK1-NEXT: [[I:%.*]] = alloca i64, align 8 538d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [2 x i8*], align 8 539d04d9220SAlexey Bataev // CHECK1-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 8 540d04d9220SAlexey Bataev // CHECK1-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 8 541d04d9220SAlexey Bataev // CHECK1-NEXT: store [10 x [10 x [10 x double]]]* [[B]], [10 x [10 x [10 x double]]]** [[B_ADDR]], align 8 542d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP0:%.*]] = load [10 x [10 x [10 x double]]]*, [10 x [10 x [10 x double]]]** [[B_ADDR]], align 8 543d04d9220SAlexey Bataev // CHECK1-NEXT: store i64 0, i64* [[DOTOMP_LB]], align 8 544d04d9220SAlexey Bataev // CHECK1-NEXT: store i64 9, i64* [[DOTOMP_UB]], align 8 545d04d9220SAlexey Bataev // CHECK1-NEXT: store i64 1, i64* [[DOTOMP_STRIDE]], align 8 546d04d9220SAlexey Bataev // CHECK1-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 547d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x [10 x [10 x double]]], [10 x [10 x [10 x double]]]* [[TMP0]], i64 0, i64 0 548d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYDECAY:%.*]] = getelementptr inbounds [10 x [10 x double]], [10 x [10 x double]]* [[ARRAYIDX]], i64 0, i64 0 549d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [10 x double], [10 x double]* [[ARRAYDECAY]], i64 2 550d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYDECAY2:%.*]] = getelementptr inbounds [10 x double], [10 x double]* [[ARRAYIDX1]], i64 0, i64 0 551d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds double, double* [[ARRAYDECAY2]], i64 1 552d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX4:%.*]] = getelementptr inbounds [10 x [10 x [10 x double]]], [10 x [10 x [10 x double]]]* [[TMP0]], i64 0, i64 1 553d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYDECAY5:%.*]] = getelementptr inbounds [10 x [10 x double]], [10 x [10 x double]]* [[ARRAYIDX4]], i64 0, i64 0 554d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds [10 x double], [10 x double]* [[ARRAYDECAY5]], i64 5 555d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYDECAY7:%.*]] = getelementptr inbounds [10 x double], [10 x double]* [[ARRAYIDX6]], i64 0, i64 0 556d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds double, double* [[ARRAYDECAY7]], i64 1 557d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP1:%.*]] = ptrtoint double* [[ARRAYIDX8]] to i64 558d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP2:%.*]] = ptrtoint double* [[ARRAYIDX3]] to i64 559d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP3:%.*]] = sub i64 [[TMP1]], [[TMP2]] 560d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP4:%.*]] = sdiv exact i64 [[TMP3]], ptrtoint (double* getelementptr (double, double* null, i32 1) to i64) 561d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP5:%.*]] = add nuw i64 [[TMP4]], 1 562d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP6:%.*]] = mul nuw i64 [[TMP5]], ptrtoint (double* getelementptr (double, double* null, i32 1) to i64) 563d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP7:%.*]] = call i8* @llvm.stacksave() 564d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP7]], i8** [[SAVED_STACK]], align 8 565d04d9220SAlexey Bataev // CHECK1-NEXT: [[VLA:%.*]] = alloca double, i64 [[TMP5]], align 8 566d04d9220SAlexey Bataev // CHECK1-NEXT: store i64 [[TMP5]], i64* [[__VLA_EXPR0]], align 8 567d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP8:%.*]] = getelementptr double, double* [[VLA]], i64 [[TMP5]] 568d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq double* [[VLA]], [[TMP8]] 569d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]] 570d04d9220SAlexey Bataev // CHECK1: omp.arrayinit.body: 571d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi double* [ [[VLA]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ] 572d04d9220SAlexey Bataev // CHECK1-NEXT: store double 0.000000e+00, double* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 8 573d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr double, double* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 574d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq double* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]] 575d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]] 576d04d9220SAlexey Bataev // CHECK1: omp.arrayinit.done: 577d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP9:%.*]] = bitcast [10 x [10 x [10 x double]]]* [[TMP0]] to double* 578d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP10:%.*]] = ptrtoint double* [[TMP9]] to i64 579d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP11:%.*]] = ptrtoint double* [[ARRAYIDX3]] to i64 580d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP12:%.*]] = sub i64 [[TMP10]], [[TMP11]] 581d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP13:%.*]] = sdiv exact i64 [[TMP12]], ptrtoint (double* getelementptr (double, double* null, i32 1) to i64) 582d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP14:%.*]] = getelementptr double, double* [[VLA]], i64 [[TMP13]] 583d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP15:%.*]] = bitcast double* [[TMP14]] to [10 x [10 x [10 x double]]]* 584d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTRD_INPUT_GEP_:%.*]] = getelementptr inbounds [1 x %struct.kmp_taskred_input_t], [1 x %struct.kmp_taskred_input_t]* [[DOTRD_INPUT_]], i64 0, i64 0 585d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP16:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T:%.*]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 0 586d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds [10 x [10 x [10 x double]]], [10 x [10 x [10 x double]]]* [[TMP0]], i64 0, i64 0 587d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYDECAY10:%.*]] = getelementptr inbounds [10 x [10 x double]], [10 x [10 x double]]* [[ARRAYIDX9]], i64 0, i64 0 588d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX11:%.*]] = getelementptr inbounds [10 x double], [10 x double]* [[ARRAYDECAY10]], i64 2 589d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYDECAY12:%.*]] = getelementptr inbounds [10 x double], [10 x double]* [[ARRAYIDX11]], i64 0, i64 0 590d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX13:%.*]] = getelementptr inbounds double, double* [[ARRAYDECAY12]], i64 1 591d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX14:%.*]] = getelementptr inbounds [10 x [10 x [10 x double]]], [10 x [10 x [10 x double]]]* [[TMP0]], i64 0, i64 1 592d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYDECAY15:%.*]] = getelementptr inbounds [10 x [10 x double]], [10 x [10 x double]]* [[ARRAYIDX14]], i64 0, i64 0 593d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX16:%.*]] = getelementptr inbounds [10 x double], [10 x double]* [[ARRAYDECAY15]], i64 5 594d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYDECAY17:%.*]] = getelementptr inbounds [10 x double], [10 x double]* [[ARRAYIDX16]], i64 0, i64 0 595d04d9220SAlexey Bataev // CHECK1-NEXT: [[ARRAYIDX18:%.*]] = getelementptr inbounds double, double* [[ARRAYDECAY17]], i64 1 596d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP17:%.*]] = bitcast double* [[VLA]] to i8* 597d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP17]], i8** [[TMP16]], align 8 598d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP18:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 1 599d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP19:%.*]] = bitcast double* [[ARRAYIDX13]] to i8* 600d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP19]], i8** [[TMP18]], align 8 601d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP20:%.*]] = ptrtoint double* [[ARRAYIDX18]] to i64 602d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP21:%.*]] = ptrtoint double* [[ARRAYIDX13]] to i64 603d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP22:%.*]] = sub i64 [[TMP20]], [[TMP21]] 604d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP23:%.*]] = sdiv exact i64 [[TMP22]], ptrtoint (double* getelementptr (double, double* null, i32 1) to i64) 605d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP24:%.*]] = add nuw i64 [[TMP23]], 1 606d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP25:%.*]] = mul nuw i64 [[TMP24]], ptrtoint (double* getelementptr (double, double* null, i32 1) to i64) 607d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP26:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 2 608d04d9220SAlexey Bataev // CHECK1-NEXT: store i64 [[TMP25]], i64* [[TMP26]], align 8 609d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP27:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 3 610d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_init. to i8*), i8** [[TMP27]], align 8 611d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP28:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 4 612d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* null, i8** [[TMP28]], align 8 613d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP29:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 5 614d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* bitcast (void (i8*, i8*)* @.red_comb. to i8*), i8** [[TMP29]], align 8 615d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP30:%.*]] = getelementptr inbounds [[STRUCT_KMP_TASKRED_INPUT_T]], %struct.kmp_taskred_input_t* [[DOTRD_INPUT_GEP_]], i32 0, i32 6 616d04d9220SAlexey Bataev // CHECK1-NEXT: store i32 1, i32* [[TMP30]], align 8 617d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP31:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 618d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP32:%.*]] = load i32, i32* [[TMP31]], align 4 619d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP33:%.*]] = bitcast [1 x %struct.kmp_taskred_input_t]* [[DOTRD_INPUT_]] to i8* 620d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP34:%.*]] = call i8* @__kmpc_taskred_modifier_init(%struct.ident_t* @[[GLOB2]], i32 [[TMP32]], i32 1, i32 1, i8* [[TMP33]]) 621d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP34]], i8** [[DOTTASK_RED_]], align 8 622d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP35:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 623d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4 624d04d9220SAlexey Bataev // CHECK1-NEXT: call void @__kmpc_for_static_init_8(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP36]], i32 34, i32* [[DOTOMP_IS_LAST]], i64* [[DOTOMP_LB]], i64* [[DOTOMP_UB]], i64* [[DOTOMP_STRIDE]], i64 1, i64 1) 625d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP37:%.*]] = load i64, i64* [[DOTOMP_UB]], align 8 626d04d9220SAlexey Bataev // CHECK1-NEXT: [[CMP:%.*]] = icmp sgt i64 [[TMP37]], 9 627d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[CMP]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 628d04d9220SAlexey Bataev // CHECK1: cond.true: 629d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[COND_END:%.*]] 630d04d9220SAlexey Bataev // CHECK1: cond.false: 631d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP38:%.*]] = load i64, i64* [[DOTOMP_UB]], align 8 632d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[COND_END]] 633d04d9220SAlexey Bataev // CHECK1: cond.end: 634d04d9220SAlexey Bataev // CHECK1-NEXT: [[COND:%.*]] = phi i64 [ 9, [[COND_TRUE]] ], [ [[TMP38]], [[COND_FALSE]] ] 635d04d9220SAlexey Bataev // CHECK1-NEXT: store i64 [[COND]], i64* [[DOTOMP_UB]], align 8 636d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP39:%.*]] = load i64, i64* [[DOTOMP_LB]], align 8 637d04d9220SAlexey Bataev // CHECK1-NEXT: store i64 [[TMP39]], i64* [[DOTOMP_IV]], align 8 638d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 639d04d9220SAlexey Bataev // CHECK1: omp.inner.for.cond: 640d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP40:%.*]] = load i64, i64* [[DOTOMP_IV]], align 8 641d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP41:%.*]] = load i64, i64* [[DOTOMP_UB]], align 8 642d04d9220SAlexey Bataev // CHECK1-NEXT: [[CMP19:%.*]] = icmp sle i64 [[TMP40]], [[TMP41]] 643d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[CMP19]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_COND_CLEANUP:%.*]] 644d04d9220SAlexey Bataev // CHECK1: omp.inner.for.cond.cleanup: 645d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[OMP_INNER_FOR_END:%.*]] 646d04d9220SAlexey Bataev // CHECK1: omp.inner.for.body: 647d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP42:%.*]] = load i64, i64* [[DOTOMP_IV]], align 8 648d04d9220SAlexey Bataev // CHECK1-NEXT: [[MUL:%.*]] = mul nsw i64 [[TMP42]], 1 649d04d9220SAlexey Bataev // CHECK1-NEXT: [[ADD:%.*]] = add nsw i64 0, [[MUL]] 650d04d9220SAlexey Bataev // CHECK1-NEXT: store i64 [[ADD]], i64* [[I]], align 8 651d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 652d04d9220SAlexey Bataev // CHECK1: omp.body.continue: 653d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 654d04d9220SAlexey Bataev // CHECK1: omp.inner.for.inc: 655d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP43:%.*]] = load i64, i64* [[DOTOMP_IV]], align 8 656d04d9220SAlexey Bataev // CHECK1-NEXT: [[ADD20:%.*]] = add nsw i64 [[TMP43]], 1 657d04d9220SAlexey Bataev // CHECK1-NEXT: store i64 [[ADD20]], i64* [[DOTOMP_IV]], align 8 658d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[OMP_INNER_FOR_COND]] 659d04d9220SAlexey Bataev // CHECK1: omp.inner.for.end: 660d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 661d04d9220SAlexey Bataev // CHECK1: omp.loop.exit: 662d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP44:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 663d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP45:%.*]] = load i32, i32* [[TMP44]], align 4 664d04d9220SAlexey Bataev // CHECK1-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB3]], i32 [[TMP45]]) 665d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP46:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 666d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP47:%.*]] = load i32, i32* [[TMP46]], align 4 667d04d9220SAlexey Bataev // CHECK1-NEXT: call void @__kmpc_task_reduction_modifier_fini(%struct.ident_t* @[[GLOB2]], i32 [[TMP47]], i32 1) 668d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP48:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 0 669d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP49:%.*]] = bitcast double* [[VLA]] to i8* 670d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP49]], i8** [[TMP48]], align 8 671d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP50:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i64 0, i64 1 672d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP51:%.*]] = inttoptr i64 [[TMP5]] to i8* 673d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP51]], i8** [[TMP50]], align 8 674d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP52:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 8 675d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP53:%.*]] = load i32, i32* [[TMP52]], align 4 676d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP54:%.*]] = bitcast [2 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8* 677d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP55:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB1]], i32 [[TMP53]], i32 1, i64 16, i8* [[TMP54]], void (i8*, i8*)* @.omp.reduction.reduction_func.2, [8 x i32]* @.gomp_critical_user_.reduction.var) 678d04d9220SAlexey Bataev // CHECK1-NEXT: switch i32 [[TMP55]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 679d04d9220SAlexey Bataev // CHECK1-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 680d04d9220SAlexey Bataev // CHECK1-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 681d04d9220SAlexey Bataev // CHECK1-NEXT: ] 682d04d9220SAlexey Bataev // CHECK1: .omp.reduction.case1: 683d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP56:%.*]] = getelementptr double, double* [[ARRAYIDX3]], i64 [[TMP5]] 684d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq double* [[ARRAYIDX3]], [[TMP56]] 685d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE25:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 686d04d9220SAlexey Bataev // CHECK1: omp.arraycpy.body: 687d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi double* [ [[VLA]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 688d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST21:%.*]] = phi double* [ [[ARRAYIDX3]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT23:%.*]], [[OMP_ARRAYCPY_BODY]] ] 689d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP57:%.*]] = load double, double* [[OMP_ARRAYCPY_DESTELEMENTPAST21]], align 8 690d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP58:%.*]] = load double, double* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 8 691d04d9220SAlexey Bataev // CHECK1-NEXT: [[ADD22:%.*]] = fadd double [[TMP57]], [[TMP58]] 692d04d9220SAlexey Bataev // CHECK1-NEXT: store double [[ADD22]], double* [[OMP_ARRAYCPY_DESTELEMENTPAST21]], align 8 693d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT23]] = getelementptr double, double* [[OMP_ARRAYCPY_DESTELEMENTPAST21]], i32 1 694d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr double, double* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 695d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE24:%.*]] = icmp eq double* [[OMP_ARRAYCPY_DEST_ELEMENT23]], [[TMP56]] 696d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE24]], label [[OMP_ARRAYCPY_DONE25]], label [[OMP_ARRAYCPY_BODY]] 697d04d9220SAlexey Bataev // CHECK1: omp.arraycpy.done25: 698d04d9220SAlexey Bataev // CHECK1-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB1]], i32 [[TMP53]], [8 x i32]* @.gomp_critical_user_.reduction.var) 699d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 700d04d9220SAlexey Bataev // CHECK1: .omp.reduction.case2: 701d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP59:%.*]] = getelementptr double, double* [[ARRAYIDX3]], i64 [[TMP5]] 702d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY26:%.*]] = icmp eq double* [[ARRAYIDX3]], [[TMP59]] 7039c1085c7SShilei Tian // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY26]], label [[OMP_ARRAYCPY_DONE33:%.*]], label [[OMP_ARRAYCPY_BODY27:%.*]] 704d04d9220SAlexey Bataev // CHECK1: omp.arraycpy.body27: 7059c1085c7SShilei Tian // CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST28:%.*]] = phi double* [ [[VLA]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT31:%.*]], [[OMP_ARRAYCPY_BODY27]] ] 7069c1085c7SShilei Tian // CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST29:%.*]] = phi double* [ [[ARRAYIDX3]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT30:%.*]], [[OMP_ARRAYCPY_BODY27]] ] 707d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP60:%.*]] = load double, double* [[OMP_ARRAYCPY_SRCELEMENTPAST28]], align 8 7089c1085c7SShilei Tian // CHECK1-NEXT: [[TMP61:%.*]] = atomicrmw fadd double* [[OMP_ARRAYCPY_DESTELEMENTPAST29]], double [[TMP60]] monotonic, align 8 7099c1085c7SShilei Tian // CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT30]] = getelementptr double, double* [[OMP_ARRAYCPY_DESTELEMENTPAST29]], i32 1 7109c1085c7SShilei Tian // CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT31]] = getelementptr double, double* [[OMP_ARRAYCPY_SRCELEMENTPAST28]], i32 1 7119c1085c7SShilei Tian // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE32:%.*]] = icmp eq double* [[OMP_ARRAYCPY_DEST_ELEMENT30]], [[TMP59]] 7129c1085c7SShilei Tian // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE32]], label [[OMP_ARRAYCPY_DONE33]], label [[OMP_ARRAYCPY_BODY27]] 7139c1085c7SShilei Tian // CHECK1: omp.arraycpy.done33: 714d04d9220SAlexey Bataev // CHECK1-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 715d04d9220SAlexey Bataev // CHECK1: .omp.reduction.default: 7169c1085c7SShilei Tian // CHECK1-NEXT: [[TMP62:%.*]] = load i8*, i8** [[SAVED_STACK]], align 8 7179c1085c7SShilei Tian // CHECK1-NEXT: call void @llvm.stackrestore(i8* [[TMP62]]) 718d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 719d04d9220SAlexey Bataev // 720d04d9220SAlexey Bataev // 721d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@.red_init. 722d04d9220SAlexey Bataev // CHECK1-SAME: (i8* noalias noundef [[TMP0:%.*]], i8* noalias noundef [[TMP1:%.*]]) #[[ATTR4]] { 723d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 724d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 725d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 726d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 727d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 728b6f85d85SNikita Popov // CHECK1-NEXT: [[TMP2:%.*]] = bitcast i8** [[DOTADDR]] to double** 729b6f85d85SNikita Popov // CHECK1-NEXT: [[TMP3:%.*]] = load double*, double** [[TMP2]], align 8 730b6f85d85SNikita Popov // CHECK1-NEXT: [[TMP4:%.*]] = load i64, i64* @{{reduction_size[.].+[.]}}, align 8 731b6f85d85SNikita Popov // CHECK1-NEXT: [[TMP5:%.*]] = getelementptr double, double* [[TMP3]], i64 [[TMP4]] 732b6f85d85SNikita Popov // CHECK1-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq double* [[TMP3]], [[TMP5]] 733d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]] 734d04d9220SAlexey Bataev // CHECK1: omp.arrayinit.body: 735b6f85d85SNikita Popov // CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi double* [ [[TMP3]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ] 736d04d9220SAlexey Bataev // CHECK1-NEXT: store double 0.000000e+00, double* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 8 737d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr double, double* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 738d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq double* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP5]] 739d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]] 740d04d9220SAlexey Bataev // CHECK1: omp.arrayinit.done: 741d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 742d04d9220SAlexey Bataev // 743d04d9220SAlexey Bataev // 744d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@.red_comb. 745d04d9220SAlexey Bataev // CHECK1-SAME: (i8* noundef [[TMP0:%.*]], i8* noundef [[TMP1:%.*]]) #[[ATTR4]] { 746d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 747d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 748d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 749d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 750d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 751d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP2:%.*]] = load i64, i64* @{{reduction_size[.].+[.]}}, align 8 75252cc65d4SNikita Popov // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8** [[DOTADDR]] to double** 75352cc65d4SNikita Popov // CHECK1-NEXT: [[TMP4:%.*]] = load double*, double** [[TMP3]], align 8 75452cc65d4SNikita Popov // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8** [[DOTADDR1]] to double** 75552cc65d4SNikita Popov // CHECK1-NEXT: [[TMP6:%.*]] = load double*, double** [[TMP5]], align 8 756d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP7:%.*]] = getelementptr double, double* [[TMP4]], i64 [[TMP2]] 757d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq double* [[TMP4]], [[TMP7]] 758d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 759d04d9220SAlexey Bataev // CHECK1: omp.arraycpy.body: 760d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi double* [ [[TMP6]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 761d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi double* [ [[TMP4]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 762d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP8:%.*]] = load double, double* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 8 763d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP9:%.*]] = load double, double* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 8 764d04d9220SAlexey Bataev // CHECK1-NEXT: [[ADD:%.*]] = fadd double [[TMP8]], [[TMP9]] 765d04d9220SAlexey Bataev // CHECK1-NEXT: store double [[ADD]], double* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 8 766d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr double, double* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 767d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr double, double* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 768d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq double* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP7]] 769d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]] 770d04d9220SAlexey Bataev // CHECK1: omp.arraycpy.done2: 771d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 772d04d9220SAlexey Bataev // 773d04d9220SAlexey Bataev // 774d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.2 775d04d9220SAlexey Bataev // CHECK1-SAME: (i8* noundef [[TMP0:%.*]], i8* noundef [[TMP1:%.*]]) #[[ATTR4]] { 776d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 777d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 8 778d04d9220SAlexey Bataev // CHECK1-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 8 779d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 8 780d04d9220SAlexey Bataev // CHECK1-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 8 781d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 8 782d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [2 x i8*]* 783d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 8 784d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [2 x i8*]* 785d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP6:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[TMP5]], i64 0, i64 0 786d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 8 787d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to double* 788d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP9:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[TMP3]], i64 0, i64 0 789d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 8 790d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to double* 791d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP12:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[TMP3]], i64 0, i64 1 792d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP13:%.*]] = load i8*, i8** [[TMP12]], align 8 793d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP14:%.*]] = ptrtoint i8* [[TMP13]] to i64 794d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP15:%.*]] = getelementptr double, double* [[TMP11]], i64 [[TMP14]] 795d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq double* [[TMP11]], [[TMP15]] 796d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 797d04d9220SAlexey Bataev // CHECK1: omp.arraycpy.body: 798d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi double* [ [[TMP8]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 799d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi double* [ [[TMP11]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 800d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP16:%.*]] = load double, double* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 8 801d04d9220SAlexey Bataev // CHECK1-NEXT: [[TMP17:%.*]] = load double, double* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 8 802d04d9220SAlexey Bataev // CHECK1-NEXT: [[ADD:%.*]] = fadd double [[TMP16]], [[TMP17]] 803d04d9220SAlexey Bataev // CHECK1-NEXT: store double [[ADD]], double* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 8 804d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr double, double* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 805d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr double, double* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 806d04d9220SAlexey Bataev // CHECK1-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq double* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP15]] 807d04d9220SAlexey Bataev // CHECK1-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]] 808d04d9220SAlexey Bataev // CHECK1: omp.arraycpy.done2: 809d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 810d04d9220SAlexey Bataev // 811d04d9220SAlexey Bataev // 812d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@_ZN2S2C2Ev 813d04d9220SAlexey Bataev // CHECK1-SAME: (%class.S2* noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]]) unnamed_addr #[[ATTR1]] comdat align 2 { 814d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 815d04d9220SAlexey Bataev // CHECK1-NEXT: [[THIS_ADDR:%.*]] = alloca %class.S2*, align 8 816d04d9220SAlexey Bataev // CHECK1-NEXT: store %class.S2* [[THIS]], %class.S2** [[THIS_ADDR]], align 8 817d04d9220SAlexey Bataev // CHECK1-NEXT: [[THIS1:%.*]] = load %class.S2*, %class.S2** [[THIS_ADDR]], align 8 818d04d9220SAlexey Bataev // CHECK1-NEXT: [[A:%.*]] = getelementptr inbounds [[CLASS_S2:%.*]], %class.S2* [[THIS1]], i32 0, i32 0 819d04d9220SAlexey Bataev // CHECK1-NEXT: store i32 0, i32* [[A]], align 4 820d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 821d04d9220SAlexey Bataev // 822d04d9220SAlexey Bataev // 823d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@main 824d04d9220SAlexey Bataev // CHECK1-SAME: () #[[ATTR10:[0-9]+]] { 825d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 826d04d9220SAlexey Bataev // CHECK1-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 827d04d9220SAlexey Bataev // CHECK1-NEXT: [[A:%.*]] = alloca i32, align 4 828d04d9220SAlexey Bataev // CHECK1-NEXT: store i32 0, i32* [[RETVAL]], align 4 829d04d9220SAlexey Bataev // CHECK1-NEXT: [[CALL:%.*]] = call noundef signext i32 @_Z3barv() 830d04d9220SAlexey Bataev // CHECK1-NEXT: store i32 [[CALL]], i32* [[A]], align 4 831d04d9220SAlexey Bataev // CHECK1-NEXT: ret i32 0 832d04d9220SAlexey Bataev // 833d04d9220SAlexey Bataev // 834d04d9220SAlexey Bataev // CHECK1-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg 835d04d9220SAlexey Bataev // CHECK1-SAME: () #[[ATTR11:[0-9]+]] { 836d04d9220SAlexey Bataev // CHECK1-NEXT: entry: 837d04d9220SAlexey Bataev // CHECK1-NEXT: call void @__tgt_register_requires(i64 1) 838d04d9220SAlexey Bataev // CHECK1-NEXT: ret void 839d04d9220SAlexey Bataev // 840d04d9220SAlexey Bataev // 841d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@_Z3sumPiiS_ 842d04d9220SAlexey Bataev // CHECK2-SAME: (i32* noundef [[INPUT:%.*]], i32 noundef [[SIZE:%.*]], i32* noundef [[OUTPUT:%.*]]) #[[ATTR0:[0-9]+]] { 843d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 844d04d9220SAlexey Bataev // CHECK2-NEXT: [[INPUT_ADDR:%.*]] = alloca i32*, align 4 845d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 846d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT_ADDR:%.*]] = alloca i32*, align 4 847d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_CASTED:%.*]] = alloca i32, align 4 848d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOFFLOAD_BASEPTRS:%.*]] = alloca [3 x i8*], align 4 849d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOFFLOAD_PTRS:%.*]] = alloca [3 x i8*], align 4 850d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOFFLOAD_MAPPERS:%.*]] = alloca [3 x i8*], align 4 851d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOFFLOAD_SIZES:%.*]] = alloca [3 x i64], align 4 852d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4 853d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 854d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_2:%.*]] = alloca i32, align 4 855d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_CASTED4:%.*]] = alloca i32, align 4 856d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOFFLOAD_BASEPTRS7:%.*]] = alloca [3 x i8*], align 4 857d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOFFLOAD_PTRS8:%.*]] = alloca [3 x i8*], align 4 858d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOFFLOAD_MAPPERS9:%.*]] = alloca [3 x i8*], align 4 859d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOFFLOAD_SIZES10:%.*]] = alloca [3 x i64], align 4 860d04d9220SAlexey Bataev // CHECK2-NEXT: [[_TMP11:%.*]] = alloca i32, align 4 861d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_12:%.*]] = alloca i32, align 4 862d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_13:%.*]] = alloca i32, align 4 863d04d9220SAlexey Bataev // CHECK2-NEXT: [[A:%.*]] = alloca [10 x i32], align 4 864*1fff1166SJoseph Huber // CHECK2-NEXT: [[SIZE_CASTED21:%.*]] = alloca i32, align 4 865*1fff1166SJoseph Huber // CHECK2-NEXT: [[DOTOFFLOAD_BASEPTRS23:%.*]] = alloca [2 x i8*], align 4 866*1fff1166SJoseph Huber // CHECK2-NEXT: [[DOTOFFLOAD_PTRS24:%.*]] = alloca [2 x i8*], align 4 867*1fff1166SJoseph Huber // CHECK2-NEXT: [[DOTOFFLOAD_MAPPERS25:%.*]] = alloca [2 x i8*], align 4 868*1fff1166SJoseph Huber // CHECK2-NEXT: [[SIZE_CASTED29:%.*]] = alloca i32, align 4 869*1fff1166SJoseph Huber // CHECK2-NEXT: [[DOTOFFLOAD_BASEPTRS31:%.*]] = alloca [2 x i8*], align 4 870*1fff1166SJoseph Huber // CHECK2-NEXT: [[DOTOFFLOAD_PTRS32:%.*]] = alloca [2 x i8*], align 4 871*1fff1166SJoseph Huber // CHECK2-NEXT: [[DOTOFFLOAD_MAPPERS33:%.*]] = alloca [2 x i8*], align 4 872d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[INPUT]], i32** [[INPUT_ADDR]], align 4 873d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 874d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[OUTPUT]], i32** [[OUTPUT_ADDR]], align 4 875d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 876d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP0]], i32* [[SIZE_CASTED]], align 4 877d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[SIZE_CASTED]], align 4 878d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 879d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 880d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 881d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 882d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP5]], i32 0 883d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 884d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 885d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[TMP7]], i32 0 886d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 887d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = mul nuw i32 [[TMP8]], 4 888d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = sext i32 [[TMP9]] to i64 889d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES]] to i8* 890d04d9220SAlexey Bataev // CHECK2-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP11]], i8* align 4 bitcast ([3 x i64]* @.offload_sizes to i8*), i32 24, i1 false) 891d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0 892d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = bitcast i8** [[TMP12]] to i32* 893d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP1]], i32* [[TMP13]], align 4 894d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP14:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0 895d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP15:%.*]] = bitcast i8** [[TMP14]] to i32* 896d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP1]], i32* [[TMP15]], align 4 897d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP16:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 0 898d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* null, i8** [[TMP16]], align 4 899d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP17:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 1 900d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP18:%.*]] = bitcast i8** [[TMP17]] to i32** 901d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[TMP4]], i32** [[TMP18]], align 4 902d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP19:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 1 903d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP20:%.*]] = bitcast i8** [[TMP19]] to i32** 904d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[ARRAYIDX]], i32** [[TMP20]], align 4 905d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP21:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 1 906d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* null, i8** [[TMP21]], align 4 907d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP22:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 2 908d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP23:%.*]] = bitcast i8** [[TMP22]] to i32** 909d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[TMP6]], i32** [[TMP23]], align 4 910d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP24:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 2 911d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP25:%.*]] = bitcast i8** [[TMP24]] to i32** 912d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[ARRAYIDX1]], i32** [[TMP25]], align 4 913d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP26:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 2 914d04d9220SAlexey Bataev // CHECK2-NEXT: store i64 [[TMP10]], i64* [[TMP26]], align 4 915d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP27:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS]], i32 0, i32 2 916d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* null, i8** [[TMP27]], align 4 917d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP28:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS]], i32 0, i32 0 918d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP29:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS]], i32 0, i32 0 919d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP30:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES]], i32 0, i32 0 920d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP31:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 921d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP31]], i32* [[DOTCAPTURE_EXPR_]], align 4 922d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP32:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 923d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP32]], 0 924d04d9220SAlexey Bataev // CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1 925d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB3:%.*]] = sub nsw i32 [[DIV]], 1 926d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SUB3]], i32* [[DOTCAPTURE_EXPR_2]], align 4 927d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP33:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_2]], align 4 928d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP33]], 1 929d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP34:%.*]] = zext i32 [[ADD]] to i64 930d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB4:[0-9]+]], i64 -1, i64 [[TMP34]]) 931*1fff1166SJoseph Huber // CHECK2-NEXT: [[KERNEL_ARGS:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS:%.*]], align 8 932*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP35:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 0 933*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 1, i32* [[TMP35]], align 4 934*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP36:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 1 935*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 3, i32* [[TMP36]], align 4 936*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP37:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 2 937*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** [[TMP28]], i8*** [[TMP37]], align 4 938*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP38:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 3 939*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** [[TMP29]], i8*** [[TMP38]], align 4 940*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP39:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 4 941*1fff1166SJoseph Huber // CHECK2-NEXT: store i64* [[TMP30]], i64** [[TMP39]], align 4 942*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP40:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 5 943*1fff1166SJoseph Huber // CHECK2-NEXT: store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes, i32 0, i32 0), i64** [[TMP40]], align 4 944*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP41:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 6 945*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** null, i8*** [[TMP41]], align 4 946*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP42:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]], i32 0, i32 7 947*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** null, i8*** [[TMP42]], align 4 948*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP43:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB4]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l69.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS]]) 949*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP44:%.*]] = icmp ne i32 [[TMP43]], 0 950*1fff1166SJoseph Huber // CHECK2-NEXT: br i1 [[TMP44]], label [[OMP_OFFLOAD_FAILED:%.*]], label [[OMP_OFFLOAD_CONT:%.*]] 951d04d9220SAlexey Bataev // CHECK2: omp_offload.failed: 952d04d9220SAlexey Bataev // CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l69(i32 [[TMP1]], i32* [[TMP2]], i32* [[TMP3]]) #[[ATTR2:[0-9]+]] 953d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_OFFLOAD_CONT]] 954d04d9220SAlexey Bataev // CHECK2: omp_offload.cont: 955d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP45:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 956*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 [[TMP45]], i32* [[SIZE_CASTED4]], align 4 957*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP46:%.*]] = load i32, i32* [[SIZE_CASTED4]], align 4 958*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP47:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 959*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP48:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 960*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP49:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 961*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP50:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 962*1fff1166SJoseph Huber // CHECK2-NEXT: [[ARRAYIDX5:%.*]] = getelementptr inbounds i32, i32* [[TMP50]], i32 0 963*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP51:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 964*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP52:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 965*1fff1166SJoseph Huber // CHECK2-NEXT: [[ARRAYIDX6:%.*]] = getelementptr inbounds i32, i32* [[TMP52]], i32 0 966*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP53:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 967*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP54:%.*]] = mul nuw i32 [[TMP53]], 4 968*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP55:%.*]] = sext i32 [[TMP54]] to i64 969*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP56:%.*]] = bitcast [3 x i64]* [[DOTOFFLOAD_SIZES10]] to i8* 970*1fff1166SJoseph Huber // CHECK2-NEXT: call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 [[TMP56]], i8* align 4 bitcast ([3 x i64]* @.offload_sizes.7 to i8*), i32 24, i1 false) 971*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP57:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0 972*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP58:%.*]] = bitcast i8** [[TMP57]] to i32* 973*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 [[TMP46]], i32* [[TMP58]], align 4 974*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP59:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0 975*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP60:%.*]] = bitcast i8** [[TMP59]] to i32* 976*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 [[TMP46]], i32* [[TMP60]], align 4 977*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP61:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i32 0, i32 0 978*1fff1166SJoseph Huber // CHECK2-NEXT: store i8* null, i8** [[TMP61]], align 4 979*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP62:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 1 980*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP63:%.*]] = bitcast i8** [[TMP62]] to i32** 981*1fff1166SJoseph Huber // CHECK2-NEXT: store i32* [[TMP49]], i32** [[TMP63]], align 4 982*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP64:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 1 983*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP65:%.*]] = bitcast i8** [[TMP64]] to i32** 984*1fff1166SJoseph Huber // CHECK2-NEXT: store i32* [[ARRAYIDX5]], i32** [[TMP65]], align 4 985*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP66:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i32 0, i32 1 986*1fff1166SJoseph Huber // CHECK2-NEXT: store i8* null, i8** [[TMP66]], align 4 987*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP67:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 2 988*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP68:%.*]] = bitcast i8** [[TMP67]] to i32** 989*1fff1166SJoseph Huber // CHECK2-NEXT: store i32* [[TMP51]], i32** [[TMP68]], align 4 990*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP69:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 2 991*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP70:%.*]] = bitcast i8** [[TMP69]] to i32** 992*1fff1166SJoseph Huber // CHECK2-NEXT: store i32* [[ARRAYIDX6]], i32** [[TMP70]], align 4 993*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP71:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES10]], i32 0, i32 2 994*1fff1166SJoseph Huber // CHECK2-NEXT: store i64 [[TMP55]], i64* [[TMP71]], align 4 995*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP72:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_MAPPERS9]], i32 0, i32 2 996*1fff1166SJoseph Huber // CHECK2-NEXT: store i8* null, i8** [[TMP72]], align 4 997*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP73:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_BASEPTRS7]], i32 0, i32 0 998*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP74:%.*]] = getelementptr inbounds [3 x i8*], [3 x i8*]* [[DOTOFFLOAD_PTRS8]], i32 0, i32 0 999*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP75:%.*]] = getelementptr inbounds [3 x i64], [3 x i64]* [[DOTOFFLOAD_SIZES10]], i32 0, i32 0 1000*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP76:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1001*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 [[TMP76]], i32* [[DOTCAPTURE_EXPR_12]], align 4 1002*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP77:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_12]], align 4 1003*1fff1166SJoseph Huber // CHECK2-NEXT: [[SUB14:%.*]] = sub nsw i32 [[TMP77]], 0 1004d04d9220SAlexey Bataev // CHECK2-NEXT: [[DIV15:%.*]] = sdiv i32 [[SUB14]], 1 1005d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB16:%.*]] = sub nsw i32 [[DIV15]], 1 1006d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SUB16]], i32* [[DOTCAPTURE_EXPR_13]], align 4 1007*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP78:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_13]], align 4 1008*1fff1166SJoseph Huber // CHECK2-NEXT: [[ADD17:%.*]] = add nsw i32 [[TMP78]], 1 1009*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP79:%.*]] = zext i32 [[ADD17]] to i64 1010*1fff1166SJoseph Huber // CHECK2-NEXT: call void @__kmpc_push_target_tripcount_mapper(%struct.ident_t* @[[GLOB4]], i64 -1, i64 [[TMP79]]) 1011*1fff1166SJoseph Huber // CHECK2-NEXT: [[KERNEL_ARGS18:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8 1012*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP80:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS18]], i32 0, i32 0 1013*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 1, i32* [[TMP80]], align 4 1014*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP81:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS18]], i32 0, i32 1 1015*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 3, i32* [[TMP81]], align 4 1016*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP82:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS18]], i32 0, i32 2 1017*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** [[TMP73]], i8*** [[TMP82]], align 4 1018*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP83:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS18]], i32 0, i32 3 1019*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** [[TMP74]], i8*** [[TMP83]], align 4 1020*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP84:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS18]], i32 0, i32 4 1021*1fff1166SJoseph Huber // CHECK2-NEXT: store i64* [[TMP75]], i64** [[TMP84]], align 4 1022*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP85:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS18]], i32 0, i32 5 1023*1fff1166SJoseph Huber // CHECK2-NEXT: store i64* getelementptr inbounds ([3 x i64], [3 x i64]* @.offload_maptypes.8, i32 0, i32 0), i64** [[TMP85]], align 4 1024*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP86:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS18]], i32 0, i32 6 1025*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** null, i8*** [[TMP86]], align 4 1026*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP87:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS18]], i32 0, i32 7 1027*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** null, i8*** [[TMP87]], align 4 1028*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP88:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB4]], i64 -1, i32 0, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l73.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS18]]) 1029d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP89:%.*]] = icmp ne i32 [[TMP88]], 0 1030*1fff1166SJoseph Huber // CHECK2-NEXT: br i1 [[TMP89]], label [[OMP_OFFLOAD_FAILED19:%.*]], label [[OMP_OFFLOAD_CONT20:%.*]] 1031*1fff1166SJoseph Huber // CHECK2: omp_offload.failed19: 1032*1fff1166SJoseph Huber // CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l73(i32 [[TMP46]], i32* [[TMP47]], i32* [[TMP48]]) #[[ATTR2]] 1033*1fff1166SJoseph Huber // CHECK2-NEXT: br label [[OMP_OFFLOAD_CONT20]] 1034*1fff1166SJoseph Huber // CHECK2: omp_offload.cont20: 1035d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP90:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1036*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 [[TMP90]], i32* [[SIZE_CASTED21]], align 4 1037*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP91:%.*]] = load i32, i32* [[SIZE_CASTED21]], align 4 1038*1fff1166SJoseph Huber // CHECK2-NEXT: [[ARRAYIDX22:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i32 0, i32 0 1039*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP92:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS23]], i32 0, i32 0 1040d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP93:%.*]] = bitcast i8** [[TMP92]] to i32* 1041d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP91]], i32* [[TMP93]], align 4 1042*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP94:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS24]], i32 0, i32 0 1043d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP95:%.*]] = bitcast i8** [[TMP94]] to i32* 1044d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP91]], i32* [[TMP95]], align 4 1045*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP96:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS25]], i32 0, i32 0 1046d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* null, i8** [[TMP96]], align 4 1047*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP97:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS23]], i32 0, i32 1 1048d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP98:%.*]] = bitcast i8** [[TMP97]] to [10 x i32]** 1049d04d9220SAlexey Bataev // CHECK2-NEXT: store [10 x i32]* [[A]], [10 x i32]** [[TMP98]], align 4 1050*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP99:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS24]], i32 0, i32 1 1051d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP100:%.*]] = bitcast i8** [[TMP99]] to i32** 1052*1fff1166SJoseph Huber // CHECK2-NEXT: store i32* [[ARRAYIDX22]], i32** [[TMP100]], align 4 1053*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP101:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS25]], i32 0, i32 1 1054d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* null, i8** [[TMP101]], align 4 1055*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP102:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS23]], i32 0, i32 0 1056*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP103:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS24]], i32 0, i32 0 1057*1fff1166SJoseph Huber // CHECK2-NEXT: [[KERNEL_ARGS26:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8 1058*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP104:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS26]], i32 0, i32 0 1059*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 1, i32* [[TMP104]], align 4 1060*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP105:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS26]], i32 0, i32 1 1061*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 2, i32* [[TMP105]], align 4 1062*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP106:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS26]], i32 0, i32 2 1063*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** [[TMP102]], i8*** [[TMP106]], align 4 1064*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP107:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS26]], i32 0, i32 3 1065*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** [[TMP103]], i8*** [[TMP107]], align 4 1066*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP108:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS26]], i32 0, i32 4 1067*1fff1166SJoseph Huber // CHECK2-NEXT: store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.11, i32 0, i32 0), i64** [[TMP108]], align 4 1068*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP109:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS26]], i32 0, i32 5 1069*1fff1166SJoseph Huber // CHECK2-NEXT: store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.12, i32 0, i32 0), i64** [[TMP109]], align 4 1070*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP110:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS26]], i32 0, i32 6 1071*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** null, i8*** [[TMP110]], align 4 1072*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP111:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS26]], i32 0, i32 7 1073*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** null, i8*** [[TMP111]], align 4 1074*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP112:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB4]], i64 -1, i32 1, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l78.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS26]]) 1075*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP113:%.*]] = icmp ne i32 [[TMP112]], 0 1076*1fff1166SJoseph Huber // CHECK2-NEXT: br i1 [[TMP113]], label [[OMP_OFFLOAD_FAILED27:%.*]], label [[OMP_OFFLOAD_CONT28:%.*]] 1077*1fff1166SJoseph Huber // CHECK2: omp_offload.failed27: 1078*1fff1166SJoseph Huber // CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l78(i32 [[TMP91]], [10 x i32]* [[A]]) #[[ATTR2]] 1079*1fff1166SJoseph Huber // CHECK2-NEXT: br label [[OMP_OFFLOAD_CONT28]] 1080*1fff1166SJoseph Huber // CHECK2: omp_offload.cont28: 1081*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP114:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1082*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 [[TMP114]], i32* [[SIZE_CASTED29]], align 4 1083*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP115:%.*]] = load i32, i32* [[SIZE_CASTED29]], align 4 1084*1fff1166SJoseph Huber // CHECK2-NEXT: [[ARRAYIDX30:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[A]], i32 0, i32 3 1085*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP116:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS31]], i32 0, i32 0 1086*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP117:%.*]] = bitcast i8** [[TMP116]] to i32* 1087*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 [[TMP115]], i32* [[TMP117]], align 4 1088*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP118:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS32]], i32 0, i32 0 1089*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP119:%.*]] = bitcast i8** [[TMP118]] to i32* 1090*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 [[TMP115]], i32* [[TMP119]], align 4 1091*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP120:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS33]], i32 0, i32 0 1092*1fff1166SJoseph Huber // CHECK2-NEXT: store i8* null, i8** [[TMP120]], align 4 1093*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP121:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS31]], i32 0, i32 1 1094*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP122:%.*]] = bitcast i8** [[TMP121]] to [10 x i32]** 1095*1fff1166SJoseph Huber // CHECK2-NEXT: store [10 x i32]* [[A]], [10 x i32]** [[TMP122]], align 4 1096*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP123:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS32]], i32 0, i32 1 1097*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP124:%.*]] = bitcast i8** [[TMP123]] to i32** 1098*1fff1166SJoseph Huber // CHECK2-NEXT: store i32* [[ARRAYIDX30]], i32** [[TMP124]], align 4 1099*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP125:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_MAPPERS33]], i32 0, i32 1 1100*1fff1166SJoseph Huber // CHECK2-NEXT: store i8* null, i8** [[TMP125]], align 4 1101*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP126:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_BASEPTRS31]], i32 0, i32 0 1102*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP127:%.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* [[DOTOFFLOAD_PTRS32]], i32 0, i32 0 1103*1fff1166SJoseph Huber // CHECK2-NEXT: [[KERNEL_ARGS34:%.*]] = alloca [[STRUCT___TGT_KERNEL_ARGUMENTS]], align 8 1104*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP128:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS34]], i32 0, i32 0 1105*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 1, i32* [[TMP128]], align 4 1106*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP129:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS34]], i32 0, i32 1 1107*1fff1166SJoseph Huber // CHECK2-NEXT: store i32 2, i32* [[TMP129]], align 4 1108*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP130:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS34]], i32 0, i32 2 1109*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** [[TMP126]], i8*** [[TMP130]], align 4 1110*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP131:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS34]], i32 0, i32 3 1111*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** [[TMP127]], i8*** [[TMP131]], align 4 1112*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP132:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS34]], i32 0, i32 4 1113*1fff1166SJoseph Huber // CHECK2-NEXT: store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_sizes.15, i32 0, i32 0), i64** [[TMP132]], align 4 1114*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP133:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS34]], i32 0, i32 5 1115*1fff1166SJoseph Huber // CHECK2-NEXT: store i64* getelementptr inbounds ([2 x i64], [2 x i64]* @.offload_maptypes.16, i32 0, i32 0), i64** [[TMP133]], align 4 1116*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP134:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS34]], i32 0, i32 6 1117*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** null, i8*** [[TMP134]], align 4 1118*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP135:%.*]] = getelementptr inbounds [[STRUCT___TGT_KERNEL_ARGUMENTS]], %struct.__tgt_kernel_arguments* [[KERNEL_ARGS34]], i32 0, i32 7 1119*1fff1166SJoseph Huber // CHECK2-NEXT: store i8** null, i8*** [[TMP135]], align 4 1120*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP136:%.*]] = call i32 @__tgt_target_kernel(%struct.ident_t* @[[GLOB4]], i64 -1, i32 1, i32 0, i8* @.{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l81.region_id, %struct.__tgt_kernel_arguments* [[KERNEL_ARGS34]]) 1121*1fff1166SJoseph Huber // CHECK2-NEXT: [[TMP137:%.*]] = icmp ne i32 [[TMP136]], 0 1122*1fff1166SJoseph Huber // CHECK2-NEXT: br i1 [[TMP137]], label [[OMP_OFFLOAD_FAILED35:%.*]], label [[OMP_OFFLOAD_CONT36:%.*]] 1123*1fff1166SJoseph Huber // CHECK2: omp_offload.failed35: 1124*1fff1166SJoseph Huber // CHECK2-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l81(i32 [[TMP115]], [10 x i32]* [[A]]) #[[ATTR2]] 1125*1fff1166SJoseph Huber // CHECK2-NEXT: br label [[OMP_OFFLOAD_CONT36]] 1126*1fff1166SJoseph Huber // CHECK2: omp_offload.cont36: 1127d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1128d04d9220SAlexey Bataev // 1129d04d9220SAlexey Bataev // 1130d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l69 1131d04d9220SAlexey Bataev // CHECK2-SAME: (i32 noundef [[SIZE:%.*]], i32* noundef [[OUTPUT:%.*]], i32* noundef [[INPUT:%.*]]) #[[ATTR1:[0-9]+]] { 1132d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1133d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 1134d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT_ADDR:%.*]] = alloca i32*, align 4 1135d04d9220SAlexey Bataev // CHECK2-NEXT: [[INPUT_ADDR:%.*]] = alloca i32*, align 4 1136d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_CASTED:%.*]] = alloca i32, align 4 1137d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 1138d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[OUTPUT]], i32** [[OUTPUT_ADDR]], align 4 1139d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[INPUT]], i32** [[INPUT_ADDR]], align 4 1140d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1141d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP0]], i32* [[SIZE_CASTED]], align 4 1142d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[SIZE_CASTED]], align 4 1143d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1144d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 1145d04d9220SAlexey Bataev // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB4]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32*, i32*)* @.omp_outlined. to void (i32*, i32*, ...)*), i32 [[TMP1]], i32* [[TMP2]], i32* [[TMP3]]) 1146d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1147d04d9220SAlexey Bataev // 1148d04d9220SAlexey Bataev // 1149d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined. 1150d04d9220SAlexey Bataev // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[SIZE:%.*]], i32* noundef [[OUTPUT:%.*]], i32* noundef [[INPUT:%.*]]) #[[ATTR1]] { 1151d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1152d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4 1153d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4 1154d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 1155d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT_ADDR:%.*]] = alloca i32*, align 4 1156d04d9220SAlexey Bataev // CHECK2-NEXT: [[INPUT_ADDR:%.*]] = alloca i32*, align 4 1157d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT1:%.*]] = alloca i32, align 4 1158d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP:%.*]] = alloca i32*, align 4 1159d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 1160d04d9220SAlexey Bataev // CHECK2-NEXT: [[_TMP2:%.*]] = alloca i32, align 4 1161d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 1162d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_3:%.*]] = alloca i32, align 4 1163d04d9220SAlexey Bataev // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 1164d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4 1165d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4 1166d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 1167d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 1168d04d9220SAlexey Bataev // CHECK2-NEXT: [[I5:%.*]] = alloca i32, align 4 1169d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_CASTED:%.*]] = alloca i32, align 4 1170d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 4 1171d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4 1172d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4 1173d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 1174d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[OUTPUT]], i32** [[OUTPUT_ADDR]], align 4 1175d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[INPUT]], i32** [[INPUT_ADDR]], align 4 1176d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1177d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i32 0 1178d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[OUTPUT1]], align 4 1179d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1180d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = ptrtoint i32* [[TMP1]] to i64 1181d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = ptrtoint i32* [[ARRAYIDX]] to i64 1182d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = sub i64 [[TMP2]], [[TMP3]] 1183d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = sdiv exact i64 [[TMP4]], ptrtoint (i32* getelementptr (i32, i32* null, i32 1) to i64) 1184d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr i32, i32* [[OUTPUT1]], i64 [[TMP5]] 1185d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[TMP6]], i32** [[TMP]], align 4 1186d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1187d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP7]], i32* [[DOTCAPTURE_EXPR_]], align 4 1188d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 1189d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP8]], 0 1190d04d9220SAlexey Bataev // CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1 1191d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB4:%.*]] = sub nsw i32 [[DIV]], 1 1192d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SUB4]], i32* [[DOTCAPTURE_EXPR_3]], align 4 1193d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[I]], align 4 1194d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 1195d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP9]] 1196d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 1197d04d9220SAlexey Bataev // CHECK2: omp.precond.then: 1198d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_COMB_LB]], align 4 1199d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4 1200d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP10]], i32* [[DOTOMP_COMB_UB]], align 4 1201d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 1202d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 1203d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1204d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4 1205d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1:[0-9]+]], i32 [[TMP12]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1) 1206d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4 1207d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4 1208d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[TMP13]], [[TMP14]] 1209d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP6]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 1210d04d9220SAlexey Bataev // CHECK2: cond.true: 1211d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_3]], align 4 1212d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[COND_END:%.*]] 1213d04d9220SAlexey Bataev // CHECK2: cond.false: 1214d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4 1215d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[COND_END]] 1216d04d9220SAlexey Bataev // CHECK2: cond.end: 1217d04d9220SAlexey Bataev // CHECK2-NEXT: [[COND:%.*]] = phi i32 [ [[TMP15]], [[COND_TRUE]] ], [ [[TMP16]], [[COND_FALSE]] ] 1218d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4 1219d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4 1220d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP17]], i32* [[DOTOMP_IV]], align 4 1221d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 1222d04d9220SAlexey Bataev // CHECK2: omp.inner.for.cond: 1223d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1224d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4 1225d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP18]], [[TMP19]] 1226d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 1227d04d9220SAlexey Bataev // CHECK2: omp.inner.for.body: 1228d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4 1229d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP21:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4 1230d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP22:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1231d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP22]], i32* [[SIZE_CASTED]], align 4 1232d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP23:%.*]] = load i32, i32* [[SIZE_CASTED]], align 4 1233d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP24:%.*]] = load i32*, i32** [[TMP]], align 4 1234d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP25:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 1235d04d9220SAlexey Bataev // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB4]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32, i32*, i32*)* @.omp_outlined..1 to void (i32*, i32*, ...)*), i32 [[TMP20]], i32 [[TMP21]], i32 [[TMP23]], i32* [[TMP24]], i32* [[TMP25]]) 1236d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 1237d04d9220SAlexey Bataev // CHECK2: omp.inner.for.inc: 1238d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP26:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1239d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP27:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4 1240d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP26]], [[TMP27]] 1241d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4 1242d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 1243d04d9220SAlexey Bataev // CHECK2: omp.inner.for.end: 1244d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 1245d04d9220SAlexey Bataev // CHECK2: omp.loop.exit: 1246d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP28:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1247d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP29:%.*]] = load i32, i32* [[TMP28]], align 4 1248d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP29]]) 1249d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_PRECOND_END]] 1250d04d9220SAlexey Bataev // CHECK2: omp.precond.end: 1251d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP30:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 0 1252d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP31:%.*]] = bitcast i32* [[OUTPUT1]] to i8* 1253d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP31]], i8** [[TMP30]], align 4 1254d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP32:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1255d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4 1256d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP34:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8* 1257d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP35:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB3:[0-9]+]], i32 [[TMP33]], i32 1, i32 4, i8* [[TMP34]], void (i8*, i8*)* @.omp.reduction.reduction_func.2, [8 x i32]* @.gomp_critical_user_.reduction.var) 1258d04d9220SAlexey Bataev // CHECK2-NEXT: switch i32 [[TMP35]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 1259d04d9220SAlexey Bataev // CHECK2-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 1260d04d9220SAlexey Bataev // CHECK2-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 1261d04d9220SAlexey Bataev // CHECK2-NEXT: ] 1262d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case1: 1263d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP36:%.*]] = load i32, i32* [[ARRAYIDX]], align 4 1264d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP37:%.*]] = load i32, i32* [[OUTPUT1]], align 4 1265d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD8:%.*]] = add nsw i32 [[TMP36]], [[TMP37]] 1266d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD8]], i32* [[ARRAYIDX]], align 4 1267d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP33]], [8 x i32]* @.gomp_critical_user_.reduction.var) 1268d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1269d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case2: 1270d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP38:%.*]] = load i32, i32* [[OUTPUT1]], align 4 1271d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP39:%.*]] = atomicrmw add i32* [[ARRAYIDX]], i32 [[TMP38]] monotonic, align 4 1272d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1273d04d9220SAlexey Bataev // CHECK2: .omp.reduction.default: 1274d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1275d04d9220SAlexey Bataev // 1276d04d9220SAlexey Bataev // 1277d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..1 1278d04d9220SAlexey Bataev // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32 noundef [[SIZE:%.*]], i32* noundef [[OUTPUT:%.*]], i32* noundef [[INPUT:%.*]]) #[[ATTR1]] { 1279d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1280d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4 1281d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4 1282d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4 1283d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4 1284d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 1285d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT_ADDR:%.*]] = alloca i32*, align 4 1286d04d9220SAlexey Bataev // CHECK2-NEXT: [[INPUT_ADDR:%.*]] = alloca i32*, align 4 1287d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 1288d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4 1289d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 1290d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4 1291d04d9220SAlexey Bataev // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 1292d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 1293d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 1294d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 1295d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 1296d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT3:%.*]] = alloca i32, align 4 1297d04d9220SAlexey Bataev // CHECK2-NEXT: [[_TMP4:%.*]] = alloca i32*, align 4 1298d04d9220SAlexey Bataev // CHECK2-NEXT: [[I5:%.*]] = alloca i32, align 4 1299d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 4 1300d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4 1301d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4 1302d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4 1303d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4 1304d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 1305d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[OUTPUT]], i32** [[OUTPUT_ADDR]], align 4 1306d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[INPUT]], i32** [[INPUT_ADDR]], align 4 1307d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1308d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP0]], i32* [[DOTCAPTURE_EXPR_]], align 4 1309d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 1310d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP1]], 0 1311d04d9220SAlexey Bataev // CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1 1312d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1 1313d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4 1314d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[I]], align 4 1315d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 1316d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP2]] 1317d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 1318d04d9220SAlexey Bataev // CHECK2: omp.precond.then: 1319d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4 1320d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 1321d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_UB]], align 4 1322d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4 1323d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4 1324d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_LB]], align 4 1325d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4 1326d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 1327d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 1328d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1329d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP6]], i32 0 1330d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[OUTPUT3]], align 4 1331d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1332d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = ptrtoint i32* [[TMP7]] to i64 1333d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = ptrtoint i32* [[ARRAYIDX]] to i64 1334d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = sub i64 [[TMP8]], [[TMP9]] 1335d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = sdiv exact i64 [[TMP10]], ptrtoint (i32* getelementptr (i32, i32* null, i32 1) to i64) 1336d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = getelementptr i32, i32* [[OUTPUT3]], i64 [[TMP11]] 1337d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[TMP12]], i32** [[_TMP4]], align 4 1338d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1339d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4 1340d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2:[0-9]+]], i32 [[TMP14]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1) 1341d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP15:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 1342d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 1343d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP6:%.*]] = icmp sgt i32 [[TMP15]], [[TMP16]] 1344d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP6]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 1345d04d9220SAlexey Bataev // CHECK2: cond.true: 1346d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 1347d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[COND_END:%.*]] 1348d04d9220SAlexey Bataev // CHECK2: cond.false: 1349d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 1350d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[COND_END]] 1351d04d9220SAlexey Bataev // CHECK2: cond.end: 1352d04d9220SAlexey Bataev // CHECK2-NEXT: [[COND:%.*]] = phi i32 [ [[TMP17]], [[COND_TRUE]] ], [ [[TMP18]], [[COND_FALSE]] ] 1353d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4 1354d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4 1355d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP19]], i32* [[DOTOMP_IV]], align 4 1356d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 1357d04d9220SAlexey Bataev // CHECK2: omp.inner.for.cond: 1358d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP20:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1359d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 1360d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP7:%.*]] = icmp sle i32 [[TMP20]], [[TMP21]] 1361d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP7]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 1362d04d9220SAlexey Bataev // CHECK2: omp.inner.for.body: 1363d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1364d04d9220SAlexey Bataev // CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP22]], 1 1365d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]] 1366d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[I5]], align 4 1367d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP23:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 1368d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP24:%.*]] = load i32, i32* [[I5]], align 4 1369d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX8:%.*]] = getelementptr inbounds i32, i32* [[TMP23]], i32 [[TMP24]] 1370d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP25:%.*]] = load i32, i32* [[ARRAYIDX8]], align 4 1371d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP26:%.*]] = load i32*, i32** [[_TMP4]], align 4 1372d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds i32, i32* [[TMP26]], i32 0 1373d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP27:%.*]] = load i32, i32* [[ARRAYIDX9]], align 4 1374d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP27]], [[TMP25]] 1375d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD10]], i32* [[ARRAYIDX9]], align 4 1376d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 1377d04d9220SAlexey Bataev // CHECK2: omp.body.continue: 1378d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 1379d04d9220SAlexey Bataev // CHECK2: omp.inner.for.inc: 1380d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP28:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1381d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD11:%.*]] = add nsw i32 [[TMP28]], 1 1382d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD11]], i32* [[DOTOMP_IV]], align 4 1383d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 1384d04d9220SAlexey Bataev // CHECK2: omp.inner.for.end: 1385d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 1386d04d9220SAlexey Bataev // CHECK2: omp.loop.exit: 1387d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP29:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1388d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP30:%.*]] = load i32, i32* [[TMP29]], align 4 1389d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP30]]) 1390d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP31:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 0 1391d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP32:%.*]] = bitcast i32* [[OUTPUT3]] to i8* 1392d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP32]], i8** [[TMP31]], align 4 1393d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP33:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1394d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP34:%.*]] = load i32, i32* [[TMP33]], align 4 1395d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP35:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8* 1396d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP36:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP34]], i32 1, i32 4, i8* [[TMP35]], void (i8*, i8*)* @.omp.reduction.reduction_func, [8 x i32]* @.gomp_critical_user_.reduction.var) 1397d04d9220SAlexey Bataev // CHECK2-NEXT: switch i32 [[TMP36]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 1398d04d9220SAlexey Bataev // CHECK2-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 1399d04d9220SAlexey Bataev // CHECK2-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 1400d04d9220SAlexey Bataev // CHECK2-NEXT: ] 1401d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case1: 1402d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP37:%.*]] = load i32, i32* [[ARRAYIDX]], align 4 1403d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP38:%.*]] = load i32, i32* [[OUTPUT3]], align 4 1404d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP37]], [[TMP38]] 1405d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD12]], i32* [[ARRAYIDX]], align 4 1406d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP34]], [8 x i32]* @.gomp_critical_user_.reduction.var) 1407d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1408d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case2: 1409d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP39:%.*]] = load i32, i32* [[OUTPUT3]], align 4 1410d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP40:%.*]] = atomicrmw add i32* [[ARRAYIDX]], i32 [[TMP39]] monotonic, align 4 1411d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1412d04d9220SAlexey Bataev // CHECK2: .omp.reduction.default: 1413d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_PRECOND_END]] 1414d04d9220SAlexey Bataev // CHECK2: omp.precond.end: 1415d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1416d04d9220SAlexey Bataev // 1417d04d9220SAlexey Bataev // 1418d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func 1419d04d9220SAlexey Bataev // CHECK2-SAME: (i8* noundef [[TMP0:%.*]], i8* noundef [[TMP1:%.*]]) #[[ATTR3:[0-9]+]] { 1420d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1421d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 4 1422d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 4 1423d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 4 1424d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 4 1425d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 4 1426d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]* 1427d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 4 1428d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]* 1429d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i32 0, i32 0 1430d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 4 1431d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32* 1432d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i32 0, i32 0 1433d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 4 1434d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32* 1435d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4 1436d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4 1437d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]] 1438d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4 1439d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1440d04d9220SAlexey Bataev // 1441d04d9220SAlexey Bataev // 1442d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.2 1443d04d9220SAlexey Bataev // CHECK2-SAME: (i8* noundef [[TMP0:%.*]], i8* noundef [[TMP1:%.*]]) #[[ATTR3]] { 1444d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1445d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 4 1446d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 4 1447d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 4 1448d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 4 1449d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 4 1450d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]* 1451d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 4 1452d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]* 1453d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i32 0, i32 0 1454d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 4 1455d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32* 1456d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i32 0, i32 0 1457d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 4 1458d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32* 1459d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4 1460d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4 1461d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]] 1462d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4 1463d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1464d04d9220SAlexey Bataev // 1465d04d9220SAlexey Bataev // 1466d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l73 1467d04d9220SAlexey Bataev // CHECK2-SAME: (i32 noundef [[SIZE:%.*]], i32* noundef [[OUTPUT:%.*]], i32* noundef [[INPUT:%.*]]) #[[ATTR1]] { 1468d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1469d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 1470d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT_ADDR:%.*]] = alloca i32*, align 4 1471d04d9220SAlexey Bataev // CHECK2-NEXT: [[INPUT_ADDR:%.*]] = alloca i32*, align 4 1472d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_CASTED:%.*]] = alloca i32, align 4 1473d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 1474d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[OUTPUT]], i32** [[OUTPUT_ADDR]], align 4 1475d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[INPUT]], i32** [[INPUT_ADDR]], align 4 1476d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1477d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP0]], i32* [[SIZE_CASTED]], align 4 1478d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[SIZE_CASTED]], align 4 1479d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1480d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 1481d04d9220SAlexey Bataev // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_teams(%struct.ident_t* @[[GLOB4]], i32 3, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32*, i32*)* @.omp_outlined..3 to void (i32*, i32*, ...)*), i32 [[TMP1]], i32* [[TMP2]], i32* [[TMP3]]) 1482d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1483d04d9220SAlexey Bataev // 1484d04d9220SAlexey Bataev // 1485d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..3 1486d04d9220SAlexey Bataev // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[SIZE:%.*]], i32* noundef [[OUTPUT:%.*]], i32* noundef [[INPUT:%.*]]) #[[ATTR1]] { 1487d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1488d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4 1489d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4 1490d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 1491d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT_ADDR:%.*]] = alloca i32*, align 4 1492d04d9220SAlexey Bataev // CHECK2-NEXT: [[INPUT_ADDR:%.*]] = alloca i32*, align 4 1493d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT2:%.*]] = alloca [3 x i32], align 4 1494d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP:%.*]] = alloca i32*, align 4 1495d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 1496d04d9220SAlexey Bataev // CHECK2-NEXT: [[_TMP3:%.*]] = alloca i32, align 4 1497d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 1498d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_4:%.*]] = alloca i32, align 4 1499d04d9220SAlexey Bataev // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 1500d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_COMB_LB:%.*]] = alloca i32, align 4 1501d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_COMB_UB:%.*]] = alloca i32, align 4 1502d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 1503d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 1504d04d9220SAlexey Bataev // CHECK2-NEXT: [[I6:%.*]] = alloca i32, align 4 1505d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_CASTED:%.*]] = alloca i32, align 4 1506d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 4 1507d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4 1508d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4 1509d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 1510d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[OUTPUT]], i32** [[OUTPUT_ADDR]], align 4 1511d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[INPUT]], i32** [[INPUT_ADDR]], align 4 1512d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1513d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP0]], i32 0 1514d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1515d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds i32, i32* [[TMP1]], i32 2 1516d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [3 x i32], [3 x i32]* [[OUTPUT2]], i32 0, i32 0 1517d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = getelementptr i32, i32* [[ARRAY_BEGIN]], i32 3 1518d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq i32* [[ARRAY_BEGIN]], [[TMP2]] 1519d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]] 1520d04d9220SAlexey Bataev // CHECK2: omp.arrayinit.body: 1521d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi i32* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ] 1522d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4 1523d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 1524d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP2]] 1525d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]] 1526d04d9220SAlexey Bataev // CHECK2: omp.arrayinit.done: 1527d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1528d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = ptrtoint i32* [[TMP3]] to i64 1529d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = ptrtoint i32* [[ARRAYIDX]] to i64 1530d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = sub i64 [[TMP4]], [[TMP5]] 1531d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = sdiv exact i64 [[TMP6]], ptrtoint (i32* getelementptr (i32, i32* null, i32 1) to i64) 1532d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = bitcast [3 x i32]* [[OUTPUT2]] to i32* 1533d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr i32, i32* [[TMP8]], i64 [[TMP7]] 1534d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[TMP9]], i32** [[TMP]], align 4 1535d04d9220SAlexey Bataev // CHECK2-NEXT: [[RHS_BEGIN:%.*]] = bitcast [3 x i32]* [[OUTPUT2]] to i32* 1536d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1537d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP10]], i32* [[DOTCAPTURE_EXPR_]], align 4 1538d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 1539d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP11]], 0 1540d04d9220SAlexey Bataev // CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1 1541d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB5:%.*]] = sub nsw i32 [[DIV]], 1 1542d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SUB5]], i32* [[DOTCAPTURE_EXPR_4]], align 4 1543d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[I]], align 4 1544d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 1545d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP12]] 1546d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 1547d04d9220SAlexey Bataev // CHECK2: omp.precond.then: 1548d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_COMB_LB]], align 4 1549d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4 1550d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP13]], i32* [[DOTOMP_COMB_UB]], align 4 1551d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 1552d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 1553d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP14:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1554d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP15:%.*]] = load i32, i32* [[TMP14]], align 4 1555d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB1]], i32 [[TMP15]], i32 92, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_COMB_LB]], i32* [[DOTOMP_COMB_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1) 1556d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP16:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4 1557d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP17:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4 1558d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP7:%.*]] = icmp sgt i32 [[TMP16]], [[TMP17]] 1559d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP7]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 1560d04d9220SAlexey Bataev // CHECK2: cond.true: 1561d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_4]], align 4 1562d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[COND_END:%.*]] 1563d04d9220SAlexey Bataev // CHECK2: cond.false: 1564d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4 1565d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[COND_END]] 1566d04d9220SAlexey Bataev // CHECK2: cond.end: 1567d04d9220SAlexey Bataev // CHECK2-NEXT: [[COND:%.*]] = phi i32 [ [[TMP18]], [[COND_TRUE]] ], [ [[TMP19]], [[COND_FALSE]] ] 1568d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[COND]], i32* [[DOTOMP_COMB_UB]], align 4 1569d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP20:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4 1570d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP20]], i32* [[DOTOMP_IV]], align 4 1571d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 1572d04d9220SAlexey Bataev // CHECK2: omp.inner.for.cond: 1573d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP21:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1574d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4 1575d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP21]], [[TMP22]] 1576d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 1577d04d9220SAlexey Bataev // CHECK2: omp.inner.for.body: 1578d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTOMP_COMB_LB]], align 4 1579d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTOMP_COMB_UB]], align 4 1580d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP25:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1581d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP25]], i32* [[SIZE_CASTED]], align 4 1582d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP26:%.*]] = load i32, i32* [[SIZE_CASTED]], align 4 1583d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP27:%.*]] = load i32*, i32** [[TMP]], align 4 1584d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP28:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 1585d04d9220SAlexey Bataev // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB4]], i32 5, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, i32, i32, i32*, i32*)* @.omp_outlined..4 to void (i32*, i32*, ...)*), i32 [[TMP23]], i32 [[TMP24]], i32 [[TMP26]], i32* [[TMP27]], i32* [[TMP28]]) 1586d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 1587d04d9220SAlexey Bataev // CHECK2: omp.inner.for.inc: 1588d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP29:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1589d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP30:%.*]] = load i32, i32* [[DOTOMP_STRIDE]], align 4 1590d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP29]], [[TMP30]] 1591d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[DOTOMP_IV]], align 4 1592d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 1593d04d9220SAlexey Bataev // CHECK2: omp.inner.for.end: 1594d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 1595d04d9220SAlexey Bataev // CHECK2: omp.loop.exit: 1596d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP31:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1597d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP32:%.*]] = load i32, i32* [[TMP31]], align 4 1598d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP32]]) 1599d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_PRECOND_END]] 1600d04d9220SAlexey Bataev // CHECK2: omp.precond.end: 1601d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP33:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 0 1602d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP34:%.*]] = bitcast i32* [[RHS_BEGIN]] to i8* 1603d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP34]], i8** [[TMP33]], align 4 1604d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP35:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1605d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP36:%.*]] = load i32, i32* [[TMP35]], align 4 1606d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP37:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8* 1607d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP38:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP36]], i32 1, i32 4, i8* [[TMP37]], void (i8*, i8*)* @.omp.reduction.reduction_func.6, [8 x i32]* @.gomp_critical_user_.reduction.var) 1608d04d9220SAlexey Bataev // CHECK2-NEXT: switch i32 [[TMP38]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 1609d04d9220SAlexey Bataev // CHECK2-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 1610d04d9220SAlexey Bataev // CHECK2-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 1611d04d9220SAlexey Bataev // CHECK2-NEXT: ] 1612d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case1: 1613d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP39:%.*]] = getelementptr i32, i32* [[ARRAYIDX]], i32 3 1614d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq i32* [[ARRAYIDX]], [[TMP39]] 1615d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE13:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 1616d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.body: 1617d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi i32* [ [[RHS_BEGIN]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1618d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST9:%.*]] = phi i32* [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT11:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1619d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP40:%.*]] = load i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST9]], align 4 1620d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP41:%.*]] = load i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 4 1621d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD10:%.*]] = add nsw i32 [[TMP40]], [[TMP41]] 1622d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD10]], i32* [[OMP_ARRAYCPY_DESTELEMENTPAST9]], align 4 1623d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT11]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST9]], i32 1 1624d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 1625d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE12:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT11]], [[TMP39]] 1626d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE12]], label [[OMP_ARRAYCPY_DONE13]], label [[OMP_ARRAYCPY_BODY]] 1627d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.done13: 1628d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP36]], [8 x i32]* @.gomp_critical_user_.reduction.var) 1629d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1630d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case2: 1631d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP42:%.*]] = getelementptr i32, i32* [[ARRAYIDX]], i32 3 1632d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY14:%.*]] = icmp eq i32* [[ARRAYIDX]], [[TMP42]] 1633d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY14]], label [[OMP_ARRAYCPY_DONE21:%.*]], label [[OMP_ARRAYCPY_BODY15:%.*]] 1634d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.body15: 1635d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST16:%.*]] = phi i32* [ [[RHS_BEGIN]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT19:%.*]], [[OMP_ARRAYCPY_BODY15]] ] 1636d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST17:%.*]] = phi i32* [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT18:%.*]], [[OMP_ARRAYCPY_BODY15]] ] 1637d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP43:%.*]] = load i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST16]], align 4 1638d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP44:%.*]] = atomicrmw add i32* [[OMP_ARRAYCPY_DESTELEMENTPAST17]], i32 [[TMP43]] monotonic, align 4 1639d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT18]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST17]], i32 1 1640d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT19]] = getelementptr i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST16]], i32 1 1641d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE20:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT18]], [[TMP42]] 1642d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE20]], label [[OMP_ARRAYCPY_DONE21]], label [[OMP_ARRAYCPY_BODY15]] 1643d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.done21: 1644d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1645d04d9220SAlexey Bataev // CHECK2: .omp.reduction.default: 1646d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1647d04d9220SAlexey Bataev // 1648d04d9220SAlexey Bataev // 1649d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..4 1650d04d9220SAlexey Bataev // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[DOTPREVIOUS_LB_:%.*]], i32 noundef [[DOTPREVIOUS_UB_:%.*]], i32 noundef [[SIZE:%.*]], i32* noundef [[OUTPUT:%.*]], i32* noundef [[INPUT:%.*]]) #[[ATTR1]] { 1651d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1652d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4 1653d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4 1654d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTPREVIOUS_LB__ADDR:%.*]] = alloca i32, align 4 1655d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTPREVIOUS_UB__ADDR:%.*]] = alloca i32, align 4 1656d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 1657d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT_ADDR:%.*]] = alloca i32*, align 4 1658d04d9220SAlexey Bataev // CHECK2-NEXT: [[INPUT_ADDR:%.*]] = alloca i32*, align 4 1659d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_IV:%.*]] = alloca i32, align 4 1660d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP:%.*]] = alloca i32, align 4 1661d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_:%.*]] = alloca i32, align 4 1662d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTCAPTURE_EXPR_1:%.*]] = alloca i32, align 4 1663d04d9220SAlexey Bataev // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 1664d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_LB:%.*]] = alloca i32, align 4 1665d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_UB:%.*]] = alloca i32, align 4 1666d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_STRIDE:%.*]] = alloca i32, align 4 1667d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_IS_LAST:%.*]] = alloca i32, align 4 1668d04d9220SAlexey Bataev // CHECK2-NEXT: [[OUTPUT4:%.*]] = alloca [3 x i32], align 4 1669d04d9220SAlexey Bataev // CHECK2-NEXT: [[_TMP5:%.*]] = alloca i32*, align 4 1670d04d9220SAlexey Bataev // CHECK2-NEXT: [[I6:%.*]] = alloca i32, align 4 1671d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 4 1672d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4 1673d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4 1674d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[DOTPREVIOUS_LB_]], i32* [[DOTPREVIOUS_LB__ADDR]], align 4 1675d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[DOTPREVIOUS_UB_]], i32* [[DOTPREVIOUS_UB__ADDR]], align 4 1676d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 1677d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[OUTPUT]], i32** [[OUTPUT_ADDR]], align 4 1678d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[INPUT]], i32** [[INPUT_ADDR]], align 4 1679d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1680d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP0]], i32* [[DOTCAPTURE_EXPR_]], align 4 1681d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 1682d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB:%.*]] = sub nsw i32 [[TMP1]], 0 1683d04d9220SAlexey Bataev // CHECK2-NEXT: [[DIV:%.*]] = sdiv i32 [[SUB]], 1 1684d04d9220SAlexey Bataev // CHECK2-NEXT: [[SUB2:%.*]] = sub nsw i32 [[DIV]], 1 1685d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SUB2]], i32* [[DOTCAPTURE_EXPR_1]], align 4 1686d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[I]], align 4 1687d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_]], align 4 1688d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP:%.*]] = icmp slt i32 0, [[TMP2]] 1689d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP]], label [[OMP_PRECOND_THEN:%.*]], label [[OMP_PRECOND_END:%.*]] 1690d04d9220SAlexey Bataev // CHECK2: omp.precond.then: 1691d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_LB]], align 4 1692d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 1693d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP3]], i32* [[DOTOMP_UB]], align 4 1694d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = load i32, i32* [[DOTPREVIOUS_LB__ADDR]], align 4 1695d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = load i32, i32* [[DOTPREVIOUS_UB__ADDR]], align 4 1696d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP4]], i32* [[DOTOMP_LB]], align 4 1697d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP5]], i32* [[DOTOMP_UB]], align 4 1698d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 1, i32* [[DOTOMP_STRIDE]], align 4 1699d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[DOTOMP_IS_LAST]], align 4 1700d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1701d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, i32* [[TMP6]], i32 0 1702d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1703d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, i32* [[TMP7]], i32 2 1704d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [3 x i32], [3 x i32]* [[OUTPUT4]], i32 0, i32 0 1705d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = getelementptr i32, i32* [[ARRAY_BEGIN]], i32 3 1706d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq i32* [[ARRAY_BEGIN]], [[TMP8]] 1707d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]] 1708d04d9220SAlexey Bataev // CHECK2: omp.arrayinit.body: 1709d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi i32* [ [[ARRAY_BEGIN]], [[OMP_PRECOND_THEN]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ] 1710d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4 1711d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 1712d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP8]] 1713d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]] 1714d04d9220SAlexey Bataev // CHECK2: omp.arrayinit.done: 1715d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = load i32*, i32** [[OUTPUT_ADDR]], align 4 1716d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = ptrtoint i32* [[TMP9]] to i64 1717d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = ptrtoint i32* [[ARRAYIDX]] to i64 1718d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = sub i64 [[TMP10]], [[TMP11]] 1719d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = sdiv exact i64 [[TMP12]], ptrtoint (i32* getelementptr (i32, i32* null, i32 1) to i64) 1720d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP14:%.*]] = bitcast [3 x i32]* [[OUTPUT4]] to i32* 1721d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP15:%.*]] = getelementptr i32, i32* [[TMP14]], i64 [[TMP13]] 1722d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[TMP15]], i32** [[_TMP5]], align 4 1723d04d9220SAlexey Bataev // CHECK2-NEXT: [[RHS_BEGIN:%.*]] = bitcast [3 x i32]* [[OUTPUT4]] to i32* 1724d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP16:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1725d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP17:%.*]] = load i32, i32* [[TMP16]], align 4 1726d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_for_static_init_4(%struct.ident_t* @[[GLOB2]], i32 [[TMP17]], i32 34, i32* [[DOTOMP_IS_LAST]], i32* [[DOTOMP_LB]], i32* [[DOTOMP_UB]], i32* [[DOTOMP_STRIDE]], i32 1, i32 1) 1727d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP18:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 1728d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP19:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 1729d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP7:%.*]] = icmp sgt i32 [[TMP18]], [[TMP19]] 1730d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP7]], label [[COND_TRUE:%.*]], label [[COND_FALSE:%.*]] 1731d04d9220SAlexey Bataev // CHECK2: cond.true: 1732d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP20:%.*]] = load i32, i32* [[DOTCAPTURE_EXPR_1]], align 4 1733d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[COND_END:%.*]] 1734d04d9220SAlexey Bataev // CHECK2: cond.false: 1735d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP21:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 1736d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[COND_END]] 1737d04d9220SAlexey Bataev // CHECK2: cond.end: 1738d04d9220SAlexey Bataev // CHECK2-NEXT: [[COND:%.*]] = phi i32 [ [[TMP20]], [[COND_TRUE]] ], [ [[TMP21]], [[COND_FALSE]] ] 1739d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[COND]], i32* [[DOTOMP_UB]], align 4 1740d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP22:%.*]] = load i32, i32* [[DOTOMP_LB]], align 4 1741d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP22]], i32* [[DOTOMP_IV]], align 4 1742d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND:%.*]] 1743d04d9220SAlexey Bataev // CHECK2: omp.inner.for.cond: 1744d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP23:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1745d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP24:%.*]] = load i32, i32* [[DOTOMP_UB]], align 4 1746d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP8:%.*]] = icmp sle i32 [[TMP23]], [[TMP24]] 1747d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP8]], label [[OMP_INNER_FOR_BODY:%.*]], label [[OMP_INNER_FOR_END:%.*]] 1748d04d9220SAlexey Bataev // CHECK2: omp.inner.for.body: 1749d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP25:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1750d04d9220SAlexey Bataev // CHECK2-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP25]], 1 1751d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 0, [[MUL]] 1752d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[I6]], align 4 1753d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP26:%.*]] = load i32*, i32** [[INPUT_ADDR]], align 4 1754d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP27:%.*]] = load i32, i32* [[I6]], align 4 1755d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds i32, i32* [[TMP26]], i32 [[TMP27]] 1756d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP28:%.*]] = load i32, i32* [[ARRAYIDX9]], align 4 1757d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP29:%.*]] = load i32*, i32** [[_TMP5]], align 4 1758d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX10:%.*]] = getelementptr inbounds i32, i32* [[TMP29]], i32 0 1759d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP30:%.*]] = load i32, i32* [[ARRAYIDX10]], align 4 1760d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD11:%.*]] = add nsw i32 [[TMP30]], [[TMP28]] 1761d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD11]], i32* [[ARRAYIDX10]], align 4 1762d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_BODY_CONTINUE:%.*]] 1763d04d9220SAlexey Bataev // CHECK2: omp.body.continue: 1764d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_INC:%.*]] 1765d04d9220SAlexey Bataev // CHECK2: omp.inner.for.inc: 1766d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP31:%.*]] = load i32, i32* [[DOTOMP_IV]], align 4 1767d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD12:%.*]] = add nsw i32 [[TMP31]], 1 1768d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD12]], i32* [[DOTOMP_IV]], align 4 1769d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_INNER_FOR_COND]] 1770d04d9220SAlexey Bataev // CHECK2: omp.inner.for.end: 1771d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_LOOP_EXIT:%.*]] 1772d04d9220SAlexey Bataev // CHECK2: omp.loop.exit: 1773d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP32:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1774d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP33:%.*]] = load i32, i32* [[TMP32]], align 4 1775d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_for_static_fini(%struct.ident_t* @[[GLOB1]], i32 [[TMP33]]) 1776d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP34:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 0 1777d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP35:%.*]] = bitcast i32* [[RHS_BEGIN]] to i8* 1778d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP35]], i8** [[TMP34]], align 4 1779d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP36:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1780d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP37:%.*]] = load i32, i32* [[TMP36]], align 4 1781d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP38:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8* 1782d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP39:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP37]], i32 1, i32 4, i8* [[TMP38]], void (i8*, i8*)* @.omp.reduction.reduction_func.5, [8 x i32]* @.gomp_critical_user_.reduction.var) 1783d04d9220SAlexey Bataev // CHECK2-NEXT: switch i32 [[TMP39]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 1784d04d9220SAlexey Bataev // CHECK2-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 1785d04d9220SAlexey Bataev // CHECK2-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 1786d04d9220SAlexey Bataev // CHECK2-NEXT: ] 1787d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case1: 1788d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP40:%.*]] = getelementptr i32, i32* [[ARRAYIDX]], i32 3 1789d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq i32* [[ARRAYIDX]], [[TMP40]] 1790d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE17:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 1791d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.body: 1792d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi i32* [ [[RHS_BEGIN]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1793d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST13:%.*]] = phi i32* [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT15:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1794d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP41:%.*]] = load i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST13]], align 4 1795d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP42:%.*]] = load i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 4 1796d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD14:%.*]] = add nsw i32 [[TMP41]], [[TMP42]] 1797d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD14]], i32* [[OMP_ARRAYCPY_DESTELEMENTPAST13]], align 4 1798d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT15]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST13]], i32 1 1799d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 1800d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE16:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT15]], [[TMP40]] 1801d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE16]], label [[OMP_ARRAYCPY_DONE17]], label [[OMP_ARRAYCPY_BODY]] 1802d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.done17: 1803d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP37]], [8 x i32]* @.gomp_critical_user_.reduction.var) 1804d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1805d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case2: 1806d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP43:%.*]] = getelementptr i32, i32* [[ARRAYIDX]], i32 3 1807d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY18:%.*]] = icmp eq i32* [[ARRAYIDX]], [[TMP43]] 1808d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY18]], label [[OMP_ARRAYCPY_DONE25:%.*]], label [[OMP_ARRAYCPY_BODY19:%.*]] 1809d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.body19: 1810d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST20:%.*]] = phi i32* [ [[RHS_BEGIN]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT23:%.*]], [[OMP_ARRAYCPY_BODY19]] ] 1811d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST21:%.*]] = phi i32* [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT22:%.*]], [[OMP_ARRAYCPY_BODY19]] ] 1812d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP44:%.*]] = load i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST20]], align 4 1813d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP45:%.*]] = atomicrmw add i32* [[OMP_ARRAYCPY_DESTELEMENTPAST21]], i32 [[TMP44]] monotonic, align 4 1814d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT22]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST21]], i32 1 1815d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT23]] = getelementptr i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST20]], i32 1 1816d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE24:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT22]], [[TMP43]] 1817d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE24]], label [[OMP_ARRAYCPY_DONE25]], label [[OMP_ARRAYCPY_BODY19]] 1818d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.done25: 1819d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1820d04d9220SAlexey Bataev // CHECK2: .omp.reduction.default: 1821d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[OMP_PRECOND_END]] 1822d04d9220SAlexey Bataev // CHECK2: omp.precond.end: 1823d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1824d04d9220SAlexey Bataev // 1825d04d9220SAlexey Bataev // 1826d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.5 1827d04d9220SAlexey Bataev // CHECK2-SAME: (i8* noundef [[TMP0:%.*]], i8* noundef [[TMP1:%.*]]) #[[ATTR3]] { 1828d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1829d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 4 1830d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 4 1831d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 4 1832d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 4 1833d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 4 1834d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]* 1835d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 4 1836d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]* 1837d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i32 0, i32 0 1838d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 4 1839d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32* 1840d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i32 0, i32 0 1841d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 4 1842d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32* 1843d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = getelementptr i32, i32* [[TMP11]], i32 3 1844d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq i32* [[TMP11]], [[TMP12]] 1845d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 1846d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.body: 1847d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi i32* [ [[TMP8]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1848d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi i32* [ [[TMP11]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1849d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4 1850d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 4 1851d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP13]], [[TMP14]] 1852d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4 1853d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 1854d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 1855d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP12]] 1856d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]] 1857d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.done2: 1858d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1859d04d9220SAlexey Bataev // 1860d04d9220SAlexey Bataev // 1861d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.6 1862d04d9220SAlexey Bataev // CHECK2-SAME: (i8* noundef [[TMP0:%.*]], i8* noundef [[TMP1:%.*]]) #[[ATTR3]] { 1863d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1864d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 4 1865d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 4 1866d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 4 1867d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 4 1868d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 4 1869d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]* 1870d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 4 1871d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]* 1872d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i32 0, i32 0 1873d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 4 1874d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32* 1875d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i32 0, i32 0 1876d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 4 1877d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32* 1878d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = getelementptr i32, i32* [[TMP11]], i32 3 1879d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq i32* [[TMP11]], [[TMP12]] 1880d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 1881d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.body: 1882d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi i32* [ [[TMP8]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1883d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi i32* [ [[TMP11]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1884d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4 1885d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 4 1886d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP13]], [[TMP14]] 1887d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4 1888d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 1889d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 1890d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP12]] 1891d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]] 1892d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.done2: 1893d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1894d04d9220SAlexey Bataev // 1895d04d9220SAlexey Bataev // 1896d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l78 1897d04d9220SAlexey Bataev // CHECK2-SAME: (i32 noundef [[SIZE:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR6:[0-9]+]] { 1898d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1899d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 1900d04d9220SAlexey Bataev // CHECK2-NEXT: [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4 1901d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_CASTED:%.*]] = alloca i32, align 4 1902d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 1903d04d9220SAlexey Bataev // CHECK2-NEXT: store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4 1904d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4 1905d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1906d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP1]], i32* [[SIZE_CASTED]], align 4 1907d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[SIZE_CASTED]], align 4 1908d04d9220SAlexey Bataev // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB4]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, [10 x i32]*)* @.omp_outlined..9 to void (i32*, i32*, ...)*), i32 [[TMP2]], [10 x i32]* [[TMP0]]) 1909d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 1910d04d9220SAlexey Bataev // 1911d04d9220SAlexey Bataev // 1912d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..9 1913d04d9220SAlexey Bataev // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[SIZE:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR1]] { 1914d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 1915d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4 1916d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4 1917d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 1918d04d9220SAlexey Bataev // CHECK2-NEXT: [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4 1919d04d9220SAlexey Bataev // CHECK2-NEXT: [[A2:%.*]] = alloca [2 x i32], align 4 1920d04d9220SAlexey Bataev // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 1921d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 4 1922d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4 1923d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4 1924d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 1925d04d9220SAlexey Bataev // CHECK2-NEXT: store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4 1926d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4 1927d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 0 1928d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX1:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 1 1929d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAY_BEGIN:%.*]] = getelementptr inbounds [2 x i32], [2 x i32]* [[A2]], i32 0, i32 0 1930d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = getelementptr i32, i32* [[ARRAY_BEGIN]], i32 2 1931d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYINIT_ISEMPTY:%.*]] = icmp eq i32* [[ARRAY_BEGIN]], [[TMP1]] 1932d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYINIT_ISEMPTY]], label [[OMP_ARRAYINIT_DONE:%.*]], label [[OMP_ARRAYINIT_BODY:%.*]] 1933d04d9220SAlexey Bataev // CHECK2: omp.arrayinit.body: 1934d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi i32* [ [[ARRAY_BEGIN]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYINIT_BODY]] ] 1935d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4 1936d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 1937d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP1]] 1938d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYINIT_DONE]], label [[OMP_ARRAYINIT_BODY]] 1939d04d9220SAlexey Bataev // CHECK2: omp.arrayinit.done: 1940d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = bitcast [10 x i32]* [[TMP0]] to i32* 1941d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = ptrtoint i32* [[TMP2]] to i64 1942d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = ptrtoint i32* [[ARRAYIDX]] to i64 1943d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = sub i64 [[TMP3]], [[TMP4]] 1944d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = sdiv exact i64 [[TMP5]], ptrtoint (i32* getelementptr (i32, i32* null, i32 1) to i64) 1945d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = bitcast [2 x i32]* [[A2]] to i32* 1946d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = getelementptr i32, i32* [[TMP7]], i64 [[TMP6]] 1947d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = bitcast i32* [[TMP8]] to [10 x i32]* 1948d04d9220SAlexey Bataev // CHECK2-NEXT: [[RHS_BEGIN:%.*]] = bitcast [2 x i32]* [[A2]] to i32* 1949d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[I]], align 4 1950d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[FOR_COND:%.*]] 1951d04d9220SAlexey Bataev // CHECK2: for.cond: 1952d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = load i32, i32* [[I]], align 4 1953d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 1954d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP10]], [[TMP11]] 1955d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 1956d04d9220SAlexey Bataev // CHECK2: for.body: 1957d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[FOR_INC:%.*]] 1958d04d9220SAlexey Bataev // CHECK2: for.inc: 1959d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = load i32, i32* [[I]], align 4 1960d04d9220SAlexey Bataev // CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP12]], 1 1961d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[INC]], i32* [[I]], align 4 1962d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP10:![0-9]+]] 1963d04d9220SAlexey Bataev // CHECK2: for.end: 1964d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 0 1965d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP14:%.*]] = bitcast i32* [[RHS_BEGIN]] to i8* 1966d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP14]], i8** [[TMP13]], align 4 1967d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP15:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 1968d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP16:%.*]] = load i32, i32* [[TMP15]], align 4 1969d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP17:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8* 1970d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP18:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP16]], i32 1, i32 4, i8* [[TMP17]], void (i8*, i8*)* @.omp.reduction.reduction_func.10, [8 x i32]* @.gomp_critical_user_.reduction.var) 1971d04d9220SAlexey Bataev // CHECK2-NEXT: switch i32 [[TMP18]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 1972d04d9220SAlexey Bataev // CHECK2-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 1973d04d9220SAlexey Bataev // CHECK2-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 1974d04d9220SAlexey Bataev // CHECK2-NEXT: ] 1975d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case1: 1976d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP19:%.*]] = getelementptr i32, i32* [[ARRAYIDX]], i32 2 1977d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq i32* [[ARRAYIDX]], [[TMP19]] 1978d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE6:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 1979d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.body: 1980d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi i32* [ [[RHS_BEGIN]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1981d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST3:%.*]] = phi i32* [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE1]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT4:%.*]], [[OMP_ARRAYCPY_BODY]] ] 1982d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP20:%.*]] = load i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST3]], align 4 1983d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP21:%.*]] = load i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 4 1984d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP20]], [[TMP21]] 1985d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[OMP_ARRAYCPY_DESTELEMENTPAST3]], align 4 1986d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT4]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST3]], i32 1 1987d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 1988d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE5:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT4]], [[TMP19]] 1989d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE5]], label [[OMP_ARRAYCPY_DONE6]], label [[OMP_ARRAYCPY_BODY]] 1990d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.done6: 1991d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP16]], [8 x i32]* @.gomp_critical_user_.reduction.var) 1992d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 1993d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case2: 1994d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP22:%.*]] = getelementptr i32, i32* [[ARRAYIDX]], i32 2 1995d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY7:%.*]] = icmp eq i32* [[ARRAYIDX]], [[TMP22]] 1996d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY7]], label [[OMP_ARRAYCPY_DONE14:%.*]], label [[OMP_ARRAYCPY_BODY8:%.*]] 1997d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.body8: 1998d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST9:%.*]] = phi i32* [ [[RHS_BEGIN]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT12:%.*]], [[OMP_ARRAYCPY_BODY8]] ] 1999d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST10:%.*]] = phi i32* [ [[ARRAYIDX]], [[DOTOMP_REDUCTION_CASE2]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT11:%.*]], [[OMP_ARRAYCPY_BODY8]] ] 2000d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP23:%.*]] = load i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST9]], align 4 2001d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP24:%.*]] = atomicrmw add i32* [[OMP_ARRAYCPY_DESTELEMENTPAST10]], i32 [[TMP23]] monotonic, align 4 2002d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT11]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST10]], i32 1 2003d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT12]] = getelementptr i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST9]], i32 1 2004d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE13:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT11]], [[TMP22]] 2005d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE13]], label [[OMP_ARRAYCPY_DONE14]], label [[OMP_ARRAYCPY_BODY8]] 2006d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.done14: 2007d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 2008d04d9220SAlexey Bataev // CHECK2: .omp.reduction.default: 2009d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 2010d04d9220SAlexey Bataev // 2011d04d9220SAlexey Bataev // 2012d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.10 2013d04d9220SAlexey Bataev // CHECK2-SAME: (i8* noundef [[TMP0:%.*]], i8* noundef [[TMP1:%.*]]) #[[ATTR3]] { 2014d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 2015d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 4 2016d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 4 2017d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 4 2018d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 4 2019d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 4 2020d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]* 2021d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 4 2022d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]* 2023d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i32 0, i32 0 2024d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 4 2025d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32* 2026d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i32 0, i32 0 2027d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 4 2028d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32* 2029d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = getelementptr i32, i32* [[TMP11]], i32 2 2030d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_ISEMPTY:%.*]] = icmp eq i32* [[TMP11]], [[TMP12]] 2031d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_ISEMPTY]], label [[OMP_ARRAYCPY_DONE2:%.*]], label [[OMP_ARRAYCPY_BODY:%.*]] 2032d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.body: 2033d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRCELEMENTPAST:%.*]] = phi i32* [ [[TMP8]], [[ENTRY:%.*]] ], [ [[OMP_ARRAYCPY_SRC_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 2034d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DESTELEMENTPAST:%.*]] = phi i32* [ [[TMP11]], [[ENTRY]] ], [ [[OMP_ARRAYCPY_DEST_ELEMENT:%.*]], [[OMP_ARRAYCPY_BODY]] ] 2035d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4 2036d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], align 4 2037d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP13]], [[TMP14]] 2038d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], align 4 2039d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DEST_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_DESTELEMENTPAST]], i32 1 2040d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_SRC_ELEMENT]] = getelementptr i32, i32* [[OMP_ARRAYCPY_SRCELEMENTPAST]], i32 1 2041d04d9220SAlexey Bataev // CHECK2-NEXT: [[OMP_ARRAYCPY_DONE:%.*]] = icmp eq i32* [[OMP_ARRAYCPY_DEST_ELEMENT]], [[TMP12]] 2042d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[OMP_ARRAYCPY_DONE]], label [[OMP_ARRAYCPY_DONE2]], label [[OMP_ARRAYCPY_BODY]] 2043d04d9220SAlexey Bataev // CHECK2: omp.arraycpy.done2: 2044d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 2045d04d9220SAlexey Bataev // 2046d04d9220SAlexey Bataev // 2047d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}__Z3sumPiiS__l81 2048d04d9220SAlexey Bataev // CHECK2-SAME: (i32 noundef [[SIZE:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR6]] { 2049d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 2050d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 2051d04d9220SAlexey Bataev // CHECK2-NEXT: [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4 2052d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_CASTED:%.*]] = alloca i32, align 4 2053d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 2054d04d9220SAlexey Bataev // CHECK2-NEXT: store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4 2055d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4 2056d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 2057d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[TMP1]], i32* [[SIZE_CASTED]], align 4 2058d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i32, i32* [[SIZE_CASTED]], align 4 2059d04d9220SAlexey Bataev // CHECK2-NEXT: call void (%struct.ident_t*, i32, void (i32*, i32*, ...)*, ...) @__kmpc_fork_call(%struct.ident_t* @[[GLOB4]], i32 2, void (i32*, i32*, ...)* bitcast (void (i32*, i32*, i32, [10 x i32]*)* @.omp_outlined..13 to void (i32*, i32*, ...)*), i32 [[TMP2]], [10 x i32]* [[TMP0]]) 2060d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 2061d04d9220SAlexey Bataev // 2062d04d9220SAlexey Bataev // 2063d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp_outlined..13 2064d04d9220SAlexey Bataev // CHECK2-SAME: (i32* noalias noundef [[DOTGLOBAL_TID_:%.*]], i32* noalias noundef [[DOTBOUND_TID_:%.*]], i32 noundef [[SIZE:%.*]], [10 x i32]* noundef nonnull align 4 dereferenceable(40) [[A:%.*]]) #[[ATTR1]] { 2065d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 2066d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTGLOBAL_TID__ADDR:%.*]] = alloca i32*, align 4 2067d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTBOUND_TID__ADDR:%.*]] = alloca i32*, align 4 2068d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE_ADDR:%.*]] = alloca i32, align 4 2069d04d9220SAlexey Bataev // CHECK2-NEXT: [[A_ADDR:%.*]] = alloca [10 x i32]*, align 4 2070d04d9220SAlexey Bataev // CHECK2-NEXT: [[A1:%.*]] = alloca i32, align 4 2071d04d9220SAlexey Bataev // CHECK2-NEXT: [[I:%.*]] = alloca i32, align 4 2072d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTOMP_REDUCTION_RED_LIST:%.*]] = alloca [1 x i8*], align 4 2073d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTGLOBAL_TID_]], i32** [[DOTGLOBAL_TID__ADDR]], align 4 2074d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[DOTBOUND_TID_]], i32** [[DOTBOUND_TID__ADDR]], align 4 2075d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[SIZE]], i32* [[SIZE_ADDR]], align 4 2076d04d9220SAlexey Bataev // CHECK2-NEXT: store [10 x i32]* [[A]], [10 x i32]** [[A_ADDR]], align 4 2077d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = load [10 x i32]*, [10 x i32]** [[A_ADDR]], align 4 2078d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[TMP0]], i32 0, i32 3 2079d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[A1]], align 4 2080d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = bitcast [10 x i32]* [[TMP0]] to i32* 2081d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = ptrtoint i32* [[TMP1]] to i64 2082d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = ptrtoint i32* [[ARRAYIDX]] to i64 2083d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = sub i64 [[TMP2]], [[TMP3]] 2084d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = sdiv exact i64 [[TMP4]], ptrtoint (i32* getelementptr (i32, i32* null, i32 1) to i64) 2085d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr i32, i32* [[A1]], i64 [[TMP5]] 2086d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = bitcast i32* [[TMP6]] to [10 x i32]* 2087d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[I]], align 4 2088d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[FOR_COND:%.*]] 2089d04d9220SAlexey Bataev // CHECK2: for.cond: 2090d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = load i32, i32* [[I]], align 4 2091d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = load i32, i32* [[SIZE_ADDR]], align 4 2092d04d9220SAlexey Bataev // CHECK2-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP8]], [[TMP9]] 2093d04d9220SAlexey Bataev // CHECK2-NEXT: br i1 [[CMP]], label [[FOR_BODY:%.*]], label [[FOR_END:%.*]] 2094d04d9220SAlexey Bataev // CHECK2: for.body: 2095d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[FOR_INC:%.*]] 2096d04d9220SAlexey Bataev // CHECK2: for.inc: 2097d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = load i32, i32* [[I]], align 4 2098d04d9220SAlexey Bataev // CHECK2-NEXT: [[INC:%.*]] = add nsw i32 [[TMP10]], 1 2099d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[INC]], i32* [[I]], align 4 2100d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[FOR_COND]], !llvm.loop [[LOOP12:![0-9]+]] 2101d04d9220SAlexey Bataev // CHECK2: for.end: 2102d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]], i32 0, i32 0 2103d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = bitcast i32* [[A1]] to i8* 2104d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP12]], i8** [[TMP11]], align 4 2105d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = load i32*, i32** [[DOTGLOBAL_TID__ADDR]], align 4 2106d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP14:%.*]] = load i32, i32* [[TMP13]], align 4 2107d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP15:%.*]] = bitcast [1 x i8*]* [[DOTOMP_REDUCTION_RED_LIST]] to i8* 2108d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP16:%.*]] = call i32 @__kmpc_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], i32 1, i32 4, i8* [[TMP15]], void (i8*, i8*)* @.omp.reduction.reduction_func.14, [8 x i32]* @.gomp_critical_user_.reduction.var) 2109d04d9220SAlexey Bataev // CHECK2-NEXT: switch i32 [[TMP16]], label [[DOTOMP_REDUCTION_DEFAULT:%.*]] [ 2110d04d9220SAlexey Bataev // CHECK2-NEXT: i32 1, label [[DOTOMP_REDUCTION_CASE1:%.*]] 2111d04d9220SAlexey Bataev // CHECK2-NEXT: i32 2, label [[DOTOMP_REDUCTION_CASE2:%.*]] 2112d04d9220SAlexey Bataev // CHECK2-NEXT: ] 2113d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case1: 2114d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP17:%.*]] = load i32, i32* [[ARRAYIDX]], align 4 2115d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP18:%.*]] = load i32, i32* [[A1]], align 4 2116d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP17]], [[TMP18]] 2117d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[ARRAYIDX]], align 4 2118d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__kmpc_end_reduce_nowait(%struct.ident_t* @[[GLOB3]], i32 [[TMP14]], [8 x i32]* @.gomp_critical_user_.reduction.var) 2119d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 2120d04d9220SAlexey Bataev // CHECK2: .omp.reduction.case2: 2121d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP19:%.*]] = load i32, i32* [[A1]], align 4 2122d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP20:%.*]] = atomicrmw add i32* [[ARRAYIDX]], i32 [[TMP19]] monotonic, align 4 2123d04d9220SAlexey Bataev // CHECK2-NEXT: br label [[DOTOMP_REDUCTION_DEFAULT]] 2124d04d9220SAlexey Bataev // CHECK2: .omp.reduction.default: 2125d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 2126d04d9220SAlexey Bataev // 2127d04d9220SAlexey Bataev // 2128d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp.reduction.reduction_func.14 2129d04d9220SAlexey Bataev // CHECK2-SAME: (i8* noundef [[TMP0:%.*]], i8* noundef [[TMP1:%.*]]) #[[ATTR3]] { 2130d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 2131d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR:%.*]] = alloca i8*, align 4 2132d04d9220SAlexey Bataev // CHECK2-NEXT: [[DOTADDR1:%.*]] = alloca i8*, align 4 2133d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP0]], i8** [[DOTADDR]], align 4 2134d04d9220SAlexey Bataev // CHECK2-NEXT: store i8* [[TMP1]], i8** [[DOTADDR1]], align 4 2135d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP2:%.*]] = load i8*, i8** [[DOTADDR]], align 4 2136d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP3:%.*]] = bitcast i8* [[TMP2]] to [1 x i8*]* 2137d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP4:%.*]] = load i8*, i8** [[DOTADDR1]], align 4 2138d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP5:%.*]] = bitcast i8* [[TMP4]] to [1 x i8*]* 2139d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP6:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP5]], i32 0, i32 0 2140d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP7:%.*]] = load i8*, i8** [[TMP6]], align 4 2141d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP8:%.*]] = bitcast i8* [[TMP7]] to i32* 2142d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP9:%.*]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[TMP3]], i32 0, i32 0 2143d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP10:%.*]] = load i8*, i8** [[TMP9]], align 4 2144d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP11:%.*]] = bitcast i8* [[TMP10]] to i32* 2145d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP12:%.*]] = load i32, i32* [[TMP11]], align 4 2146d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP13:%.*]] = load i32, i32* [[TMP8]], align 4 2147d04d9220SAlexey Bataev // CHECK2-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP12]], [[TMP13]] 2148d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 [[ADD]], i32* [[TMP11]], align 4 2149d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 2150d04d9220SAlexey Bataev // 2151d04d9220SAlexey Bataev // 2152d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@main 2153d04d9220SAlexey Bataev // CHECK2-SAME: () #[[ATTR7:[0-9]+]] { 2154d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 2155d04d9220SAlexey Bataev // CHECK2-NEXT: [[RETVAL:%.*]] = alloca i32, align 4 2156d04d9220SAlexey Bataev // CHECK2-NEXT: [[SIZE:%.*]] = alloca i32, align 4 2157d04d9220SAlexey Bataev // CHECK2-NEXT: [[ARRAY:%.*]] = alloca i32*, align 4 2158d04d9220SAlexey Bataev // CHECK2-NEXT: [[RESULT:%.*]] = alloca i32, align 4 2159d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[RETVAL]], align 4 2160d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 100, i32* [[SIZE]], align 4 2161d04d9220SAlexey Bataev // CHECK2-NEXT: [[CALL:%.*]] = call noalias noundef nonnull i8* @_Znaj(i32 noundef 400) #[[ATTR10:[0-9]+]] 2162d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP0:%.*]] = bitcast i8* [[CALL]] to i32* 2163d04d9220SAlexey Bataev // CHECK2-NEXT: store i32* [[TMP0]], i32** [[ARRAY]], align 4 2164d04d9220SAlexey Bataev // CHECK2-NEXT: store i32 0, i32* [[RESULT]], align 4 2165d04d9220SAlexey Bataev // CHECK2-NEXT: [[TMP1:%.*]] = load i32*, i32** [[ARRAY]], align 4 2166d04d9220SAlexey Bataev // CHECK2-NEXT: call void @_Z3sumPiiS_(i32* noundef [[TMP1]], i32 noundef 100, i32* noundef [[RESULT]]) 2167d04d9220SAlexey Bataev // CHECK2-NEXT: ret i32 0 2168d04d9220SAlexey Bataev // 2169d04d9220SAlexey Bataev // 2170d04d9220SAlexey Bataev // CHECK2-LABEL: define {{[^@]+}}@.omp_offloading.requires_reg 2171d04d9220SAlexey Bataev // CHECK2-SAME: () #[[ATTR9:[0-9]+]] { 2172d04d9220SAlexey Bataev // CHECK2-NEXT: entry: 2173d04d9220SAlexey Bataev // CHECK2-NEXT: call void @__tgt_register_requires(i64 1) 2174d04d9220SAlexey Bataev // CHECK2-NEXT: ret void 2175d04d9220SAlexey Bataev // 2176